Flutter逆向工具链
2026/5/29工具工具逆向工程FlutterreFlutterBlutter大约 4 分钟
Flutter逆向工具链
是什么
Flutter 应用通常把 Dart 逻辑编译进 libapp.so,传统 Java 层反编译不一定能看到核心逻辑。
常见辅助工具包括:
- reFlutter
- Blutter
- Doldrums
- JADX
- Ghidra / IDA
- Frida
安装与配置
Flutter 逆向工具版本变化较快,建议按题目环境选择工具,并优先阅读对应仓库说明。
常见准备:
python3 -m pip install requests
sudo apt install adb unzip常见分析对象:
lib/arm64-v8a/libapp.so
lib/arm64-v8a/libflutter.so
assets/flutter_assets/基本用法
解包 APK
unzip app.apk -d apk_out
find apk_out -name "libapp.so"静态搜索
strings libapp.so | grep -i "flag\|http\|secret\|token"反编译 native
用 IDA/Ghidra 打开 libapp.so,结合符号和字符串定位逻辑。
更多工具
reFlutter
# 安装
pip install reflutter
# 使用
reflutter app.apk
# 输出:
# - patched APK (dump.dart)
# - 原始 libapp.so
# - 反编译的 Dart 代码reFlutter 通过 patch libflutter.so 来 dump Dart 代码。
Blutter
# 克隆
git clone https://github.com/aspect-apps/blutter.git
cd blutter
# 安装依赖
pip install -r requirements.txt
# 使用
python3 blutter.py /path/to/libapp.so /path/to/libflutter.so -o output
# 输出:
# - 反编译的 Dart 代码
# - 类和方法列表
# - 字符串常量Blutter 是专门用于 Flutter 逆向的工具,可以恢复类名和方法名。
Doldrums
# 克隆
git clone https://github.com/aspect-apps/doldrums.git
cd doldrums
# 使用
python3 doldrums.py /path/to/libapp.so -o output
# 输出:
# - Dart 类定义
# - 方法实现
# - 字符串常量Dart 代码分析
# 提取 Dart 字符串
strings libapp.so | grep -E "^[a-zA-Z_][a-zA-Z0-9_]*$"
# 搜索特定函数
strings libapp.so | grep -i "check\|verify\|validate\|encrypt\|decrypt"
# 提取类名
strings libapp.so | grep -E "^(class|enum|mixin) "Ghidra 分析
1. 打开 libapp.so
2. 搜索字符串
3. 查看交叉引用
4. 分析函数调用
5. 还原逻辑IDA 分析
1. 打开 libapp.so
2. 等待自动分析
3. 搜索字符串
4. 查看函数列表
5. 分析调用关系分析工作流
第一步:识别 Flutter
特征:
- libflutter.so
- libapp.so
- assets/flutter_assets
- isolate_snapshot_data
- vm_snapshot_data
确认方法:
- file 命令检查
- APK 解包查看
- JADX 检查 import第二步:提取信息
# 提取 libapp.so
unzip app.apk -d apk_out
find apk_out -name "libapp.so"
# 提取字符串
strings libapp.so > strings.txt
# 提取 Dart 类名
grep -E "^(class|enum|mixin) " strings.txt第三步:使用工具分析
# 使用 Blutter
python3 blutter.py libapp.so libflutter.so -o blutter_out
# 使用 Doldrums
python3 doldrums.py libapp.so -o doldrums_out
# 使用 reFlutter
reflutter app.apk第四步:定位关键代码
1. 搜索 flag/check/verify
2. 追踪函数调用
3. 分析加密逻辑
4. 找到校验函数
5. 理解输入要求第五步:动态分析
// Frida hook Dart 函数
// 注意: Dart 函数地址需要从工具输出中获取
// hook native 函数
Interceptor.attach(Module.findExportByName("libapp.so", "function_name"), {
onEnter: function (args) {
console.log("Function called");
},
onLeave: function (retval) {
console.log("Function returned: " + retval);
}
});CTF常用技巧
先判断是否 Flutter
特征:
libflutter.so
libapp.so
assets/flutter_assets
isolate_snapshot_data
vm_snapshot_dataJava 层不等于无逻辑
JADX 可能只看到壳和 Activity,核心校验在 Dart AOT 代码里。
动态 hook
如果静态分析困难,可以用 Frida 观察 Java/native 边界、网络请求、加密函数参数。
字符串搜索
# 搜索常见关键词
strings libapp.so | grep -i "flag"
strings libapp.so | grep -i "check"
strings libapp.so | grep -i "verify"
strings libapp.so | grep -i "password"
strings libapp.so | grep -i "secret"函数名恢复
1. 使用 Blutter 恢复函数名
2. 分析 Dart 类结构
3. 追踪方法调用
4. 理解程序逻辑网络请求分析
1. 搜索 URL 字符串
2. 分析 HTTP 客户端
3. 查看请求参数
4. 分析响应处理常见问题
工具跑不起来
Flutter 版本差异大。先做基础静态观察,再选择工具,不要只依赖一个脚本。
找不到 Dart 函数名
发布版可能去符号化。结合字符串、交叉引用、网络接口、输入输出行为分析。
APK 里没有 libapp.so
可能不是 Flutter,或架构目录不同。先用 JADX、DIE、file 判断。
工具版本不匹配
1. 检查 Flutter 版本
2. 查看工具支持的版本
3. 尝试不同工具
4. 使用静态分析作为备选反编译结果不完整
1. 使用多个工具对比
2. 结合静态和动态分析
3. 关注字符串和常量
4. 分析网络请求关联
- Flutter逆向基础
- APK逆向基础
- JNI深入
- JADX
- Ghidra
- Frida