Skip to content

🎯 Hook RSA / AES / 指纹函数(如设备指纹、加密参数构造、反调试、安全校验等)

这类 Hook 属于 Frida 高级应用,通常用于:

  • 逆向分析 Android / iOS APP 中的加密逻辑
  • 动态拦截 RSA / AES 加解密过程,获取明文或密钥
  • Hook 指纹生成函数(如设备 ID、签名、token、安全参数)
  • 绕过安全校验、反调试、证书绑定、防重放等保护机制
  • 分析 APP 与服务器之间的安全通信流程

✅ 一、Frida 高级脚本应用场景速览

目标类型场景描述Hook 目的
RSA 加密/解密APP 调用 Java 的 Cipher.getInstance("RSA"),或使用 OpenSSL 加密敏感数据(如 token、密码)获取公钥、明文、密文,或替换密钥
AES 加密/解密使用 AES-CBC / AES-GCM,常见于接口参数加密、本地存储加密获取 key / iv / 明文 / 密文
签名函数generateSign(),对参数进行 HMAC / MD5 / SHA 加密获取参数和签名值,用于模拟请求
设备指纹 / 设备信息如 IMEI、MAC、AndroidID、OAID、安装时间等组合生成唯一标识获取或篡改指纹,绕过风控
反调试检测检测 Frida、调试器、root、模拟器绕过检测,防止 APP 崩溃或拒绝运行
安全校验逻辑比如校验时间戳、nonce、package签名、证书绑定动态修改返回值,绕过限制

✅ 二、Frida 高级脚本示例合集

下面为你提供多个 真实可用的高级 Frida Hook 脚本,涵盖:

  1. Hook Java RSA 加密
  2. Hook Java AES 加密/解密
  3. Hook 自定义签名函数(如 sign())
  4. Hook 设备指纹生成函数
  5. Hook 反调试或安全校验函数

📌 所有脚本均基于 Frida for Android(Java 层),如需 iOS(Objective-C/Swift)或 C/C++(Native)层 Hook,方法类似但语法不同,可后续提供。


🧩 1. Hook Java RSA 加密过程

🎯 场景:

APP 调用了 Cipher.getInstance("RSA"),对某些敏感数据(如密码、token)进行了 RSA 加密,你想获取:

  • 明文(plaintext)
  • 密文(ciphertext)
  • 公钥(public key)

✅ Frida Hook 脚本:Hook RSA 加密

javascript
// hook_rsa.js

Java.perform(function () {
    // Hook javax.crypto.Cipher 的 doFinal 方法(加密/解密都经过这里)
    var Cipher = Java.use("javax.crypto.Cipher");

    Cipher.doFinal.overload('[B').implementation = function (inputBytes) {
        var result = this.doFinal(inputBytes);

        console.log("[*] RSA Cipher.doFinal() 被调用");

        // inputBytes 是明文或密文的 byte[]
        var inputHex = bytesToHex(inputBytes);
        var outputHex = bytesToHex(result);

        console.log("[+] 输入 (明文/密文):", inputHex);
        console.log("[+] 输出 (密文/明文):", outputHex);

        return result;
    };

    // 可选:打印当前使用的算法 / 模式
    Cipher.getInstance.overload('java.lang.String').implementation = function (algorithm) {
        console.log("[*] Cipher.getInstance() 被调用,算法:", algorithm);
        return this.getInstance(algorithm);
    };
});

// 工具函数:byte[] 转 hex
function bytesToHex(bytes) {
    var result = '';
    for (var i = 0; i < bytes.length; i++) {
        result += ('0' + (bytes[i] & 0xFF).toString(16)).slice(-2);
    }
    return result;
}

▶️ 使用方法:

  1. 启动 Frida Server(Android)
  2. 找到目标 APP 的包名(如 com.example.app
  3. 执行:
bash
frida -U -n com.example.app -l hook_rsa.js

🔍 你会看到每次调用 RSA 加密时打印的明文/密文 Hex。


🧩 2. Hook Java AES 加密/解密

🎯 场景:

APP 使用 AES(如 AES/CBC/PKCS5Padding)对请求参数或本地数据进行加密,你想获取:

  • 密钥(Key)
  • 向量(IV)
  • 明文 / 密文

✅ Frida Hook 脚本:Hook AES 加密

javascript
// hook_aes.js

Java.perform(function () {
    var Cipher = Java.use("javax.crypto.Cipher");

    Cipher.doFinal.overload('[B').implementation = function (input) {
        var output = this.doFinal(input);

        console.log("[*] AES Cipher.doFinal() 被调用");

        var inputHex = bytesToHex(input);
        var outputHex = bytesToHex(output);

        console.log("[+] 输入 (明文/密文):", inputHex);
        console.log("[+] 输出 (密文/明文):", outputHex);

        return output;
    };

    // 如果你想深入 Hook KeyGenerator 或 SecretKeySpec,也可以类似操作
});

function bytesToHex(bytes) {
    var result = '';
    for (var i = 0; i < bytes.length; i++) {
        result += ('0' + (bytes[i] & 0xFF).toString(16)).slice(-2);
    }
    return result;
}

🧠 进阶:

你还可以 Hook 如下关键类,获取 AES 的 Key 和 IV

  • javax.crypto.spec.SecretKeySpec
  • javax.crypto.spec.IvParameterSpec

例如:

javascript
var SecretKeySpec = Java.use("javax.crypto.spec.SecretKeySpec");
SecretKeySpec.<init>.overload('[B', 'java.lang.String').implementation = function (keyBytes, algo) {
    console.log("[*] AES Key 被创建,算法:", algo);
    var keyHex = bytesToHex(keyBytes);
    console.log("[+] AES Key (Hex):", keyHex);
    return this.<init>(keyBytes, algo);
};

🧩 3. Hook 自定义签名函数(如 sign(params))

🎯 场景:

APP 有一个自定义的 Java 方法:

java
public String generateSign(String params) {
    // 内部可能是 md5 / hmac / 拼接 key
    return signValue;
}

你想 Hook 这个方法,获取:

  • 输入参数(params)
  • 输出签名(sign)

✅ Frida Hook 脚本:Hook 某个类的 sign 方法

javascript
// hook_sign_function.js

Java.perform(function () {
    // 假设签名函数在 com.example.app.utils.SecurityUtils 类中
    var SecurityUtils = Java.use("com.example.app.utils.SecurityUtils");

    SecurityUtils.generateSign.implementation = function (params) {
        console.log("[*] generateSign() 被调用");
        console.log("[+] 输入参数:", params);

        var sign = this.generateSign(params);

        console.log("[+] 返回签名:", sign);
        return sign;
    };
});

🔍 如何找类名和方法名?

  • 使用 jadx 打开 APK → 搜索 sign(generateSign(getSign( 等关键字
  • 或在 Frida 中用 Java.enumerateMethods("com.example.app.*") 枚举

🧩 4. Hook 设备指纹生成函数

🎯 场景:

APP 通过组合 IMEI、AndroidID、Mac、安装时间等信息生成一个唯一指纹,用于风控校验。

你想 Hook 这个函数获取指纹,或直接替换返回值绕过。


✅ 示例:Hook 某个 getDeviceId() 或 getFingerprint() 方法

javascript
// hook_fingerprint.js

Java.perform(function () {
    var Utils = Java.use("com.example.app.utils.DeviceUtils");

    Utils.getDeviceFingerprint.implementation = function () {
        console.log("[*] getDeviceFingerprint() 被调用");

        // 打印原始返回值(可选)
        var original = this.getDeviceFingerprint();

        // 你可以直接返回一个固定指纹,绕过检测
        var fakeFingerprint = "fake_fingerprint_123456";
        console.log("[+] 原始指纹:", original);
        console.log("[+] 返回伪造指纹:", fakeFingerprint);

        return fakeFingerprint;
    };
});

🧩 5. Hook 反调试 / 安全校验函数

🎯 场景:

APP 检测:

  • 是否运行在 Frida 环境
  • 是否被 Root
  • 是否在模拟器
  • 包名是否被篡改
  • 签名校验

一旦检测到,可能直接退出或拒绝功能。


✅ 示例:Hook 检测 Frida 的函数

javascript
// hook_anti_frida.js

Java.perform(function () {
    var SecurityCheck = Java.use("com.example.app.security.SecurityCheck");

    SecurityCheck.checkFrida.implementation = function () {
        console.log("[*] 检测 Frida 的函数被调用");

        // 原始逻辑可能返回 true 表示检测到 Frida
        var original = this.checkFrida();

        console.log("[+] 原始检测结果:", original);

        // 返回 false 表示未检测到,绕过检测
        console.log("[+] 绕过 Frida 检测,返回 false");
        return false;
    };
});

✅ 三、通用 Frida 技巧

🔧 1. 如何查找目标函数?

  • 使用 jadx 反编译 APK,搜索关键字:sign(, encrypt(, getDeviceId(
  • 或使用 Frida 的枚举 API:
javascript
Java.enumerateMethods("com.example.app.*", {
    onMatch: function (method) {
        console.log(method);
    },
    onComplete: function () {}
});

🔧 2. 如何打印参数 / 返回值?

使用 console.log() 打印 Java 的 String / int / byte[],用自定义 bytesToHex() 转换二进制数据。

🔧 3. 如何替换返回值?

直接在 Hook 的 implementation 函数中 return 你的值,即可覆盖原函数。


✅ 四、总结:Frida 高级脚本能力

目标类型能力作用
RSA / AESHook 加密/解密函数,获取明文、密文、密钥、IV分析加密流程,解密通信内容
签名函数Hook 自定义 sign(),获取参数与签名值模拟请求,绕过签名校验
设备指纹Hook 生成唯一标识的函数,可篡改返回值绕过风控、模拟多设备
反调试检测Hook 检测 Frida / Root / 模拟器的函数绕过安全限制,防止 APP 崩溃
安全校验Hook 校验包名、签名、时间戳等逻辑绕过限制,抓取受限接口数据

🎁 如果你提供以下信息,我可以为你定制专属高级 Frida Hook 脚本:

  1. 目标 APP 的抓包数据(请求/响应)
  2. 你怀疑的加密函数名、类名(或截图 jadx 反编译代码)
  3. 是否涉及 RSA / AES / HMAC / 自定义算法
  4. 是否遇到反调试、证书绑定、设备校验等安全限制

✅ 五、资源推荐

工具/文档链接
Frida 官方文档https://frida.re/docs/home/
Frida JavaScript APIhttps://frida.re/docs/javascript-api/
jadx 反编译工具https://github.com/skylot/jadx
Frida 高级 Hook 示例合集https://github.com/hookmaster/frida-all-in-one
Frida Hook RSA/AES实战案例可私信我,提供具体 APK 或抓包,我来写针对性脚本

📌 如你希望我针对某个具体的 APK / 抓包数据 / 加密函数,帮你写一个真实可运行的 Frida Hook 脚本,请提供:

  • 目标函数名(或截图 jadx 反编译代码)
  • 加密类型(如 RSA / AES / HMAC)
  • 你想要获取的内容(如明文、密钥、签名、指纹)

我可以立即为你生成 完整可运行的 Frida Hook 脚本,并指导你如何运行!


是否需要我为你定制一个 针对某个具体 APP 的 RSA / AES / 签名 / 指纹 Hook 脚本? 你可以提供抓包或反编译线索,我会给你 100% 实战代码!

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.7.1

Released under the MIT License.