You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Frida编写脚本拦截com.example.utils类的加密操作?

Frida脚本拦截com.example.utils加密函数示例

针对你提供的com.example.utils类,核心加密相关函数是**XOR(对外暴露的加密/解密入口)和私有静态方法EncryptDecrypt**(实际加解密逻辑实现)。以下是可直接使用的Frida脚本示例,附带详细说明:

完整拦截脚本

// 导入Frida Java API
Java.perform(function() {
    // 获取目标类的引用
    const UtilsClass = Java.use("com.example.utils");

    // --------------------------
    // 拦截公开静态方法:XOR
    // --------------------------
    UtilsClass.XOR.implementation = function(str, str2, z) {
        // 打印输入参数
        console.log("[XOR] 输入参数:");
        console.log(`  原始字符串: ${str}`);
        console.log(`  密钥: ${str2}`);
        console.log(`  加密模式(z=true)/解密模式(z=false): ${z}`);

        // 调用原方法获取返回值
        const result = this.XOR(str, str2, z);

        // 打印返回结果
        console.log(`[XOR] 返回结果: ${result}`);
        console.log("----------------------------------------");

        // 返回原结果,不影响程序逻辑
        return result;
    };

    // --------------------------
    // 拦截私有静态方法:EncryptDecrypt
    // --------------------------
    // 私有方法需要指定参数类型签名(byte[]对应"[B")
    UtilsClass.EncryptDecrypt.overload("[B", "[B").implementation = function(bArr, bArr2) {
        // 打印输入的byte数组(转十六进制和UTF-8字符串,方便查看)
        console.log("[EncryptDecrypt] 输入参数:");
        console.log(`  待处理字节数组(十六进制): ${bytesToHex(bArr)}`);
        console.log(`  密钥字节数组(十六进制): ${bytesToHex(bArr2)}`);
        try {
            console.log(`  待处理字符串(UTF-8): ${new Java.String(bArr)}`);
            console.log(`  密钥字符串(UTF-8): ${new Java.String(bArr2)}`);
        } catch (e) {
            console.log("  注:部分字节无法转成UTF-8字符串");
        }

        // 调用原方法获取返回值
        const result = this.EncryptDecrypt(bArr, bArr2);

        // 打印返回的字节数组
        console.log(`[EncryptDecrypt] 返回结果(十六进制): ${bytesToHex(result)}`);
        try {
            console.log(`[EncryptDecrypt] 返回结果(UTF-8): ${new Java.String(result)}`);
        } catch (e) {
            console.log("  注:返回字节无法转成UTF-8字符串");
        }
        console.log("----------------------------------------");

        // 返回原结果
        return result;
    };

    // 辅助函数:将byte数组转十六进制字符串
    function bytesToHex(bytes) {
        return Array.from(bytes, byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
    }
});

关键说明

  1. 类名匹配:确保脚本中的com.example.utils和目标类的完整包名+类名完全一致(注意类名是小写的utils,不要写错大小写)。
  2. 私有方法拦截:对于私有方法,必须用.overload()指定参数类型签名,byte[]对应的签名是[B,如果方法有多个重载,需要对应不同的签名配置。
  3. 字节数组处理:直接打印byte数组会显示对象引用,所以用bytesToHex转成十六进制,或者尝试转成UTF-8字符串,方便直观分析数据内容。
  4. 不影响原逻辑:脚本中调用this.XOR和this.EncryptDecrypt保留原方法执行流程,仅做日志输出,不会破坏原有应用功能。

运行脚本命令

将脚本保存为utils-hook.js,然后执行:

frida -U -f 你的应用包名 -l utils-hook.js --no-pause
  • -U:连接USB设备(或模拟器)
  • -f:启动目标应用
  • --no-pause:启动后不暂停应用,直接执行脚本

内容的提问来源于stack exchange,提问作者IroniaTheMaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:25:25