Frida 逆向常用脚本(直接复制可用)
我给你整理了安卓逆向最常用、最实用、直接能跑的 Frida 脚本,覆盖:HOOK 函数、打印堆栈、抓包、加解密、SO 调用、防反调试等场景。
所有脚本都可以直接在命令行执行:
frida -U -f 包名 -l 脚本.js --no-pause
1. 基础:Hook Java 函数(最常用)
1.1 Hook 普通 Java 方法
// Hook 普通类方法
Java.perform(function() {
// 替换成你要 Hook 的类名 + 方法名
var TargetClass = Java.use("com.example.app.TestClass");
TargetClass.testMethod.implementation = function(str) {
console.log("[+] 调用参数: " + str);
// 执行原方法
var result = this.testMethod(str);
console.log("[+] 返回结果: " + result);
// 可以篡改返回值
// return "篡改后的结果";
return result;
};
});
1.2 Hook 重载方法
Java.perform(function() {
var TargetClass = Java.use("com.example.app.TestClass");
// 指定参数类型,解决重载冲突
TargetClass.testMethod.overload("java.lang.String", "int").implementation = function(str, num) {
console.log("参数1:", str, " 参数2:", num);
return this.testMethod(str, num);
};
});
1.3 Hook 构造方法
Java.perform(function() {
var TargetClass = Java.use("com.example.app.TestClass");
TargetClass.$init.implementation = function() {
console.log("[+] 构造方法被调用");
return this.$init();
};
});
2. 打印调用堆栈(定位关键代码)
function printStack() {
console.log("\n[+] 调用堆栈:");
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
}
// 在任意 Hook 里调用 printStack() 即可
Java.perform(function() {
var TargetClass = Java.use("com.example.app.TestClass");
TargetClass.testMethod.implementation = function(str) {
printStack(); // 打印堆栈
return this.testMethod(str);
};
});
3. Hook 所有 Activity 启动(抓界面)
Java.perform(function() {
var Activity = Java.use("android.app.Activity");
Activity.onCreate.implementation = function(bundle) {
console.log("[+] Activity 启动: " + this.getClass().getName());
this.onCreate(bundle);
};
});
4. Hook 网络请求(抓明文包)
4.1 Hook OkHttp3
Java.perform(function() {
// Hook RequestBody
var RequestBody = Java.use("okhttp3.RequestBody");
var Request = Java.use("okhttp3.Request");
// Hook OkHttpClient newCall
var OkHttpClient = Java.use("okhttp3.OkHttpClient");
OkHttpClient.newCall.implementation = function(request) {
console.log("\n[+] OkHttp 请求:");
console.log("URL: " + request.url().toString());
console.log("Method: " + request.method());
// 打印请求头
var headers = request.headers().toString();
console.log("Headers:\n" + headers);
// 打印请求体
var body = request.body();
if (body != null) {
console.log("Body: " + body.toString());
}
return this.newCall(request);
};
});
4.2 Hook HttpURLConnection(通用)
Java.perform(function() {
var URL = Java.use("java.net.URL");
URL.openConnection.implementation = function() {
var conn = this.openConnection();
console.log("[+] 请求URL: " + this.toString());
return conn;
};
});
5. Hook 加解密(AES / RSA)
5.1 Hook AES 加解密
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
var doFinal = Cipher.doFinal;
// 加密
doFinal.overload("[B").implementation = function(data) {
console.log("\n[+] AES 原始数据: " + bytesToHex(data));
var result = this.doFinal(data);
console.log("[+] AES 加密结果: " + bytesToHex(result));
return result;
};
// 字节转十六进制
function bytesToHex(bytes) {
var hex = Java.use("org.apache.commons.codec.binary.Hex");
return hex.encodeHexString(bytes);
}
});
5.2 Hook RSA 加解密
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.implementation = function(data) {
console.log("[+] RSA 数据: ", bytesToHex(data));
var ret = this.doFinal(data);
console.log("[+] RSA 结果: ", bytesToHex(ret));
return ret;
}
});
6. 关闭 SSL 证书校验(抓 HTTPS 包)
抓包必备,解除证书锁定!
Java.perform(function() {
console.log("[+] 关闭 SSL 证书校验");
// 关闭证书校验
var TrustManager = Java.registerClass({
name: 'com.example.TrustManager',
implements: [Java.use('javax.net.ssl.X509TrustManager')],
methods: {
checkClientTrusted: function(chain, authType) {},
checkServerTrusted: function(chain, authType) {},
getAcceptedIssuers: function() { return []; }
}
});
// 安装自定义证书管理器
var SSLContext = Java.use('javax.net.ssl.SSLContext');
var context = SSLContext.getInstance("TLS");
context.init(null, [TrustManager.$new()], null);
SSLContext.setDefault(context);
});
7. Hook 动态加载 SO(查看 so 名称)
Java.perform(function() {
var Runtime = Java.use("java.lang.Runtime");
Runtime.loadLibrary.implementation = function(libname) {
console.log("[+] 加载 SO: " + libname);
return this.loadLibrary(libname);
};
});
8. Native 层 HOOK(SO 函数)
// Hook libtest.so 中的 add 函数
function hookNative() {
var moduleName = "libtest.so";
var funcName = "add";
var addr = Module.findExportByName(moduleName, funcName);
if (addr) {
console.log("[+] Hook 成功: " + addr);
Interceptor.attach(addr, {
onEnter: function(args) {
console.log("参数1: " + args[0].toInt32());
console.log("参数2: " + args[1].toInt32());
},
onLeave: function(retval) {
console.log("返回值: " + retval.toInt32());
}
});
}
}
setImmediate(hookNative);
9. 防反调试 / 反Frida 绕过
// 绕过常见反调试
Java.perform(function() {
// 1. 关闭 Debug 检测
var Debug = Java.use("android.os.Debug");
Debug.isDebuggerConnected.implementation = function() {
return false;
};
// 2. 关闭 Frida 检测
Process.enumerateModulesSync().forEach(function(m) {
if (m.name.indexOf("frida") != -1) {
console.log("[+] 发现 frida 模块");
}
});
});
10. 枚举所有已加载类(找目标)
Java.perform(function() {
Java.enumerateLoadedClasses({
onMatch: function(className) {
if (className.indexOf("com.example.app") != -1) {
console.log(className);
}
},
onComplete: function() {
console.log("\n[+] 枚举完成");
}
});
});
11. 一键打印函数参数 + 返回值 + 堆栈(万能模板)
Java.perform(function() {
var clz = Java.use("com.example.app.TestClass");
var method = clz.testMethod;
method.implementation = function(a1) {
console.log("\n====================");
console.log("参数: " + a1);
var res = this.testMethod(a1);
console.log("结果: " + res);
printStack();
return res;
};
function printStack() {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
}
});
常用命令
# 附加运行中的进程
frida -U 包名 -l script.js
# 重启进程并自动注入(最常用)
frida -U -f 包名 -l script.js --no-pause
# 查看进程列表
frida -U -ps
# 脱壳(需要插件)
frida -U -f 包名 -l dexdump.js --no-pause