{
  "added_at": "2026-11-03",
  "additional_evidence_urls": [
    "https://github.com/rscloura/Doldrums/blob/7430196818673ca5c5e10d65685e2b4a8de38dbb/src/main.py",
    "https://github.com/rscloura/Doldrums/blob/7430196818673ca5c5e10d65685e2b4a8de38dbb/src/BaseConstants.py",
    "https://github.com/rscloura/Doldrums/blob/7430196818673ca5c5e10d65685e2b4a8de38dbb/src/v2_12/Snapshot.py",
    "https://github.com/rscloura/Doldrums/blob/7430196818673ca5c5e10d65685e2b4a8de38dbb/src/v2_12/Resolver.py",
    "https://github.com/rscloura/Doldrums/tree/7430196818673ca5c5e10d65685e2b4a8de38dbb/tests",
    "https://rloura.wordpress.com/2020/12/04/reversing-flutter-for-android-wip/"
  ],
  "category": "android",
  "description_en": "Python parser for the Dart AOT snapshots inside libapp.so, the compiled Dart code of an Android Flutter app. It finds the VM and isolate snapshot symbols with pyelftools, deserializes the snapshot clusters and writes a text dump of every class in the isolate snapshot, with fields, method signatures and each method's absolute code offset in libapp.so. It recovers declarations and offsets for further disassembly, not decompiled function bodies.",
  "description_zh": "用 Python 编写的解析器，处理 Android Flutter 应用中存放编译后 Dart 代码的 libapp.so 里的 Dart AOT 快照。它借助 pyelftools 定位 VM 与 isolate 快照符号，反序列化快照中的各个簇（cluster），并把 isolate 快照中的全部类导出为文本，列出字段、方法签名以及每个方法在 libapp.so 中的绝对代码偏移。它恢复的是声明和偏移，供进一步反汇编使用，并不反编译函数体。",
  "entry_url": "https://awesomerea.org/resources/doldrums/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/doldrums/",
  "evidence_url": "https://github.com/rscloura/Doldrums/blob/7430196818673ca5c5e10d65685e2b4a8de38dbb/README.md",
  "group": "tools",
  "id": "doldrums",
  "json_url": "https://awesomerea.org/resources/doldrums/record.json",
  "kind": "tool",
  "markdown_url": "https://awesomerea.org/resources/doldrums/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/doldrums/index.md",
  "name": "Doldrums",
  "name_zh": "Doldrums Flutter/Dart 快照解析器",
  "record_type": "resource",
  "relationship": "foundation",
  "requirements": [
    "Reviewed at main commit 7430196 (2022-05-01), the last push; there are no releases, and the README calls the tool beta and still missing some deserialization routines and class information. main.py accepts only the snapshot hashes of Dart 2.10 and Dart 2.12, rejects Dart 2.13 as work in progress and any other SDK as unsupported, so apps built with newer Dart releases are out of scope.",
    "Input is the libapp.so ELF of an Android Flutter app, with its _kDartVmSnapshot* and _kDartIsolateSnapshot* symbols. The tests directory commits Dart 2.10 libapp.so builds of a small sample counter app (package sandbox_flutter) for arm64-v8a, armv7 and x64, plus text dumps of the arm64 and x64 builds as reference output; there is no test runner.",
    "Runs as python3 src/main.py [-v] libapp.so output with pyelftools as the only dependency; there is no packaging or declared Python version. The README notes that the verbose option works only for Dart 2.12 snapshots, and that darter is a fully tested parser for the older Dart 2.5.",
    "The author's blog post documents the snapshot format the parser follows. No license file is present and GitHub detects none, so reuse terms are unstated."
  ],
  "requirements_zh": [
    "审阅对象为 main 分支提交 7430196（2022-05-01），也是最后一次推送；仓库没有发行版，README 称该工具仍处于 beta 阶段，尚缺部分反序列化例程和类信息。main.py 只接受 Dart 2.10 和 Dart 2.12 的快照哈希，把 Dart 2.13 视为开发中而拒绝，其他 SDK 一律视为不支持，因此用更新的 Dart 版本构建的应用不在其适用范围内。",
    "输入为 Android Flutter 应用的 libapp.so ELF 文件，其中须带有 _kDartVmSnapshot* 与 _kDartIsolateSnapshot* 符号。tests 目录提交了一个小型示例计数器应用（包名 sandbox_flutter）的 Dart 2.10 libapp.so 构建，涵盖 arm64-v8a、armv7 和 x64，并附有 arm64 与 x64 构建的文本导出作为参考输出；仓库没有测试运行脚本。",
    "运行方式为 python3 src/main.py [-v] libapp.so output，唯一依赖是 pyelftools；项目没有打包，也未声明 Python 版本。README 说明 verbose 选项只适用于 Dart 2.12 快照，并指出 darter 是针对更早的 Dart 2.5 且经过完整测试的解析器。",
    "作者的博客文章记录了该解析器所依据的快照格式。仓库没有许可证文件，GitHub 也未识别出许可证，因此复用条款未予说明。"
  ],
  "targets": [
    "app",
    "binary"
  ],
  "url": "https://github.com/rscloura/Doldrums",
  "verification": "source-reviewed",
  "verified_at": "2026-10-27"
}
