如何使用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
相关产品推荐
相关产品推荐

