caverav/flutterdec

GitHub: caverav/flutterdec

一款专注于 Flutter Android AOT 产物的静态反编译工具,可将 libapp.so 转换为可读的 Dart 伪代码,支持混淆构建和版本差异分析。

Stars: 9 | Forks: 0

# flutterdec [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/f44ba97a58214329.svg)](https://github.com/caverav/flutterdec/actions/workflows/ci.yml) [![Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d6757f34e3214330.svg)](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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码混淆, 伪代码, 反编译器, 可视化界面, 安卓, 文档结构分析, 目录枚举, 移动安全, 逆向工具, 逆向工程, 通知系统, 静态分析