咨询发布 发表于 2026-5-15 11:10:05

Flutter App逆向:Blutter提取Dart方法到Frida hook

Flutter App 逆向跟原生 Android 逆向完全不同。Flutter 用 Dart 语言,AOT 编译后没有 Java 层可以 hook。

一、Flutter 编译方式

[*]Debug 模式:JIT 编译,Dart 代码在运行时解释执行。可以用 Observatory 调试
[*]Release 模式:AOT 编译,Dart 代码编译成 ARM64 原生二进制。没有符号信息

发布版都是 Release 模式,逆向难点在这里。

二、Blutter 工具
Blutter 是目前最好的 Flutter 逆向工具。它能从 AOT snapshot 中提取:

[*]所有 Dart 类和方法名
[*]方法地址映射
[*]对象结构布局


用法:
python blutter.py path/to/app/lib/arm64-v8a/libflutter.so path/to/app/lib/arm64-v8a/app.so output_dir/

输出 asm 目录下的汇编文件,每个方法都有 Dart 原名注释。

三、Frida hook Flutter 方法
Flutter 编译后的方法入口在 app.so 里。用 Blutter 找到地址后:
var addr = ptr("0x12345"); // LoginApi.verify
Interceptor.attach(addr, {
    onEnter: function(args) {
      // args = this 对象
      // args = 第一个 Dart 参数
      // Dart 字符串需要特殊解析,不是普通的 C 字符串
      console.log("verify called");
    }
});

四、Dart 字符串解析
Dart 的字符串在内存中的布局跟 C 字符串不同。需要读取 Dart 对象头再定位到字符串数据:
function readDartString(ptr_obj) {
    // Dart String 对象布局因版本而异
    // 通常:对象头 + 长度 + 字符数据
    var length = ptr_obj.add(8).readS32();
    var data = ptr_obj.add(16);
    return data.readUtf8String(length);
}

五、抓包替代方案
Flutter 不用系统的 HTTP 库,用自己的 HttpClient。常规抓包工具抓不到。用 reFlutter 框架重打包注入流量代理,或者 hook dart:io 的 HttpClient 做拦截。

https://www.metk.cn/img/posts/flutter_reverse.jpg

发表于 2026-9-17 18:32:16

楼猪V5啊

关山杂谈 发表于 2026-9-17 18:39:34

这类技术更新的频率很高,老教程参考价值有限。你们环境是怎么解决版本兼容的?

南山记事 发表于 2026-9-17 18:41:10

这类壳本质就是给分析加成本,真下定决心还是能扒出来。有没有推荐的入门资料?

清和60 发表于 2026-9-17 18:44:07

开源工具的质量参差不齐,选之前最好看下维护活跃度。

清和 发表于 2026-9-17 18:46:28

App 侧的安全基本靠客户端自觉,服务端校验才是最后一道。

野渡48 发表于 2026-9-17 18:48:23

加固厂商之间差异挺大,同一套思路不一定通用。

有点困 发表于 2026-9-17 18:50:28

实际做的时候最花时间的是环境搭建而不是分析本身。

一苇 发表于 2026-9-17 18:53:12

现在很多方案开始用双端校验,单点突破越来越难。想请教下工具链是怎么配的?

晚风随笔 发表于 2026-9-17 18:56:15

反调试这块的坑最多,建议先把常见检测点列一遍。有没有推荐的入门资料?
页: [1] 2 3 4 5 6 7
查看完整版本: Flutter App逆向:Blutter提取Dart方法到Frida hook