Frida 是一款强大的动态插桩工具,可用于 Hook Java/Kotlin 方法、修改参数/返回值、动态调用函数 等,适用于 Android 逆向、安全测试、调试等场景。以下是核心要点总结:
- 核心步骤
(1) 环境准备
· 安装 Frida:
pip install frida-tools
· 运行 Frida Server(Android):
adb push frida-server /data/local/tmp/
adb shell "chmod +x /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
(2) 基本 Hook 模板
Java.perform(() => {
const TargetClass = Java.use("com.example.TargetClass");
TargetClass.targetMethod.implementation = function (...args) {
console.log(`参数: ${args}`);
const result = this.targetMethod(...args); // 调用原方法
console.log(`返回值: ${result}`);
return result; // 可修改返回值
};
});
- 常见 Hook 场景
(1) Hook 普通方法
Java.perform(() => {
const Crypto = Java.use("com.app.Crypto");
Crypto.encrypt.implementation = function (input) {
console.log(`原始输入: ${input}`);
return "fake_data"; // 修改返回值
};
});
(2) Hook 静态方法
Java.perform(() => {
const Utils = Java.use("com.app.Utils");
Utils.staticMethod.implementation = function (arg) {
console.log(`静态方法参数: ${arg}`);
return "hooked_result";
};
});
(3) Hook 构造函数
Java.perform(() => {
const User = Java.use("com.app.User");
User.$init.implementation = function (name, age) {
console.log(`创建用户: name=${name}, age=${age}`);
this.$init(name, 18); // 强制修改年龄
};
});
(4) Hook Kotlin 伴生对象
Java.perform(() => {
const KtService = Java.use("com.app.KtService$Companion");
KtService.getToken.implementation = function () {
return "fake_token";
};
});
(5) Hook 方法重载
Java.perform(() => {
const MathUtils = Java.use("com.app.MathUtils");
MathUtils.sum.overload('int', 'int').implementation = function (a, b) {
return a * b; // 把加法改成乘法
};
});
- 动态调用 Java 方法
(1) 调用静态方法
const result = Java.use("com.app.Utils").staticMethod("test");
console.log(`结果: ${result}`);
(2) 创建对象并调用方法
const Person = Java.use("com.app.Person");
const person = Person.$new("John"); // 调用构造函数
console.log(person.getName());
- 高级技巧
(1) 枚举类方法
const TargetClass = Java.use("com.app.Target");
const methods = TargetClass.class.getDeclaredMethods();
methods.forEach(m => console.log(`方法: ${m.getName()}`));
(2) Hook 系统 API(如 Location)
Java.perform(() => {
const Location = Java.use("android.location.Location");
Location.getLatitude.implementation = () => 39.9042; // 伪造北京纬度
});
(3) 绕过 SSL Pinning
Java.perform(() => {
const TrustManager = Java.use("javax.net.ssl.TrustManager");
// Hook 相关方法,替换证书校验逻辑
});
- 常见问题
问题 解决方案
类找不到 检查类名是否正确(Kotlin 可能带 $Companion)
方法混淆 用 jadx 反编译分析调用链
Frida 报错 Class not found 确保类已加载(Java.choose() 或 setTimeout 延迟 Hook)
Hook 失败 检查方法签名(是否有重载?是否静态?)
- 实战应用
· 破解登录逻辑(Hook 加密函数)
· 绕过验证码(修改返回值)
· 抓取网络请求(Hook Retrofit/OkHttp)
· 模拟 GPS(Hook LocationManager)
- 学习资源
· 工具:JADX(静态分析)、Frida(动态 Hook)、BurpSuite(抓包)
· 书籍:《Android软件安全权威指南》《Frida逆向实战》
· 靶场:AndroGoat(漏洞练习 APP)
总结
· Frida 核心功能:动态修改 Java/Kotlin 方法逻辑。
· 关键点:Java.use() + implementation + overload。
· 适用场景:逆向分析、安全测试、自动化破解。