Skip to content

LLeavesG/eBPFDexDumper

Repository files navigation

eBPFDexDumper

Language Platform

中文 | English

基于 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 文件

dump 命令

将探针附加到 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 子目录

alt text

fix 命令

扫描目录中的转储 DEX 文件并修复头部/结构以提高可读性。

选项:

  • --dir, -d <dir> - 包含转储 DEX 文件的目录(必需)

示例:

./eBPFDexDumper fix -d /data/local/tmp/out

alt text

安装与构建

要求

  • Go 1.19+ 用于构建应用程序
  • Android NDK 用于交叉编译
  • Android 设备 具有 ARM64 架构
  • 目标 Android 设备上的 Root 访问权限

构建说明

  1. 克隆仓库:

    git clone https://github.com/LLeavesG/eBPFDexDumper.git
    cd eBPFDexDumper
  2. 如有必要调整 NDK 路径,然后构建:

    # pull btf file
    ./build_env.sh
    
    # build
    ./build.sh
  3. 推送到 Android 设备:

    adb push eBPFDexDumper /data/local/tmp/
    adb shell chmod +x /data/local/tmp/eBPFDexDumper

故障排除

高版本Android中libart.so去除符号后如何寻找函数正确的偏移

脱壳工具可以自己寻找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函数 alt text alt text

常见问题

1.UID而非PID 请勿使用-u指定应用程序pid,必须指定uid,或直接使用-n指定包名

2. 找不到二进制文件

# 验证文件是否正确推送
adb shell ls -la /data/local/tmp/eBPFDexDumper

# 确保执行权限
adb shell chmod +x /data/local/tmp/eBPFDexDumper

3. 空或不完整的 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

参考资料

贡献

欢迎贡献!请随时提交 Pull Request。

免责声明

此工具仅用于教育和防御性安全研究目的。用户有责任确保符合适用的法律法规。

About

eBPF-Based DexDumper for Android

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages