【Android逆向】frida hook so 函数

android,逆向,frida,hook,so,函数 · 浏览次数 : 420

小编点评

## Summary of the content This content describes a Java program that uses Frida to remotely call a native method named `sayHello4` in a C++ library. **Steps involved:** 1. **APK download and decompilation:** - The program downloads an APK from the given link. - It then decompresses the APK and extracts the so file (app-debug.apk3). 2. **Using JniTest library:** - The program finds the base address of the JniTest library. - It then retrieves the addresses of the `Java_com_jwxdxnx06_myJNI_sayHello` method and the `__fastcall Java_com_jwxdxnx06_myJNI_sayHello` function. 3. **Hooking the function:** - An interceptor is set to hook the `Java_com_jwxdxnx06_myJNI_sayHello` function. - The interceptor receives the function arguments and returns a modified return value. 4. **Executing the function:** - The program retrieves the return value from the hooked function. - It prints the returned string to the console. 5. **Running Frida script:** - The program starts a Frida server and runs the script named "lesson04.js". - This script uses Frida to connect to the server and execute the `sayHello4` method. - The script captures the return value and prints it to the console. **Key points:** - The program uses Frida to dynamically load and execute code from an APK. - It hooks the `Java_com_jwxdxnx06_myJNI_sayHello` method to modify the return value. - Frida server is used to execute the script and capture the return value. **Additional notes:** - The content mentions the library name as "JniTest", but it is not defined anywhere in the code. - The specific method signature and return type may vary depending on the actual library implementation.

正文

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

与【Android逆向】frida hook so 函数相似的内容:

【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. 用j

【Android逆向】frida 破解 jwxdxnx02.apk

apk 路径: https://pan.baidu.com/s/1cUInoi 密码:07p9 这题比较简单,主要是用于练习frida 1. 安装apk到手机 需要输入账号密码 2. 使用jdax 查看apk package hfdcxy.com.myapplication; import andr

[Android 逆向]frida 破解 切水果大战原版.apk

1. 手机安装该apk,运行,点击右上角礼物 提示 支付失败,请稍后重试 2. apk拖入到jadx中,待加载完毕后,搜素失败,找到疑似目标类MymmPay的关键方法payResultFalse 4. adb logcat 或者androidstudio 查看该进程的日志,发现以下日志 com.mf

【Android逆向】frida 破解 滚动的天空

1. apk 安装到手机中 2. 玩十次之后,会提示 充值 3. adb shell dumpsys window | grep mCurrentFocus 查看一些当前activity是哪一个 是 AppActivity 4. 阅读代码,感觉是unity3d做的游戏 5. apk拖入到jadx中,

【Android逆向】Frida 无脑暴力破解看雪test2.apk

1. 安装apk到手机 adb install -t test2.apk apk下载位置: https://www.kanxue.com/work-task_read-800625.htm 2. 题目提示输入一个五位的数字,那么可以尝试暴力破解 3. apk拖入到jadx中可以看到 public c

【Android 逆向】frida 检测绕过

1. aaa.apk 安装到手机,是一个叫玩吧的应用 ./hooker ...... 23248 浏 览 器 com.browser2345_oem 32541 玩吧 com.wodi.who 2447 电话和短信存储 com.android.providers.telephony 2447 电话服

【Android逆向】静态分析+frida破解test2.apk

有了上一篇的基础 https://www.cnblogs.com/gradyblog/p/17152108.html 现在尝试静态分析的方式来处理 为什么还要多此一举,因为题眼告诉了我们是五位数字,所以可以爆破,不告诉这个题眼的话,就得分析 1. IDA 打开libroysue.so,查看JNI_O

【Android逆向】脱壳项目frida_dump 原理分析

脱dex核心文件dump_dex.js 核心函数 function dump_dex() { var libart = Process.findModuleByName("libart.so"); var addr_DefineClass = null; var symbols = libart.e

【Android逆向】脱壳项目 frida-dexdump 原理分析

1. 项目代码地址 https://github.com/hluwa/frida-dexdump 2. 核心逻辑为 def dump(self): logger.info("[+] Searching...") st = time.time() ranges = self.agent.search_

[Android逆向]Exposed 破解 jwxdxnx02.apk

使用exposed 遇到了一些坑,这里记录一下 源码: package com.example.exposedlesson01; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.X