Frida-Labs-Java层操作指南
字数 1612 2025-08-29 22:41:24
Frida Labs Java层操作指南
一、Frida基础使用
1. Java.perform函数
Java.perform(function() {
// 你的代码
});
- 固定写法,确保脚本在Java虚拟机准备好后运行
- 避免"Java is not available"错误
- 创建特殊上下文,使脚本能与Android应用中的Java代码交互
2. 获取类引用
var classRef = Java.use("package.name.class");
- 获取要Hook的Java类的引用
package.name.class是完整类名,如com.example.app.LoginManager- 后续可通过该引用访问类中的方法和属性
3. Hook方法实现
classRef.methodToHook.implementation = function(args) {
// 自定义逻辑
};
- 重写类中某个方法的实现
methodToHook是要Hook的方法名args是方法参数列表- 函数体内的逻辑会替换原方法实现
二、Frida Labs实战案例
0x1 Hook修改方法逻辑/返回值/参数
场景:使用随机数判断输入,满足表达式则打印flag
两种思路:
- Hook
get_random函数,固定返回值 - Hook
check函数,直接传入自定义值
常见错误:
- 缺少
-U:未连接到Android模拟器 - 缺少
-f:找不到指定进程(Failed to spawn: unable to find process with name...)
0x2 调用未被调用的静态方法
问题:setImmediate(main)可能导致hook失败
解决方案:
- 使用
setTimeout(main, 1000)延迟注入 - 确保应用完全启动后再注入
注意:直接使用包名注入(frida com.ad2001.frida0x2)可能失败,因为:
- 默认是spawn模式,缺少
-f参数 - 不是attach模式
0x3 修改静态变量
关键概念:
a:Frida创建的Java类代理对象,用于操作类a.code.value:访问并修改类中code静态字段的值a.$new():创建类的新实例
示例:
var a = Java.use("com.ad2001.frida0x3.Checker");
a.code.value = 123; // 修改静态变量
0x4 调用非MainActivity的非静态方法
步骤:
- 实例化目标类
- 调用目标方法
示例:
Java.perform(function() {
var check = Java.use("com.ad2001.frida0x4.Check");
var checker = check.$new(); // 创建实例
console.log(checker.get_flag()); // 调用实例方法
});
0x5 调用MainActivity的非静态方法
挑战:直接创建MainActivity实例不可行
原因:
- Activity需要上下文(Context)才能工作
- UI操作必须在主线程(带Looper)执行
- Activity生命周期由系统管理
解决方案:获取系统已创建的MainActivity实例
模板:
Java.perform(function() {
Java.choose("com.ad2001.frida0x5.MainActivity", {
onMatch: function(instance) {
// instance是已存在的MainActivity实例
console.log(instance.flag());
},
onComplete: function() {
console.log("end");
}
});
});
注意:立即注入可能导致hook失败,解决方案同0x2
0x6 综合案例
场景:
- MainActivity中的非静态方法
get_flag - 参数通过Checker类对象传递
解决方案:结合0x3、0x4、0x5的技术
- 创建Checker类实例
- 修改实例变量
- 获取MainActivity实例
- 调用
get_flag方法并传入Checker实例
0x7 Hook构造函数
构造函数:Java类中初始化对象属性的特殊方法
Frida中使用$init关键字hook构造函数:
var Checker = Java.use("com.ad2001.frida0x7.Checker");
Checker.$init.implementation = function(a, b) {
this.$init(123, 321); // 修改构造参数
};
常见错误:
cannot read property 'overload' of undefined:方法未找到Cannot access an instance field without an instance:尝试直接访问实例字段
三、最佳实践
- 注入时机:使用
setTimeout延迟注入,避免应用未完全启动 - 错误处理:检查类和方法是否存在再操作
- 实例访问:对于实例字段/方法,必须通过实例访问
- Android组件:避免直接创建Activity实例,使用
Java.choose获取已有实例 - 静态成员:直接通过类引用修改静态变量
四、命令总结
# 基本命令
frida -U -f com.example.app -l script.js
# 参数说明
-U 连接到USB设备
-f 指定包名启动应用
-l 加载脚本
通过掌握这些核心概念和技术,您将能够有效地使用Frida进行Android应用的Java层动态分析和修改。