frida 逆向常用脚本

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容