unidbg 入门(一)

本文介绍了如何使用unidbg库来模拟调用安卓应用程序中的JNI方法,包括不同参数类型如无参、int类型、byte数组等,并展示了具体代码示例,涉及静态和非静态方法的调用。此外,还强调了byte数组参数的传递方式。
摘要由CSDN通过智能技术生成

1 学习内容


1.1:调用native方法

        1.1 .1使用方法:callStaticJniMethodObject

        1.1.2 先new出对象再调用方法callJniMethodObject

1.2:传不同的参数:

        1.2.1  调用无参函数

       1.2.2  int类型参数

       1. 2.3  btye数组类型参数

        1.2.4  多个String类型的参数

       

2 代码如下


2.1:so文件在附件中,下载

2.2:安卓代码

package com.example.jnitest4.jni;

import android.content.Context;

public class JniManager {
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
    public native String str2str(String org,String append);
    /**
     * 获取uuid字符串
     * @param type
     * @return
     */
    public native String uuid(int type);

    /**
     * 加密
     *
     * @param msg  原始字符串
     * @param type 加密的方式
     * @return 加密后的数据
     */
    public native String encode(String msg, int type);
    /**
     * 解密
     *
     * @param msg  解密前的 字符串
     * @param type 解密的方式
     * @return 解密后的数据
     */
    public native String decode(String msg, int type);




    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    /**
     * SHA1签名    --失败
     *
     * @param src
     * @return
     */
    public native String encodeBySHA1(byte[] src);

    /**
     * SHA224签名
     *
     * @param src
     * @return
     */
    public native String encodeBySHA224(byte[] src);

    /**
     * SHA384签名
     *
     * @param src
     * @return
     */
    public native String encodeBySHA256(byte[] src);

    /**
     * SHA256签名
     *
     * @param src
     * @return
     */
    public native String encodeBySHA384(byte[] src);

    /**
     * SHA512签名
     *
     * @param src
     * @return
     */
    public native String encodeBySHA512(byte[] src);

    /**
     * AES加密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] encodeByAES(byte[] keys, byte[] src);

    /**
     * AES解密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] decodeByAES(byte[] keys, byte[] src);

    /**
     * RSA公钥加密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] encodeByRSAPubKey(byte[] keys, byte[] src);

    /**
     * RSA私钥解密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] decodeByRSAPrivateKey(byte[] keys, byte[] src);

    /**
     * RSA私钥加密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] encodeByRSAPrivateKey(byte[] keys, byte[] src);

    /**
     * RSA公钥解密
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] decodeByRSAPubKey(byte[] keys, byte[] src);

    /**
     * RSA私钥签名
     *
     * @param keys
     * @param src
     * @return
     */
    public native byte[] signByRSAPrivateKey(byte[] keys, byte[] src);

    /**
     * RSA公钥验证签名 (未测试)
     *
     * @param keys
     * @param src
     * @param sign
     * @return 1:验证成功
     */
    public native int verifyByRSAPubKey(byte[] keys, byte[] src, byte[] sign);

    /**
     * 异或加解密
     *
     * @param src
     * @return
     */
    public native byte[] xOr(byte[] src);

    /**
     * MD5编码
     *
     * @param src
     * @return 默认小写
     */
    public native String md5(byte[] src);


    /**
     * HmacSHA1签名
     *
     * @param context
     * @param src
     * @return
     */
    public native byte[] encodeByHmacSHA1(Context context, byte[] src);

    /**
     * 获取apk-sha1
     *
     * @param context
     * @return
     */
    public native String sha1OfApk(Context context);

    /**
     * 校验apk签名是否有效(未验证)
     *
     * @param context
     * @return
     */
    public native boolean verifySha1OfApk(Context context);


    /**
     * 字节测试用例
     * @param bytes
     * @return
     */
    public native byte[] byteTestFn(byte[] bytes) ;

}

2.3:unidbg实现代码

package com.jni4;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.DalvikModule;
import com.github.unidbg.linux.android.dvm.DvmClass;
import com.github.unidbg.linux.android.dvm.DvmObject;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.linux.android.dvm.jni.ProxyClassFactory;
import com.github.unidbg.memory.Memory;

import java.io.File;
import java.io.IOException;

public class JniManagerUtil {

    private final AndroidEmulator emulator;

    private final DvmClass jniManagerUtil;
    private final VM vm;

    public JniManagerUtil() {
        emulator = AndroidEmulatorBuilder.for64Bit()
                .setProcessName("com.example.jnitest4")
                .build();
        Memory memory = emulator.getMemory();
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM();
        vm.setDvmClassFactory(new ProxyClassFactory());
        vm.setVerbose(false);
        DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/jnitest4/libnative-lib.so"), false);
        jniManagerUtil = vm.resolveClass("com/example/jnitest4/jni/JniManager");
        dm.callJNI_OnLoad(emulator);
    }

    public void destroy() throws IOException {
        emulator.close();
    }

    /**
     * 这里有个问题是使用callStaticJniMethodObject还是callJniMethodObject
     */
    public void stringFromJNI(){
        String methodStringFromJNI = "stringFromJNI()Ljava/lang/String;";

        DvmObject<?> strRc =  jniManagerUtil.callStaticJniMethodObject(emulator, methodStringFromJNI);
        System.out.println("stringFromJNI返回值:"+strRc.getValue());
    }

    /**
     * 这个例子的重点是参数是int类型,对应的参数类型标识为I
     */
    public void UUIDTest(){
        String methodStringFromJNI = "uuid(I)Ljava/lang/String;";
        int paramInt = 15;
        DvmObject<?> strRc =  jniManagerUtil.callStaticJniMethodObject(emulator, methodStringFromJNI,paramInt);
        System.out.println("UUIDTest返回值:"+strRc.getValue());
    }

    //    public native String str2str(String org,String append);
    public void str2strTest(){
        String methodStringFromJNI = "str2str(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;";
        String paramString0 = "hello ";
        String paramString1 = "mr wang";
        DvmObject<?> strRc =  jniManagerUtil.callStaticJniMethodObject(emulator, methodStringFromJNI,paramString0,paramString1);
        System.out.println("str2strTest返回值:"+strRc.getValue());
    }

    public void encode(){
        String methodStringFromJNI = "encode(Ljava/lang/String;I;)Ljava/lang/String;";
        String paramString0 = "hello ";
        int paramString1 = 20;
        DvmObject<?> strRc =  jniManagerUtil.callStaticJniMethodObject(emulator, methodStringFromJNI,paramString0,paramString1);
        System.out.println("encode返回值:"+strRc.getValue());
    }

    /**
     * 学习重点:
     *  1:这里重点是参数是byte数组,学习byte数组如何传参。
     *  2:调用方法采用先new一个对象,然后再调用非静态方法来调用。
     */
    public void encodeBySHA1(){
        String methodStringFromJNI = "encodeBySHA1(B[;)Ljava/lang/String;";
        String paramString0 = "99999 ";
//  方法1
//        DvmObject<?> strRc =  jniManagerUtil.callStaticJniMethodObject(emulator, methodStringFromJNI,paramString0.getBytes());
//   方法2:
        DvmObject<?> strRc =  jniManagerUtil.newObject(null).callJniMethodObject(emulator, methodStringFromJNI,paramString0.getBytes());
        System.out.println("encodeBySHA1返回值:"+strRc.getValue());
    }



    public static void main(String[] args) throws Exception {
        JniManagerUtil jniManagerUtil = new JniManagerUtil();
        jniManagerUtil.stringFromJNI();
        jniManagerUtil.UUIDTest();
        jniManagerUtil.str2strTest();
        jniManagerUtil.encode();
        jniManagerUtil.encodeBySHA1();
        jniManagerUtil.destroy();
    }

}

 3 其他


   3.1:使用unidbg时的参数类型如何定义的,可以参考文章


unidbg是一个针对Android系统的动态二进制分析工具,它能够模拟和分析Android应用程序的执行过程。该工具利用了QEMU和Unicorn模拟器的特性,通过对虚拟机进行操控,实现对Android应用程序的脱壳、动态调试、动态修改等功能。 与传统的静态分析工具相比,unidbg具有很多优势。首先,unidbg采用动态分析的方式进行分析,能够绕过代码的混淆和加密,对于那些使用加密算法进行保护的应用程序也能有效地进行分析。其次,unidbg不需要对应用程序进行重新编译,能够直接加载原始二进制文件进行执行,节省了分析时间和资源。此外,unidbg可以模拟各种硬件平台和系统版本,方便进行兼容性和兼容性测试。 而xhs指的是小红书应用,是一款流行的社交媒体应用程序,用户可以在其中分享生活中的照片、美食、旅行等内容,并与其他用户进行互动和交流。 结合上述两个概念,如果要使用unidbg分析小红书应用(xhs),可以通过以下步骤进行: 1. 在模拟器或真机环境中安装unidbg工具,并准备好相应的系统库和插件。 2. 将小红书应用程序的安装包导入到模拟器或真机环境中。 3. 使用unidbg命令行工具或API,加载小红书应用程序的二进制文件,并开始动态分析。 4. 在动态分析过程中,可以对小红书应用程序进行脱壳、hook函数、修改数据等操作,以获取目标应用程序的内部逻辑和敏感数据。 5. 通过观察和分析unidbg的执行日志,可以获取关键信息,如函数调用堆栈、内存读写等,进一步研究和理解小红书应用程序的工作原理。 综上所述,unidbg工具可以作为一种有效的动态分析工具,用于分析小红书应用程序和其他Android应用程序的执行过程,帮助开发者进行bug修复、反编译分析、代码优化和安全评估等工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值