[学习记录]frida hook java层和native层方法
1.hook java层方法前置的环境安装环境略过,看参考文档
代码如下,自己学习,所有就比较简单了。
hook的js代码
实际步骤:
1.连接设备,获取对应app数据
2.加载js代码
3.发送代码给设备上的server端
4.执行代码
5.代码hook到对应函数,修改返回值
2.hook native层方法
js 代码和so文件中的函数如下
实际步骤:
1.前面操作与java一致
2.代码执行步骤:1.获取对应so文件对象(实际上就是获取地址)
2.onEnter 是修改参数的,本次没有
3.onLeave 是修改返回值,返回值是一个字符串,所以需要创建一个“字符串",这个字符串不能直接使用双引号去填写。只能使用env把字符串改变成so文件可以执行的字符串类型,或用类似方法。
4.使用replace()替换字符串。
遇到的问题:
在hook native层的时候遇到了两个问题,花了很久时间(实际就是自己太菜{:1_926:})。
第一个问题:一直出现报错 expected a pointer
自己最开始并不知道哪里出现了问题,是查看了资料之后发现findExportByNaem参数是需要寻找SO文件地址。
于是使用Module.findBaseAddress("libjnipro.so");函数获取地址验证是否可以获取到。发现frida读取内存获取SO文件一直为null.
虽然找到了报错原因,但是一直不知道这么解决。
省略N个错误尝试。:'(weeqw
最后发现我使用雷电模拟器 其中使用的frida server是x86框架编译。
而app包体只有arm编译SO文件。
于是我修改了Android Studio 上的编译框架,加入x86。
就没有出现这个问题了。
备注:demo是自己编写的是可以这样修改,若是其他人的包体,遇到这个问题,可以尝试修改server版本或者换模拟器/真机吧。
第二个问题:虽然可以读取到SO文件了,但是使用replace("123466") 替换返回值出现报错。报错信息忘了。。{:1_907:}
上网查看了一些资料和教程,基本都是用replace替换int类型,但我需要替换字符串类型。
最后是想到了so文件数据类型和上层语音的数据类型不一致(差别很大,java,js,python与底层的类型都不一样)。
后续才查找到frida 中Java.vm.getEnv()方法。
听风没有雨 发表于 2021-3-26 09:44
frida 实现原理是什么?
原理你得看源码了,主要看frida-server的源码,工作过程就是PC端发送js代码到设备端的server去运行。
就是一个客户端一个服务器端一样。
具体的我也不知道。帮助文档好像也没说具体的底层原理。 jinhu702 发表于 2021-3-22 15:26
frida无法hookso层,只能是dex的,对于x86,模拟器的 支持不了,那个大佬有解决方案么
雷电模拟器4可以,看这篇文章https://blog.csdn.net/lyshark_lyshark/article/details/125848267 图片没了。。。我去,不过那个部分比较简单,没了就没了。
再加一个参考文档
https://www.52pojie.cn/thread-1128884-1-1.html frida无法hookso层,只能是dex的,对于x86,模拟器的 支持不了,那个大佬有解决方案么 666666666 66666666666 mark备用,感谢分享 感谢分享,学到了 frida 实现原理是什么? jinhu702 发表于 2021-3-22 15:26
frida无法hookso层,只能是dex的,对于x86,模拟器的 支持不了,那个大佬有解决方案么
上面不是有说嘛。用真机呗,或者换个模拟器,我用雷电是可以使用X86的。
页:
[1]
2