[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81881":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":29,"discoverSource":30},81881,"eBPFDexDumper-rs","chinleez\u002FeBPFDexDumper-rs","chinleez","面向 Android ARM64 的 eBPF DEX dump 工具。","",null,"C",54,11,49,0,2,4,5,6,3.24,"GNU General Public License v3.0",false,"main",true,[],"2026-06-12 02:04:20","# eBPFDexDumper-rs\n\n[![Release](https:\u002F\u002Fgithub.com\u002Fchinleez\u002FeBPFDexDumper-rs\u002Factions\u002Fworkflows\u002Frelease.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fchinleez\u002FeBPFDexDumper-rs\u002Factions\u002Fworkflows\u002Frelease.yml)\n[![Latest Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fchinleez\u002FeBPFDexDumper-rs)](https:\u002F\u002Fgithub.com\u002Fchinleez\u002FeBPFDexDumper-rs\u002Freleases\u002Flatest)\n[![Downloads](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fchinleez\u002FeBPFDexDumper-rs\u002Ftotal)](https:\u002F\u002Fgithub.com\u002Fchinleez\u002FeBPFDexDumper-rs\u002Freleases)\n\n[English](docs\u002FREADME_EN.md) | 中文\n\n面向 Android 13-17 ARM64 的 eBPF DEX dump 工具。用于在已 root 设备上通过 eBPF\u002FuProbe 捕获 ART 运行时中的 DEX，记录执行过的方法字节码，并可将字节码回填到已 dump 的 DEX。\n\n## 功能\n\n- `dump`：通过 ART 入口、DexFile 注册\u002F构造、CodeItem 反扫、maps 扫描和 native buffer 扫描捕获 DEX。\n- `fix`：把记录到的方法字节码回填到 DEX，修复版保留在 `fix\u002F`，最终可用结果汇总到 `final\u002F`。\n- `offsets`：从 `libart.so` 定位 hook 目标，必要时可手动指定 ART layout。\n\n## 环境\n\n- 编译：Rust stable、LLVM clang、Android NDK。\n- 运行：Android ARM64、root、内核支持 eBPF、可访问 ART `libart.so`。\n\n## 编译\n\n```bash\ncargo build\nsh build_android.sh\n```\n\n## 使用\n\n```bash\n.\u002FeBPFDexDumper --help\nsu -c '.\u002FeBPFDexDumper dump -n com.example.app -o \u002Fdata\u002Flocal\u002Ftmp\u002Fdex_out'\nsu -c '.\u002FeBPFDexDumper dump -u 10123 -o \u002Fdata\u002Flocal\u002Ftmp\u002Fdex_out'\nsu -c '.\u002FeBPFDexDumper dump -n com.example.app --probe-mode lifecycle'\nsu -c '.\u002FeBPFDexDumper dump -n com.example.app --native-elf-scan'\n.\u002FeBPFDexDumper fix -d \u002Fdata\u002Flocal\u002Ftmp\u002Fdex_out\u002Fcom.example.app\n.\u002FeBPFDexDumper fix -d \u002Fdata\u002Flocal\u002Ftmp\u002Fdex_out\u002Fcom.example.app --force-mismatch\n.\u002FeBPFDexDumper offsets -l \u002Fapex\u002Fcom.android.art\u002Flib64\u002Flibart.so\n.\u002FeBPFDexDumper offsets -l \u002Fapex\u002Fcom.android.art\u002Flib64\u002Flibart.so --json\n```\n\n## 说明\n\n### 输出目录与 auto-fix\n\n`dump` 会在 `-o` 指定的根目录下按目标自动建子目录：`--name` 用包名（如 `com.example.app\u002F`），仅 `--pid` 时用 `\u002Fproc\u002F\u003Cpid>\u002Fcmdline` 推断，回落 `pid_\u003Cnum>\u002F`，仅 `--uid` 时用 `uid_\u003Cnum>\u002F`。子目录里会落入 `dex_*.dex`（原始 dump）、`dex_*_code.json`（方法字节码记录）、`fix\u002F`、`final\u002F`，开 `--native-elf-scan` 时还有 `native_elf\u002F`。\n\n`dump` 默认会在退出时执行 `fix`（`--no-auto-fix` 关闭）。原始 `dex_*.dex` 始终保留；`fix\u002F` 存放回填后的 DEX；`final\u002F` 是最终使用目录，对每个 base 优先放 `fix\u002F` 里的修复版，缺 `_code.json` 或修复失败时退回原始 DEX。\n\n### `fix` 行为\n\n默认严格模式：当 record 的字节长度与 DEX 头里 `insns_size * 2` 不一致时跳过该 record，避免补 0\u002F截断破坏指令流；如需保留旧的截断\u002F补零行为，加 `--force-mismatch`。\n\n`fix` 同时会输出方法覆盖率报告：控制台打印 `Coverage: A\u002FB methods (P%), N missed` 一行，统计 DEX 里所有 `code_off != 0` 的方法（abstract\u002Fnative 不计）；当存在未抓到的方法时，详细清单写入 `final\u002F\u003Cbase>_missed.json`，每条含 `method_idx`、`code_off` 和（尽量解析到的）方法签名，便于判断是否需要扩大 trace 窗口再跑一次。\n\n### `--clean-oat`（破坏性默认）\n\n`--clean-oat` 默认开启，会在 dump 前删除目标 app `\u002Fdata\u002Fapp\u002F...\u002Foat\u002F` 目录以强制 ART 走解释器。**这是有破坏性的默认行为**（删除会保留到下次 oat 重建），要保留 oat 加 `--no-clean-oat`。\n\n### 适配：ART layout 与探针模式\n\n默认 ART layout 按 Android 13+ 常见布局处理；ROM 偏移不一致时使用 `--art-layout`。如果目标只在 native 层短暂解密碎片化方法体，内存中不保留连续合法 DEX，需要按壳适配。\n\n`--probe-mode full|lifecycle|maps-only` 用于按场景收窄探针面：`full` 为默认全量 ART\u002Flibc uprobe；`lifecycle` 只保留 DexFile 生命周期探针和 maps 扫描；`maps-only` 不挂 uprobe，只做 `\u002Fproc\u002F\u003Cpid>\u002Fmaps` 内存扫描。uprobe 在目标映射上仍可能留下可检测痕迹，强反调试目标可先尝试 `lifecycle` 或 `maps-only`。\n\n### 实验选项\n\n`--native-elf-scan` 会复用 libc `mmap`\u002F`mprotect` 事件识别匿名可执行 ARM64 ELF 候选块，并保存到输出子目录的 `native_elf\u002F`。它只作为隐藏 native loader 行为的辅助排查，不影响默认 DEX dump 和回填流程。\n\n---\n\n完整选项见 `--help`，包括 `-p\u002F--pid`、`-t\u002F--trace`、`--debug-layout`、`--no-code-item-fallback`、`--no-maps-scan`、`--no-native-buffer-scan`、`--libc` 等。\n\n## 许可证\n\n`GPL-3.0-or-later`。仓库内 Linux BPF helper 头文件的 BSD-2-Clause 许可证位于 `headers\u002FLICENSE.BSD-2-Clause`。\n\n请只在你有权分析的设备、应用和数据上使用本项目。\n\n## 参考\n\n本项目参考了 [LLeavesG\u002FeBPFDexDumper](https:\u002F\u002Fgithub.com\u002FLLeavesG\u002FeBPFDexDumper) 的部分实现逻辑。\n","eBPFDexDumper-rs 是一个面向 Android ARM64 设备的 eBPF DEX dump 工具，能够在已 root 的设备上通过 eBPF\u002FuProbe 技术捕获 ART 运行时中的 DEX 文件，并记录执行过的方法字节码。其核心功能包括通过多种方式（如 ART 入口、DexFile 注册\u002F构造等）捕获 DEX，以及将记录到的方法字节码回填到 DEX 中以修复可能存在的不完整性。此外，该工具还支持从 `libart.so` 定位 hook 目标，适应不同版本的 ART 布局。适用于需要对 Android 应用进行逆向分析或安全研究的场景，特别是当目标应用使用了复杂的加密或混淆技术时。此项目采用 C 语言编写，编译和运行环境要求 Rust、LLVM clang 和 Android NDK 等工具链的支持。","2026-06-11 04:07:03","CREATED_QUERY"]