You need to enable JavaScript to run this app. 如何使用Frida hook Android SO库中的非导出native函数?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Frida hook Android SO库中的非导出native函数?

Native层非导出函数Hook方案

非导出函数不会在so的ELF动态符号表中留存符号信息,无法直接通过函数名定位,需要通过基地址+静态偏移的方式计算出函数实际内存地址后再进行Hook,具体操作步骤如下:

  • 第一步:获取目标函数的静态偏移
    在Ghidra中打开目标.so文件,定位到你需要Hook的非导出函数,记录该函数相对于so文件起始地址的静态偏移值。
  • 第二步:获取目标so运行时的加载基地址
    待应用启动、目标so加载完成后,读取/proc/<应用进程PID>/maps文件,筛选出目标so对应的内存段,段起始地址就是so的加载基地址。你也可以直接用Frida的Module.findBaseAddress("libxxx.so")接口直接获取基地址。
  • 第三步:计算函数实际运行地址
    函数实际内存地址 = so加载基地址 + 静态偏移

    注意:ARM32架构下如果目标是Thumb指令集函数,地址最后一位需要补1,否则会触发指令集适配错误导致崩溃。

  • 第四步:执行Hook
    拿到目标函数的内存地址后,直接将地址传入Hook框架即可,以Frida为例,示例代码如下:
    // 替换为你的目标so名称
    const libBase = Module.findBaseAddress("libtest.so");
    // 替换为你拿到的静态偏移值
    const targetFunc = libBase.add(0x2F3A8);
    // 对目标地址执行Hook
    Interceptor.attach(targetFunc, {
        onEnter(args) {
            console.log("目标函数被调用,参数1:" + args[0]);
        },
        onLeave(retval) {
            console.log("目标函数返回值:" + retval);
        }
    })
    

注意事项

  • 如果目标应用存在so动态解密、加固、反调试等防护,需要先绕过对应防护,确保你拿到的基地址对应解密后的so内存段,偏移计算准确。
  • 目标so版本更新后,函数的静态偏移会发生变化,需要重新在逆向工具中确认新的偏移值。
  • 使用其他Hook框架(如YAHFA、SandHook、Substrate等)时,逻辑完全一致,只需要将计算得到的函数地址传入框架的Hook接口即可。

内容的提问来源于stack exchange,提问作者ahmed mani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 21:27:04