caverav/flutterdec
GitHub: caverav/flutterdec
一款专注于 Flutter Android AOT 产物的静态反编译工具,可将 libapp.so 转换为可读的 Dart 伪代码,支持混淆构建和版本差异分析。
Stars: 9 | Forks: 0
# flutterdec
[](https://github.com/caverav/flutterdec/actions/workflows/ci.yml)
[](https://github.com/caverav/flutterdec/actions/workflows/release.yml)
`flutterdec` 是一个针对 Android ARM64 二进制文件的静态 Flutter AOT 反编译研究工具。
它接收一个 APK(或 `libapp.so`)并生成可读的伪 Dart 代码,以及可选的 IR/ASM 产物。
## 北极星目标
从 Flutter AOT ARM64 二进制文件中恢复具有足够语义结构的可读行为,以便基于伪代码和报告做出逆向工程决策。
### 主要目标
- 从快照和元数据(库、类、函数、选择器、池语义)中进行稳健的语义提取
- 为 Android ARM64 发布版本提供稳定的、面向逆向工程的伪代码输出
- 版本感知的适配器行为,无需重写核心/反编译器逻辑即可更新
### 非目标(当前范围)
- 完美重建原始 Dart 代码的源码
- 同等成熟度下的广泛多架构支持(x86、iOS、JIT 模式)
- 将动态运行时模拟作为默认分析路径
## 适用人群
- 逆向工程师和安全研究人员
- Flutter 内部机制研究人员
- 对比 stripped/unstripped 引擎构建版本的开发者
## 快速开始
1. 使用 `nix run` 运行(推荐,无需安装):
```
nix run github:caverav/flutterdec -- --help
nix run github:caverav/flutterdec -- info ./sample.apk --json
```
从此仓库检出的目录运行:
```
nix run . -- --help
```
2. 安装发布二进制文件(`v0.1.0-alpha.1`):
Linux x64:
```
curl -fLO https://github.com/caverav/flutterdec/releases/download/v0.1.0-alpha.1/flutterdec-v0.1.0-alpha.1-Linux-X64.tar.gz
tar -xzf flutterdec-v0.1.0-alpha.1-Linux-X64.tar.gz
sudo install -m 0755 flutterdec /usr/local/bin/flutterdec
flutterdec --help
```
macOS arm64:
```
curl -fLO https://github.com/caverav/flutterdec/releases/download/v0.1.0-alpha.1/flutterdec-v0.1.0-alpha.1-macOS-ARM64.tar.gz
tar -xzf flutterdec-v0.1.0-alpha.1-macOS-ARM64.tar.gz
sudo install -m 0755 flutterdec /usr/local/bin/flutterdec
flutterdec --help
```
其他平台及未来标签:
[发布页面](https://github.com/caverav/flutterdec/releases)
3. 其他选项:
安装到用户 Cargo bin 目录(需要启用 flakes 的 Nix):
```
nix develop -c cargo install --path crates/flutterdec-cli
~/.cargo/bin/flutterdec --help
```
不安装直接从源码运行:
```
nix develop -c cargo run -p flutterdec-cli -- info ./sample.apk --json
```
构建本地发布二进制文件:
```
nix develop -c cargo build -p flutterdec-cli --release
./target/release/flutterdec --help
```
## 典型工作流程
1. 检查目标:
```
flutterdec info ./sample.apk --json
```
当适配器元数据可用时,`info` 现在包含检测到的应用包候选项(`app_package_counts_top`)。
对于 APK 输入,它还会报告 Android 启动摘要字段:`android_startup_present`、`android_startup_confidence`、`android_startup_entrypoint_count` 和 `android_startup_flutter_activity_count`。
2. 为检测到的 Dart 哈希安装适配器:
```
flutterdec adapter install --dart-hash
```
3. 反编译:
```
flutterdec decompile ./sample.apk -o ./out
```
默认情况下,`decompile` 专注于应用逆向(`--function-scope app-unknown`),并排除已知的 Flutter/Dart 框架内部结构。
包含所有函数(app + Flutter + Dart/runtime):
```
flutterdec decompile ./sample.apk -o ./out --function-scope all
```
仅关注特定的 Dart 包(可重复使用):
```
flutterdec decompile ./sample.apk -o ./out \
--function-scope app-unknown \
--app-package my_app
```
如果包名未知,请检查 `report.json` 中的 `function_scope.app_package_counts_top`。
当未提供 `--app-package` 时,上限优先级逻辑也会应用清单派生的包提示(`function_scope.priority_package_hints`)来优先处理应用自有代码(包括适用的规范化变体,如 `localsend_app` 和 `localsend`)。
针对单个函数进行面向开发者的反编译/反汇编:
```
flutterdec decompile ./sample.apk -o ./out \
--target va:0x613468 \
--emit-asm
```
`--target` 接受 `id:`、`va:0x`、`0x` 或 ``(自动匹配 id/地址)。
如果 `` 存在歧义,`flutterdec` 会要求明确指定 `id:` 或 `va:`。选择详情会输出在 `report.json.target_selection` 中。
4. 可选:使用 stripped/unstripped 引擎对改进调用名称:
```
flutterdec map-symbols \
--stripped ./libflutter.stripped.so \
--unstripped ./libflutter.unstripped.so \
-o ./out/symbol-map \
--register-local-cache
flutterdec decompile ./sample.apk -o ./out \
--extra-symbol-elf ./libflutter.unstripped.so
```
如果缓存的引擎构建 id 与 APK 内嵌的 `libflutter.so` 匹配,`decompile` 会自动加载缓存的 `symbol_target_summary.json` 并在 `report.json.engine_symbol_ingestion` 下报告。
5. 可选:通过恢复的函数签名比较两个构建版本:
```
flutterdec diff --old ./old.apk --new ./new.apk -o ./out-diff --json
```
`diff_report.json` 包含增加/删除/通用的函数计数,以及 `added_packages_top` 和 `removed_packages_top` 摘要。
6. 可选:为逆向工程工具生成导入脚本:
```
flutterdec decompile ./sample.apk -o ./out \
--emit-ghidra-script \
--emit-ida-script
```
## 分析配置
`decompile` 暴露了分析引擎的配置,以便您在详细程度和速度之间进行权衡。
默认配置:
- `balanced`(推荐)
可用配置:
- `balanced`:完整的语义命名/提示/报告
- `light`:更低开销的分析,用于更快的大规模运行
示例:
```
flutterdec decompile ./sample.apk -o ./out --analysis-profile light
```
适配器后端选择:
- `--adapter-backend auto`(默认):如果已配置,尝试 Blutter 后端,否则回退到内部适配器
- `--adapter-backend internal`:强制使用内部快照字符串适配器
- `--adapter-backend blutter`:要求使用 Blutter 后端(如果不可用则失败)
- `--require-snapshot-hash-match`:当适配器报告的快照哈希与加载器快照哈希不匹配时提前失败
Blutter 后端环境变量:
- `FLUTTERDEC_BLUTTER_CMD`:启动 Blutter 的完整命令(例如 `python3 /path/to/blutter.py`)
- `FLUTTERDEC_BLUTTER_PY`:`blutter.py` 的路径(使用当前 Python 解释器)
Nix 集成:
- `nix develop` 现在提供 `flutterdec-blutter` 并自动将 `FLUTTERDEC_BLUTTER_CMD` 导出给该封装器。
- 您也可以通过 `nix run .#blutter-bridge -- --help` 直接运行该封装器。
您可以显式启用/禁用单个引擎开关:
- `--with-canonical-model-symbols` / `--no-canonical-model-symbols`
- `--with-pool-value-hints` / `--no-pool-value-hints`
- `--with-pool-semantic-hints` / `--no-pool-semantic-hints`
- `--with-semantic-reporting` / `--no-semantic-reporting`
- `--with-bootflow-category-seeds` / `--no-bootflow-category-seeds`
- `--with-apk-startup-analysis` / `--no-apk-startup-analysis`
## 输出
`-o ` 下的主要输出:
- `pseudocode/*.dartpseudo`
- `quality.json`
- `report.json`
- `diff_report.json`(如果运行 `flutterdec diff`)
- `asm/*.s`(如果使用了 `--emit-asm`)
- 带操作码前缀的 asm 行(如果使用了 `--emit-asm --emit-asm-opcodes`)
- `ghidra_apply_symbols.py`(如果使用了 `--emit-ghidra-script`;应用符号名称和池加载注释)
- `ida_apply_symbols.py`(如果使用了 `--emit-ida-script`;在 IDA 中应用符号名称和池加载注释)
- `ir/*.json`(如果使用了 `--emit-ir`)
`report.json` 还包括:
- `compatibility`:用于模式/哈希/清单对齐诊断
- `android_manifest`:用于清单派生的启动器/深度链接/Activity 信号
- `android_startup`:用于 APK 字节码启动证据,例如嵌入调用、JNI 引导阶段,以及恢复的 `DartEntrypoint` 调用点(如果存在)
- 恢复的 `android_startup.dart_entrypoints` 条目现在可以包含 `function_name`、`library_uri` 和 `app_bundle_path`(当这些值可直接从 APK 字节码恢复时)
- `android_startup.bootstrap_chain`:按源方法总结观察到的 Android 嵌入器启动阶段,包括应用与框架所有权、有序阶段、完整性及缺失步骤
- `engine_symbol_ingestion`:用于按键为 `libflutter.so` 构建 id 自动加载的本地引擎符号缓存匹配
- `bootflow_discovery` 条目按 `source`(`adapter`、`manifest`、`apk_startup`)标记;当启动信号真实但 Dart 函数尚未映射时,APK 启动支持的条目可能以 `target_va: null` 出现
## 文档
- 用户指南:[docs/user-guide.md](docs/user-guide.md)
- CLI 参考:[docs/cli-reference.md](docs/cli-reference.md)
- 开发指南:[docs/development.md](docs/development.md)
- 架构:[docs/architecture.md](docs/architecture.md)
- 内部机制演练:[docs/how-it-works.md](docs/how-it-works.md)
- 研究决策:[docs/research-decisions.md](docs/research-decisions.md)
- 贡献指南:[CONTRIBUTING.md](CONTRIBUTING.md)
- 背景与项目历史:[context.md](context.md)
## Issue 类型
- 错误报告:[新建 Bug Issue](https://github.com/caverav/flutterdec/issues/new?template=bug_report.md)
- 功能请求:[新建功能 Issue](https://github.com/caverav/flutterdec/issues/new?template=feature_request.md)
- 研究发现:[新建研究 Issue](https://github.com/caverav/flutterdec/issues/new?template=research_finding.md)
标签:AOT, APK分析, ARM64, Dart, Flutter, libapp.so, Nix, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码混淆, 伪代码, 反编译器, 可视化界面, 安卓, 文档结构分析, 目录枚举, 移动安全, 逆向工具, 逆向工程, 通知系统, 静态分析