当前位置: 首页 > news >正文

30.安卓逆向2-frida hook技术-hook So文件(获取app加载的所有模块、导入函数、导出函数、hook SO函数)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

工具下载:

链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89

提取码:zy89

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:29.安卓逆向2-frida hook技术-逆向os文件(二)IDA工具下载和使用

如下图现在有一个nativeSum的c代码

然后使用ida反编译它的so文件,然后搜索nativeMessage方法

然后开始Frida hook So代码

Module.findExportByName(moduleName, exportName) 通过模块名称和导出函数名查找在内存中加载的模块,并返回导出函数的地址。

Module.getExportByName(moduleName, exportName) 通过模块名称和导出函数名获取导出函数的地址但是如果找不到指定的导出函数则会返回null。

Module.findBaseAddress(moduleName) 通过模块名称查找在内存中加载的模块,并返回模块的基址

Interceptor.attach(target, callbacks) 对目标函数进行拦截,并在函数执行前后调用相应回调函数

Interceptor.replace(target, replacement)替换目标函数的实现,将重定向到自定义的替代函数。

Memory.readPointer(address) 读取指定内存地址处的指针值。

Memory.writePointer(address, value) 向指定内存地址写入指针值。

Memory.readByteArray(address, length) 读取指定内存地址处的字节数组。

Memory.writeByteArray(address, data) 向指定内存地址写入字节数组。

Memory.protect(address, size, prot) 修改指定内存范围的保护属性,如可读、可写、可执行等

导出所有模块

function 导出模块(){var module = Process.enumerateModules();for(var i = 0; i < module.length; i++){console.log(module[i].name);// 模块名}
}
导出模块();

查找某个搜文件,打印地址和名字

function 导出模块(){var module = Process.enumerateModules();for(var i = 0; i < module.length; i++){if(module[i].name == "libnative-lib.so"){console.log(module[i].base);// 模块地址console.log(module[i].name);// 模块名}}
}
导出模块();

可以看到一个app的运行会加载很多模块,

可以看到我们自己写的 libnative-lib 模块,还可以看到 frida 的模块

列出所有导入函数(导入函数是So文件所依赖的其它So文件(库文件)中的函数)

function 导入函数(){var imports = Module.enumerateImports("libnative-lib.so");for(var i = 0; i < imports.length; i++){console.log(JSON.stringify(imports[i]));console.log(imports[i].address);}
}
导入函数()

列出所有导出函数(导出之后可以给别的模块使用)

下方是导出所有

function 导出函数(){var exports = Module.enumerateExports("libnative-lib.so");for(var i = 0; i < exports.length; i++){console.log(JSON.stringify(exports[i]));console.log(exports[i].address);}
}
导出函数()

导出java的jni函数(不管谁写的,只要用了jni它就会以java开头,这是写jni的规定,也就是说自己写的so文件里的函数就会以java开头)

function 导出函数(){var Exports = Module.enumerateExports("libnative-lib.so");for(var i = 0; i < Exports.length; i++){// 只要以java开头的就是jni的函数if(Exports[i].name.includes("Java")){console.log(JSON.stringify(Exports[i]));}}
}
导出函数()

hook so方法,需要先得到方法的地址上图中可以得到,下面用另一种方式得到

function hookSo函数(){/*** findExportByName函数用来在指定so文件中查找一个函数的地址* libnative-lib.so 文件名* Java_com_luoge_com_MainActivity_nativeMessage so文件中的函数名*/var addr = Module.findExportByName("libnative-lib.so","Java_com_luoge_com_MainActivity_nativeMessage");console.log(addr);Interceptor.attach(addr,{// 函数执行前onEnter: function(args){console.log("函数调用");},// 函数执行后onLeave: function(retval){console.log("函数返回:", retval);}})}
hookSo函数();

可以看到它返回的不是中文,它是一个地址

我们的so返回的是,是一个String类型,需要处理一下

如下图代码,强制转成 java.lang.String

function hookSo函数(){/*** findExportByName函数用来在指定so文件中查找一个函数的地址* libnative-lib.so 文件名* Java_com_luoge_com_MainActivity_nativeMessage so文件中的函数名*/var addr = Module.findExportByName("libnative-lib.so","Java_com_luoge_com_MainActivity_nativeMessage");console.log(addr);Interceptor.attach(addr,{// 函数执行前onEnter: function(args){console.log("函数调用");},// 函数执行后onLeave: function(retval){console.log("函数返回:", retval);// 强制转成 Stringvar strres = Java.cast(retval, Java.use("java.lang.String"))console.log(strres);}})}
hookSo函数();

然后就可以了


img


文章转载自:
http://aftersound.tmizpp.cn
http://certainly.tmizpp.cn
http://actively.tmizpp.cn
http://chabuk.tmizpp.cn
http://appreciative.tmizpp.cn
http://bemused.tmizpp.cn
http://chapelgoer.tmizpp.cn
http://chirrup.tmizpp.cn
http://amateurism.tmizpp.cn
http://burthen.tmizpp.cn
http://christendom.tmizpp.cn
http://aftermarket.tmizpp.cn
http://adjudicative.tmizpp.cn
http://aisle.tmizpp.cn
http://acclivitous.tmizpp.cn
http://avion.tmizpp.cn
http://baroceptor.tmizpp.cn
http://balloon.tmizpp.cn
http://burdensome.tmizpp.cn
http://breezily.tmizpp.cn
http://buckskin.tmizpp.cn
http://ahd.tmizpp.cn
http://artifacts.tmizpp.cn
http://adsorbent.tmizpp.cn
http://backwardation.tmizpp.cn
http://calamint.tmizpp.cn
http://brad.tmizpp.cn
http://battleplane.tmizpp.cn
http://cassocked.tmizpp.cn
http://antimacassar.tmizpp.cn
http://www.dtcms.com/a/281711.html

相关文章:

  • 区块链发展史全景长图
  • 强化学习Reinforcement Learning
  • 基于Python的图像文字识别系统
  • Glide双内存缓存加载机制详细介绍
  • K型热电偶电动势以及温度对照表
  • 驱动开发系列61- Vulkan 驱动实现-SPIRV到HW指令的实现过程(2)
  • [Science]论文 视黄素与细胞修复
  • 2025-07-15通过边缘线检测图像里的主体有没有出血
  • IMU 能为无人机提供什么数据?
  • 【论文阅读】A Survey on Knowledge-Oriented Retrieval-Augmented Generation(3)
  • 移动端字体适配
  • 谷歌浏览器控制台如何切换中文
  • StampedLock分析
  • 链表的 哑结点的本质
  • Python 程序设计讲义(1):PyCharm 安装教程
  • WebView JSBridge 无响应问题排查实录 全流程定位桥接调用失效
  • 深度学习·目标检测和语义分割基础
  • 77、【OS】【Nuttx】【启动】caller-saved 和 callee-saved 示例:栈指针和帧指针(上)
  • Qt图形视图框架5-状态机框架
  • Springboot儿童认知图文辅助系统6yhkv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 再见吧,Windows自带记事本,这个轻量级文本编辑器太香了
  • 基于mybatis的基础操作的思路
  • C++-linux系统编程 8.进程(二)exec函数族详解
  • 终端安全管理系统为什么需要使用,企业需要的桌面管理软件
  • X 射线探伤证考试核心:辐射安全基础知识点梳理
  • golang二级缓存示例
  • HC165并转串
  • js分支语句和循环语句
  • 如何写一份有效的技术简历?
  • vscode输出中文乱码问题的解决