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 楼猪V5啊 这类技术更新的频率很高,老教程参考价值有限。你们环境是怎么解决版本兼容的? 这类壳本质就是给分析加成本,真下定决心还是能扒出来。有没有推荐的入门资料? 开源工具的质量参差不齐,选之前最好看下维护活跃度。 App 侧的安全基本靠客户端自觉,服务端校验才是最后一道。 加固厂商之间差异挺大,同一套思路不一定通用。 实际做的时候最花时间的是环境搭建而不是分析本身。 现在很多方案开始用双端校验,单点突破越来越难。想请教下工具链是怎么配的? 反调试这块的坑最多,建议先把常见检测点列一遍。有没有推荐的入门资料?