frida 入门及几种 hook 思路
字数 961 2025-08-22 12:22:36
Frida 入门及 Hook 技术实战指南
一、Frida 简介与对比
Frida 与 Xposed 对比
-
Xposed:
- 开发模式:需要编写组件并重新打包应用
- 特点:一劳永逸,适合长期使用
- 工作方式:修改应用运行时环境
-
Frida:
- 开发模式:通过注入 JavaScript 代码到目标进程
- 特点:灵活便捷,适合动态分析和临时调试
- 工作方式:进程注入技术
Frida 优势
- 无需修改 APK 文件
- 支持多种平台(Android、iOS、Windows、macOS 等)
- 动态修改应用行为
- 强大的 JavaScript API
二、环境搭建
1. 基础环境准备
- Python 3.7+
- 夜神模拟器(Android 5.1.1)
- Windows 10 系统
2. Frida 安装
pip install frida
pip install frida-tools
3. Frida-server 部署
- 确定模拟器架构:
adb shell getprop ro.product.cpu.abi
- 从 frida-releases 下载对应版本的 frida-server
- 推送并运行:
adb push frida-server /data/local/tmp
adb forward tcp:27042 tcp:27042
adb shell /data/local/tmp/frida-server
4. 验证安装
frida-ps -U
三、Hook 技术实战
案例一:解锁码绕过
目标分析
- 应用需要输入解锁码
- 解锁码通过加密函数生成
- 使用 equals() 方法比较用户输入与正确解锁码
Hook 方法一:拦截 equals() 方法
Java.perform(function() {
var String = Java.use('java.lang.String');
String.equals.implementation = function(arg1) {
console.log("Your input: " + this.toString());
console.log("Real key: " + arg1);
return this.equals(arg1);
}
});
Hook 方法二:拦截打印函数
Java.perform(function() {
var Show_key = Java.use("com.hfdcxy.android.by.a.a");
Show_key.a.overload("java.lang.String").implementation = function(args1) {
console.log("Your_key_is: " + args1);
}
});
Hook 方法三:修改加密函数返回值
Java.perform(function() {
var my_class = Java.use("com.hfdcxy.android.by.test.a");
my_class.a.implementation = function() {
return "123456789"; // 返回我们控制的固定值
}
});
案例二:游戏金币修改
目标分析
- 点击金币按钮:coin += i (i 默认为1)
- 开宝箱条件:coin >= 9999
Hook 方法:修改函数参数
Java.perform(function() {
var coin = Java.use("com.hfdcxy.android.by.test.b");
coin.a.overload("android.content.SharedPreferences",
"android.widget.TextView",
"int").implementation = function(args1, args2, args3) {
return this.a(args1, args2, 9999); // 修改第三个参数为9999
}
});
四、Python 加载器
import time
import frida
# 获取设备并启动目标应用
device = frida.get_remote_device()
pid = device.spawn(["com.ss.android.ugc.aweme"]) # 目标包名
device.resume(pid)
time.sleep(1) # 等待应用启动
# 附加到进程并注入脚本
session = device.attach(pid)
with open("hook_script.js") as f:
script = session.create_script(f.read())
script.load()
# 保持脚本运行
input()
五、高级技巧与最佳实践
1. 方法重载处理
- 使用
overload()指定具体方法签名 - 示例:
var cls = Java.use("com.example.Class");
cls.method.overload("int", "java.lang.String").implementation = function(a, b) {
// 实现代码
}
2. 动态类加载
Java.perform(function() {
var Activity = Java.use("android.app.Activity");
Activity.onResume.implementation = function() {
console.log("Activity resumed");
this.onResume();
}
});
3. 创建新对象
var String = Java.use("java.lang.String");
var newString = String.$new("Hello Frida");
4. 修改字段值
Java.perform(function() {
var cls = Java.use("com.example.Class");
cls.field.value = "new value";
});
六、调试技巧
- 日志输出:
console.log("Debug info: ", someValue);
- 异常捕获:
try {
// 可能出错的代码
} catch(e) {
console.log("Error: " + e);
}
- 方法调用堆栈:
console.log(Java.use("android.util.Log").getStackTraceString(
Java.use("java.lang.Exception").$new()
));
七、安全注意事项
- 仅用于合法授权的测试
- 测试完成后移除注入代码
- 避免在生产环境中使用
- 注意目标应用的反调试机制
八、扩展学习资源
- Frida 官方文档
- Frida JavaScript API 参考
- 社区提供的各种 Frida 脚本模板
- 实际应用案例研究
通过本指南,您应该已经掌握了 Frida 的基本使用方法及多种 Hook 技术。实际应用中,建议从简单案例开始,逐步深入理解 Frida 的强大功能。