【Android逆向】frida hook so 函数

1. apk来自52pojie

链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an

2.apktool反编译apk,拿到so文件

java -jar ../apktool_2.2.4.jar d app-debug.apk

3. 用jadx 打开apk文件,观察到apk调用了一个native方法com.jwxdxnx06.myJNI.sayHello

4. ida 打开so文件,在导出函数表中可以看到这个对应的静态注册的函数

jstring __fastcall Java_com_jwxdxnx06_myJNI_sayHello(JNIEnv *env)
{
  return (*env)->NewStringUTF(env, "hello 52pojie!");
}

5. 编写frida脚本,主动调用这个函数

function main() {
    Java.perform(function () {

        var libJniTest_addr = Module.findBaseAddress("libJniTest.so")
        console.log("libJniTest 地址:", libJniTest_addr);

        if (libJniTest_addr) {
            var func_sayHello_addr = Module.findExportByName("libJniTest.so", "Java_com_jwxdxnx06_myJNI_sayHello");
            console.log("Java_com_jwxdxnx06_myJNI_sayHello 地址:", func_sayHello_addr);
                    
            // 主动调用
            //创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
            var func = new NativeFunction(func_sayHello_addr, 'pointer', ['pointer'])
			// 通过Java.vm获得env
            var retVal = func(Java.vm.getEnv())
            var ret = Java.vm.getEnv().getStringUtfChars(retVal, null).readCString();
            console.log(ret)
            
        }
    })

}

setTimeout(main)

5. 尝试hook函数,改变函数的输出

function main() {
    Java.perform(function () {

        var libJniTest_addr = Module.findBaseAddress("libJniTest.so")
        console.log("libJniTest 地址:", libJniTest_addr);

        if (libJniTest_addr) {
            var func_sayHello_addr = Module.findExportByName("libJniTest.so", "Java_com_jwxdxnx06_myJNI_sayHello");
            console.log("Java_com_jwxdxnx06_myJNI_sayHello 地址:", func_sayHello_addr);
        	//hook
            Interceptor.attach(func_sayHello_addr, {
                onEnter: function(args) {
                    var env = args[0];
                    console.log("=== env: " + env)
                },
                onLeave: function(retVal) {
                    console.log("=== retVal: " + retVal)
                    var j_str = Java.vm.getEnv().newStringUtf("helloworld123")
                    retVal.replace(ptr(j_str))
                }
            })

            // 主动调用
            //创建新函数,参数1:函数地址,参数2:返回值类型,参数3:函数参数类型
            var func = new NativeFunction(func_sayHello_addr, 'pointer', ['pointer'])
            var retVal = func(Java.vm.getEnv())
            var ret = Java.vm.getEnv().getStringUtfChars(retVal, null).readCString();
            console.log(ret)
        }

    })

}

setTimeout(main)

6. 执行命令

frida -UF com.jwxdxnx06 -l lesson04.js --no-pause

日志

libJniTest 地址: 0xc73c3000
Java_com_jwxdxnx06_myJNI_sayHello 地址: 0xc73c3c5d
=== env: 0xdc411c40
=== retVal: 0x9
helloworld123
posted @ 2023-02-18 15:40  明月照江江  阅读(893)  评论(0编辑  收藏  举报