MachineCase/blutter-macos
GitHub: MachineCase/blutter-macos
该项目提供补丁和脚本,使 Dart AOT 逆向工具 blutter 能够支持分析 macOS 独立编译的 Dart 二进制文件。
Stars: 2 | Forks: 0
# blutter-macos
用于在 macOS 独立 Dart AOT 二进制文件(`dart compile exe`)上运行 [blutter](https://github.com/worawit/blutter) 的补丁和脚本。
Blutter 支持 Android `libapp.so` 和 iOS `App.framework`。本项目将其扩展至 macOS 独立程序,在这种情况下,snapshot 作为 `LC_NOTE` 嵌入在外部二进制文件中,而不是在单独的文件中。
参见详细说明:[machinecase.github.io/posts/dart-reverse-macos](https://machinecase.github.io/posts/dart-reverse-macos/)
## 工作原理
`dart compile exe` 会生成一个单一的 Mach-O 文件,其中包含 Dart VM runtime(你在 Binary Ninja 中看到的内容)和编译好的 app snapshot(你想要分析的内容),后者作为不透明数据嵌入在名为 `__dart_app_snap` 的 `LC_NOTE` 中。
这些脚本会提取内部的 Mach-O,并将其封装在一个合成的 ELF 中,以便 blutter 可以使用其现有的 ELF 代码路径进行解析。
## 用法
```
# 1. 提取内部 Mach-O 并创建 ELF 包装器
python3 scripts/extract_snapshot.py ./binary /tmp/analysis/
# 2. 对 blutter 应用补丁
cd /path/to/blutter
git apply /path/to/blutter-macos/patches/macos_standalone_aot.patch
# 3. 运行 blutter
python3 blutter.py \
/tmp/analysis/dart_snapshot.so \
/tmp/analysis/blutter_out \
--dart-version 3.11.4_macos_arm64
# 4. 甄别
grep "String:" /tmp/analysis/blutter_out/pp.txt | grep -v "dart:"
# 5. 将符号导入 Binary Ninja
# 打开 inner.macho,然后在 Python Console 中:
exec(open('scripts/import_symbols_bn.py').read())
```
## 补丁
blutter 中有四个文件需要修改:
- `scripts/CMakeLists.txt` — 将 `macos` 添加为有效的 `TARGET_OS` 并附带正确的定义
- `dartvm_fetch_build.py` — macOS 独立程序使用 `no-compressed-pointers`
- `blutter/src/ElfHelper.cpp` — 在 Mach-O 路径之前检测 ELF magic,修复 `MH_MAGIC_64` 情况,并取消 `mach_o.h` include 的注释
- `blutter/src/Disassembler_arm64.h` — 将 `CSREG_DART_HEAP` 移至 `#ifdef DART_COMPRESSED_POINTERS` 外部
## 测试环境
Dart 3.11.4,macOS ARM64 (Apple Silicon)。
## 鸣谢
- [worawit/blutter](https://github.com/worawit/blutter) 原始工具
- [@m4xfr0m](https://twitter.com/m4xfr0m)
标签:Bash脚本, Binary Ninja, Dart, Mach-O, Python, 二进制分析, 云安全运维, 无后门, 逆向分析, 逆向工具