安卓逆向——Frida的基础用法(上)
字数 1181 2025-08-22 12:23:18
Frida基础用法教学文档
一、Frida简介
Frida是一款强大的动态代码插桩工具,主要用于Android/iOS/macOS/Linux/Windows等平台的动态分析和逆向工程。它允许开发者通过JavaScript脚本来实时修改和监控目标应用程序的行为。
二、环境准备
1. 所需工具
- jadx:用于进行静态分析,也可以进行动态调试
- 雷电模拟器9(Android 9):建议使用root版本
- Frida:包含Frida客户端和Frida server
- adb工具:用于连接Android设备
2. 环境配置步骤
- 确保adb连接正常:
adb devices - 进入手机shell:
adb shell - 获取root权限:
su - 进入目标目录:
cd /data/local/tmp - 修改Frida server权限:
chmod 755 frida-server-16.2.1-android-x86_64 - 启动Frida server:
./frida-server-16.2.1-android-x86_64 - 端口转发:
adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043 - 验证Frida是否正常工作:
frida-ps -U或frida-ps -R
三、Frida基础用法
1. Hook普通方法
应用场景:监控或修改应用程序中某个方法的执行
示例代码:
Java.perform(function() {
var MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");
MainActivity.get_random.implementation = function() {
console.log("MainActivity.get_random is called");
var ret_val = this.get_random();
console.log("MainActivity.get_random result is " + ret_val);
return ret_val;
};
});
使用命令:
frida -U -f com.ad2001.frida0x1 -l test.js
模板:
Java.perform(function() {
var <class_reference> = Java.use("<package_name>.<class>");
<class_reference>.<method_to_hook>.implementation = function(<args>) {
/* 自定义实现 */
};
});
2. Hook静态方法
应用场景:调用或修改静态方法
示例代码:
Java.perform(function() {
var a = Java.use("com.ad2001.frida0x2.MainActivity");
a.get_flag(4919);
});
使用命令:
frida -U 'Frida 0x2' -l Hook.js
模板:
Java.perform(function() {
var <class_reference> = Java.use("<package_name>.<class>");
a.function(val); // 需要调用的方法名称
});
3. 更改变量的值
应用场景:直接修改类中的变量值
示例代码:
Java.perform(function() {
var a = Java.use("com.ad2001.frida0x3.Checker");
a.code.value = 512;
});
使用命令:
frida -U -f com.ad2001.frida0x3 -l hook.js
模板:
Java.perform(function() {
var <class_reference> = Java.use("<package_name>.<class>");
<class_reference>.<variable>.value = <value>; //需要修改的变量
});
4. 创建类实例
应用场景:当需要调用非静态方法时,先创建类的实例
示例代码:
Java.perform(function() {
var check = Java.use("com.ad2001.frida0x4.Check");
var check_obj = check.$new();
var res = check_obj.get_flag(1337);
console.log("FLAG:" + res);
});
模板:
Java.perform(function() {
var <class_reference> = Java.use("<package_name>.<class>");
var <class_instance> = <class_reference>.$new(); // 创建类的实例
<class_instance>.<method>(); // 调用该实例中的方法
});
四、常见问题解决
-
Frida无法连接:
- 检查Frida server是否正常运行
- 检查端口转发是否正确
- 检查Frida和Frida server版本是否一致
-
Hook不生效:
- 检查目标类和方法名是否正确
- 对于静态方法,可能需要先启动应用再附加
-
权限问题:
- 确保设备已root
- 检查Frida server文件权限
五、实战技巧
-
动态调试:结合jadx或JEB进行静态分析,再用Frida动态验证
-
多方法Hook:可以在一个脚本中Hook多个方法
-
参数修改:在implementation函数中可以修改传入参数或返回值
-
日志输出:使用console.log输出调试信息
-
异常处理:在脚本中加入try-catch块处理可能的异常
六、总结
Frida是一款功能强大的动态分析工具,通过JavaScript脚本可以实现:
- 方法Hook和修改
- 静态方法调用
- 变量值修改
- 类实例创建和方法调用
掌握这些基础用法后,可以进一步学习Frida的高级功能,如:
- 内存操作
- Native层Hook
- RPC调用
- 多线程处理等