基于 eBPF 技术的 Android 内存 DEX 转储工具。
- 不可检测: 使用 eBPF 探针进行隐蔽操作
- 被动转储: 非侵入式内存分析
- 实时追踪: 可选的方法执行监控
- 自动修复: 内置 DEX 文件修复功能
- 高性能: 使用无锁缓存和优化的字符串处理
- 简化操作: 智能默认配置,一条命令完成转储和修复
展示: https://blog.lleavesg.top/article/eBPFDexDumper
- 测试环境: Android 13 (Pixel 6)
- 架构: ARM64
- 要求: 需要 Root 权限
注意: 在其他 Android 版本上可能需要微调并重新编译。
工具默认会自动删除应用的 OAT 优化输出以避免 cdex 或空结果。如需手动操作:
- 查找基础路径:
pm path <package> - 删除 oat 文件夹: 删除
/data/app/.../<package>/下的应用oat/目录
通常需要 Root 权限来附加探针和读取目标内存。
eBPFDexDumper [命令] [选项]
可用命令:
dump- 启动基于 eBPF 的 DEX 转储器fix- 修复目录中的转储 DEX 文件
将探针附加到 libart 并流式传输 DEX/方法事件。您必须提供 --uid 或 --name 之一来过滤目标应用。
选项:
--uid, -u <uid>- 按 UID 过滤(--name的替代方案)(默认值:0)--name, -n <package>- Android 包名以派生 UID(--uid的替代方案)--libart, -l <path>- libart.so 路径(默认值:/apex/com.android.art/lib64/libart.so)--out, -o, --output <dir>- 设备上的输出目录(默认值:/data/local/tmp/dex_out)--trace, -t- 在转储期间实时打印执行的方法(默认值:false)--clean-oat, -c- 在转储前删除目标应用的/data/app/.../oat文件夹(默认值:true)--auto-fix, -f- 转储完成后自动修复 DEX 文件(默认值:true)--no-clean-oat- 禁用自动清理 OAT--no-auto-fix- 禁用自动修复 DEX--execute-offset <value>- art::interpreter::Execute 函数的手动偏移量(十六进制值,例如 0x12345)(不指定参数会自动寻找)--nterp-offset <value>- ExecuteNterpImpl 函数的手动偏移量(十六进制值,例如 0x12345)(不指定参数会自动寻找)
示例:
# 最简用法 - 只需指定包名,自动完成转储+清理OAT+修复DEX
./eBPFDexDumper dump -n com.example.app
# 按 UID 过滤
./eBPFDexDumper dump -u 10244
# 启用实时方法追踪输出
./eBPFDexDumper dump -n com.example.app -t
# 自定义输出目录
./eBPFDexDumper dump -n com.example.app -o /sdcard/dex_out
# 禁用自动修复(只转储不修复)
./eBPFDexDumper dump -n com.example.app --no-auto-fix
# 禁用自动清理 OAT
./eBPFDexDumper dump -n com.example.app --no-clean-oat
# 为特定 ART 版本使用手动偏移量
./eBPFDexDumper dump -n com.example.app --execute-offset 0x12345 --nterp-offset 0x67890输出文件:
- DEX 文件:
dex_<begin>_<size>.dex保存在输出目录下 - 方法字节码 JSON:
dex_<begin>_<size>_code.json在关闭时保存(SIGINT/SIGTERM)或正常退出 - 修复后的 DEX:
fix/dex_<begin>_<size>_fix.dex自动修复后保存在fix子目录
扫描目录中的转储 DEX 文件并修复头部/结构以提高可读性。
选项:
--dir, -d <dir>- 包含转储 DEX 文件的目录(必需)
示例:
./eBPFDexDumper fix -d /data/local/tmp/out- Go 1.19+ 用于构建应用程序
- Android NDK 用于交叉编译
- Android 设备 具有 ARM64 架构
- 目标 Android 设备上的 Root 访问权限
-
克隆仓库:
git clone https://github.com/LLeavesG/eBPFDexDumper.git cd eBPFDexDumper -
如有必要调整 NDK 路径,然后构建:
# pull btf file ./build_env.sh # build ./build.sh
-
推送到 Android 设备:
adb push eBPFDexDumper /data/local/tmp/ adb shell chmod +x /data/local/tmp/eBPFDexDumper
脱壳工具可以自己寻找NterpExecuteImpl函数的偏移,方法是通过字节码匹配实现
F0 0B 40 D1 1F 02 40 B9 FF 83 02 D1 E8 27 00 6D EA 2F 01 6D EC 37 02 6D EE 3F 03 6D F3 53 04 A9 F5 5B 05 A9 F7 63 06 A9 F9 6B 07 A9 FB 73 08 A9 FD 7B 09 A9 16 08 40 F9
而对于Execute函数,需要在IDA中打开libart.so,搜索字符串"Interpreting",然后查看哪些函数引用了这个字符串,通常会有两个函数引用它,而其中一个函数的传入参数数量为6,那么这个函数就是我们要找的Execute函数

1.UID而非PID 请勿使用-u指定应用程序pid,必须指定uid,或直接使用-n指定包名
2. 找不到二进制文件
# 验证文件是否正确推送
adb shell ls -la /data/local/tmp/eBPFDexDumper
# 确保执行权限
adb shell chmod +x /data/local/tmp/eBPFDexDumper3. 空或不完整的 DEX 文件
- 确保目标应用正在运行(工具默认已开启
--clean-oat) - 如果问题持续,尝试手动偏移值
- 检查是否有足够权限读取目标进程内存
4. 找不到 libart.so
# 在您的设备上查找 libart.so 位置
adb shell find /apex -name "libart.so" 2>/dev/null
adb shell find /system -name "libart.so" 2>/dev/null- cilium/ebpf - Go 的 eBPF 库
- ebpfmanager - Go + eBPF管理库
- stackplz - StackPlz eBPF Tools
- eDBG - eDBG eBPF Debugger
- null-luo/btrace - 二进制追踪工具
- ART 内部结构
- Android 运行时分析
- DEX 文件格式
- Android 安全研究
- Android 上的 eBPF
- 高级混淆技术
- eBPF 文档
欢迎贡献!请随时提交 Pull Request。
此工具仅用于教育和防御性安全研究目的。用户有责任确保符合适用的法律法规。

