664 字
3 分钟
Frida hook笔记 use与choose
Java.use vs Java.choose
Java.use 和 Java.choose 是 Frida 中两个核心的 Java API,但它们的用途和工作方式截然不同:
1. Java.use:获取类引用(静态方式)
功能
- 直接通过类名获取 Java 类的引用,用于 hook 类的方法 或 创建实例。
- 类似 Java 中的
Class.forName(),但功能更强大。
用法
// 获取类引用let TargetClass = Java.use("com.example.TargetClass");
// Hook 静态方法TargetClass.staticMethod.implementation = function () { /* ... */};
// 创建实例let instance = TargetClass.$new();
// Hook 实例方法instance.instanceMethod.implementation = function () { /* ... */};限制
- 必须知道类名:无法处理混淆后的类名(如
a.a.c)。 - 无法遍历对象实例:只能操作类本身,不能获取内存中已存在的实例。
2. Java.choose:遍历对象实例(动态方式)
功能
- 遍历内存中所有已创建的实例,并对每个实例执行回调。
- 适用于:
- 查找特定对象(如单例)。
- 分析对象状态。
- hook 特定实例的方法。
用法
Java.choose("com.example.TargetClass", { // 找到每个实例时执行 onMatch: function (instance) { console.log("[+] 找到实例: " + instance);
// Hook 实例方法 instance.someMethod.implementation = function () { console.log("[*] 拦截到方法调用"); return this.someMethod(); }; },
// 遍历完成后执行 onComplete: function () { console.log("遍历完成"); },});优势
- 无需知道实例创建逻辑:即使对象通过复杂逻辑创建(如单例),也能直接 hook。
- 支持通配符:可使用
Java.choose("*", ...)遍历所有类的实例。
3. 核心区别
| 特性 | Java.use | Java.choose |
|---|---|---|
| 操作对象 | 类(Class) | 类的实例(Instance) |
| 使用场景 | 已知类名,需 hook 方法或创建实例 | 需查找 / 操作内存中的对象实例 |
| 是否需要实例化 | 需要手动 $new() | 自动遍历已存在的实例 |
| 混淆处理 | 不支持(必须知道原始类名) | 支持(可结合 enumerateLoadedClasses) |
| 示例 | let clazz = Java.use("A"); | Java.choose("A", { onMatch... }); |
4. 结合使用示例
当类名被混淆时,可以先通过 enumerateLoadedClasses 找到类名,再用 Java.use 或 Java.choose 操作:
// 1. 查找包含特定方法的类Java.enumerateLoadedClasses({ onMatch: function (className) { try { let clazz = Java.use(className); if (clazz.someMethod) { console.log("[+] 找到目标类: " + className);
// 2. 方法一:使用 Java.use 直接 hook 类 clazz.someMethod.implementation = function () { /* ... */ };
// 2. 方法二:使用 Java.choose 遍历实例 Java.choose(className, { onMatch: function (instance) { /* ... */ }, onComplete: function () {}, }); } } catch (e) {} }, onComplete: function () {},});总结
Java.use:适合静态 hook 已知类的方法,或创建新实例。Java.choose:适合动态查找和操作内存中的对象实例,尤其是单例或难以直接获取的对象。
在实际应用中,两者通常结合使用,先定位类,再选择合适的方式 hook 方法或操作实例。
Frida hook笔记 use与choose
https://fuwari.vercel.app/posts/frida-hook笔记-use与choose/