frida如何hook flutter的aes加密

我想用Frida来hook Flutter应用中的AES加密逻辑,但发现Flutter的Dart代码编译为本地代码后比较难定位。有没有具体的方法可以找到AES加密的关键函数?比如如何确定密钥和IV的生成位置,以及如何通过Frida拦截加密函数的输入输出?最好能提供一些实际操作的代码示例或思路。

2 回复

使用Frida hook Flutter的AES加密,需先定位加密函数。常见方法:通过IDA分析Flutter库,找到AES相关函数(如AES_encrypt或自定义加密函数)。然后编写Frida脚本,使用Interceptor.attach挂钩目标函数,打印或修改输入输出参数。

更多关于frida如何hook flutter的aes加密的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


要使用Frida Hook Flutter中的AES加密,关键在于定位加密函数并注入Hook代码。以下是具体步骤和示例:

1. 定位AES加密函数

Flutter应用中AES加密通常通过dart:convert或第三方库(如pointycastle)实现。常见函数名包含encryptdecryptAES等。可使用以下方法定位:

  • 静态分析:反编译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难度。

回到顶部