frida如何hook flutter的aes加密
我想用Frida来hook Flutter应用中的AES加密逻辑,但发现Flutter的Dart代码编译为本地代码后比较难定位。有没有具体的方法可以找到AES加密的关键函数?比如如何确定密钥和IV的生成位置,以及如何通过Frida拦截加密函数的输入输出?最好能提供一些实际操作的代码示例或思路。
2 回复
要使用Frida Hook Flutter中的AES加密,关键在于定位加密函数并注入Hook代码。以下是具体步骤和示例:
1. 定位AES加密函数
Flutter应用中AES加密通常通过dart:convert或第三方库(如pointycastle)实现。常见函数名包含encrypt、decrypt、AES等。可使用以下方法定位:
- 静态分析:反编译APK,查看
libapp.so中的Dart符号。 - 动态枚举:通过Frida枚举Dart运行时函数:
// 枚举所有Dart函数(需在Dart VM启动后执行) Interceptor.enumerateModules().forEach((module) => { if (module.name.includes("libapp")) { console.log(JSON.stringify(module)); } });
2. Hook AES加密函数示例
假设目标函数为encryptAES(实际名称需根据分析确定):
Java.perform(function () {
// 获取Dart运行时对象(需根据实际地址调整)
const dartRuntime = Module.findBaseAddress("libapp.so");
// 替换为实际函数偏移或符号(通过IDA/Radare2分析获取)
const encryptAES = dartRuntime.add(0x123456); // 示例偏移
Interceptor.attach(encryptAES, {
onEnter: function (args) {
// 打印参数(需根据函数签名调整)
console.log("AES加密输入: " + Memory.readUtf8String(args[1]));
},
onLeave: function (retval) {
// 打印返回值(加密结果)
console.log("AES加密输出: " + Memory.readUtf8String(retval));
}
});
});
3. 通用Hook方案(针对pointycastle库)
若使用pointycastle库,可尝试Hook公共加密类:
// Hook Pointycastle的AES加密引擎
const aesEncrypt = Module.findExportByName("libapp.so", "AESEngine_processBlock");
if (aesEncrypt) {
Interceptor.attach(aesEncrypt, {
onEnter: function (args) {
console.log("AES输入块: " + hexdump(args[1]));
},
onLeave: function (retval) {
console.log("AES输出块: " + hexdump(args[2]));
}
});
}
4. 注意事项
- 符号缺失:Flutter Release版本可能剥离符号,需通过模式匹配或字符串引用定位函数。
- 异步调用:Dart代码可能异步执行,需确保Hook时机正确。
- 参数解析:Dart函数参数可能为对象指针,需结合内存读取方式解析。
5. 完整脚本示例
Java.perform(function () {
setTimeout(function() { // 等待Flutter初始化
const libapp = Module.findBaseAddress("libapp.so");
// 通过字符串引用定位(示例:搜索加密相关字符串)
const encryptStr = Memory.allocUtf8String("encrypt");
const encryptFunc = Memory.scanSync(libapp, libapp.size, "E8 ?? ?? ?? ?? 48 8B 4D")[0].address;
Interceptor.attach(encryptFunc, {
onEnter: function (args) {
this.input = args[1];
console.log("加密输入: " + Memory.readUtf8String(this.input));
},
onLeave: function (retval) {
console.log("加密结果: " + Memory.readByteArray(retval, 16));
}
});
}, 1000);
});
总结
关键步骤:定位加密函数偏移 → 编写Hook脚本 → 处理Dart运行时特性。建议结合具体应用通过动态调试确定函数地址,并注意Flutter的Release模式优化可能增加Hook难度。


