如何用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(''); } });
关键说明
- 类名匹配:确保脚本中的
com.example.utils和目标类的完整包名+类名完全一致(注意类名是小写的utils,不要写错大小写)。 - 私有方法拦截:对于私有方法,必须用
.overload()指定参数类型签名,byte[]对应的签名是[B,如果方法有多个重载,需要对应不同的签名配置。 - 字节数组处理:直接打印byte数组会显示对象引用,所以用
bytesToHex转成十六进制,或者尝试转成UTF-8字符串,方便直观分析数据内容。 - 不影响原逻辑:脚本中调用
this.XOR和this.EncryptDecrypt保留原方法执行流程,仅做日志输出,不会破坏原有应用功能。
运行脚本命令
将脚本保存为utils-hook.js,然后执行:
frida -U -f 你的应用包名 -l utils-hook.js --no-pause
-U:连接USB设备(或模拟器)-f:启动目标应用--no-pause:启动后不暂停应用,直接执行脚本
内容的提问来源于stack exchange,提问作者IroniaTheMaster
相关产品推荐
相关产品推荐

