FRIDA高级API实用方法:Frida Hook Java(2)
Frida Hook Java
Frida spawn启动app,Hook System类
Frida spawn启动app
有时候app启动好后,我们需要Hook的地方流程就已经结束了,所以我们需要用spawn来启动app,在app启动时就把Hook脚本注入到进程
frida -U --no-pause -f com.tlamb96.spetsnazmessenger -l hook.js
-U
指USB连接的物理设备--no-pause:
默认情况下,Frida 在注入脚本后会暂停目标进程,需手动恢复(如调用resume()
)。此参数让应用在注入后 立即自动运行,无需手动干预。-f
:启动(spawn)一个新的目标进程-l
:指定要注入的脚本
hook System:
var System = Java.use("java.lang.System");
1 | var System = Java.use("java.lang.System"); |
Hook构造函数
hook 构造函数:
this.$init(i, str, str2, z);
1 | var a = Java.use("com.tlamb96.kgbmessenger.b.a"); |
打印调用栈,new一个实例与销毁
打印调用栈:
Frida并不自带打印调用栈的API,但可以通过调用java本身的代码打印调用栈
在java中打印调用栈:通过主动抛出一个异常,然后给异常打印它的调用栈
new一个Exception的实例:
.$new("print_stack")
,里边的print_stack是随便取的获取调用栈:
.getStackTrace()
,安卓自带的把实例的对象析构掉:
instance.$dispose();
1 | function print_stack() { |
动态加载自己的dex并使用
动态加载自己的dex:
- 运行写好的java程序生成.class文件
- 生成jar文件:
jar -cvf ddex.jar com/example/androiddemo/DecodeUtils.class
- 使用dx将jar转dex文件:
/Android/sdk/build-tools/28.0.3/dx --dex --output=ddex.dex ddex.jar
- push到
/data/local/tmp/
里,chmod 777
加权限 - 一般在最前面加载,以保证后面可以使用:
var ddex2 = Java.openClassFile("/data/local/tmp/ddex2.dex");
ddex2.load();
- 调用我们自己的dex中的方法:
var DecodeUtils = Java.use("com.example.androiddemo.DecodeUtils");
,DecodeUtils.decode_p()
,DecodeUtils.r_to_hex()
1 | /* |
Hook.js完整代码
1 | function hook_java() { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elliot-Lin!