Frida hook Java层常用操作:六个实战模板
Frida 是安卓逆向最常用的工具。这篇讲 Java 层 hook 的常用操作。一、环境准备
[*]手机装 frida-server,版本要跟 PC 端 frida-tools 一致
[*]PC 装 frida-tools:pip install frida-tools
[*]确认连接:frida-ps -U 能列出手机进程
二、hook 普通方法
Java.perform(function() {
var cls = Java.use("com.target.Util");
cls.encrypt.implementation = function(input) {
console.log("encrypt input: " + input);
var ret = this.encrypt(input);
console.log("encrypt output: " + ret);
return ret;
};
});
三、hook 重载方法
方法有多个重载时,要指定参数类型:
cls.login.overload('java.lang.String', 'java.lang.String').implementation = function(u, p) {
console.log("login: " + u + ", " + p);
return this.login(u, p);
};
四、hook 构造函数
cls.$init.overload('java.lang.String').implementation = function(arg) {
console.log("构造函数参数: " + arg);
this.$init(arg);
};
五、hook 动态加载的类
用 ClassLoader 等类加载后再 hook:
Java.enumerateClassLoaders({
onMatch: function(loader) {
try {
var factory = Java.ClassFactory.get(loader);
var cls = factory.use("com.target.Dynamic");
cls.secret.implementation = function() {
console.log("hooked dynamic class");
return this.secret();
};
} catch(e) {}
},
onComplete: function() {}
});
六、主动调用方法
不 hook,直接调目标方法:
Java.perform(function() {
var cls = Java.use("com.target.Util");
var instance = cls.$new();
var result = instance.encrypt("test");
console.log("主动调用结果: " + result);
});
七、常见技巧
[*]frida-trace 自动追踪所有方法:frida-trace -U -f com.target.app -j '*'
[*]用 spawn 模式启动 App:frida -U -f com.target.app --no-pause,能在 App 启动前就 hook
[*]hook native 层用 Interceptor.attach,跟 Java 层语法不同
https://www.metk.cn/img/posts/frida_hook_java.jpg 感谢分享,之前一直卡在这个点,看完豁然开朗。 楼主的排版可以再优化下,代码块用起来会更清楚。 这个流程我在真机上验证过,确实可行,注意备份就行。 这篇干货,比那些只有命令没有解释的强太多了。 这个方法我用过,确实可行,不过新一点的版本已经加了检测。 这个思路让我想到另一个场景,回头试试能不能套用。 同意楼主的判断,现在加固手段越来越多,纯手工成本太高了。 照着试了一下,第一遍没成功,发现是权限问题,建议楼主补充个提示。 想请教一下,你用的这个版本是哪个?我这边跑起来报错。