ZjDroid 是什么
ZjDroid 是一个基于 Xposed 框架的 Android 应用动态逆向分析工具。
它本身是一个 Xposed 模块(包名 com.android.reverse)。当目标 App 运行时,ZjDroid 会通过 Xposed 注入到目标进程内部,然后逆向分析者只需通过 adb 发送一条广播指令,就能驱动目标进程完成脱壳、内存 dump、API 监控等动作。
一句话定位
ZjDroid 让你能在不修改目标 APK 的前提下,在 App 运行时"打开它的黑盒"——把它加载的真实代码、调用的敏感 API、内存里的数据全部暴露出来。
它是怎么工作的
整个工具的运行分为三个层次:
注入层:作为 Xposed 模块,在每个非系统 App 启动时被加载。入口类
ReverseXposedModule实现IXposedHookLoadPackage,在handleLoadPackage中完成初始化。Hook 层:注入后,ZjDroid 会 hook 掉 Dalvik 的 DEX 加载入口(
openDexFileNative)、Application.onCreate、以及一大批敏感 API。这样它就能"知道"目标 App 什么时候加载了什么 DEX、调用了什么敏感方法。指令层:ZjDroid 在目标进程内注册了一个
BroadcastReceiver,监听com.zjdroid.invoke广播。你通过adb shell am broadcast发出的指令会被这个接收器解析并执行,结果通过logcat输出。
┌──────────────────────────────────────────────────────────┐
│ 你的电脑 │
│ adb shell am broadcast -a com.zjdroid.invoke ... │
└─────────────────────────┬────────────────────────────────┘
│ Android 广播
▼
┌──────────────────────────────────────────────────────────┐
│ 目标 App 进程(已被 ZjDroid 通过 Xposed 注入) │
│ │
│ CommandBroadcastReceiver ← 接收广播 │
│ │ │
│ ▼ │
│ CommandHandlerParser ← 解析 JSON 指令 │
│ │ │
│ ▼ │
│ XxxCommandHandler ← 执行(脱壳/dump/监控...) │
│ │ │
│ ▼ │
│ logcat(zjdroid-shell-{包名} / zjdroid-apimonitor-{包名}) │
└──────────────────────────────────────────────────────────┘整体定位
八大能力
| 能力 | 作用 |
|---|---|
| DEX 内存 Dump | 导出进程内存中已加载的 DEX |
| 内存 BackSmali 脱壳 | 从内存直接反编译 DEX,破解加固 |
| DEX 加载信息收集 | 列出当前加载的所有 DEX 及其内存指针 |
| 类信息枚举 | 列出指定 DEX 中可加载的类名 |
| 内存区域 Dump | 导出任意内存地址范围的数据 |
| Dalvik 堆 Dump | 导出 Java 堆快照(.hprof) |
| Lua 脚本注入 | 在目标进程内运行 Lua 调 Java |
| 敏感 API 监控 | 监控短信/网络/定位等敏感调用 |
时代背景
ZjDroid 面向 Dalvik 运行时(Android 2.2 ~ 4.3,minSdkVersion=8、targetSdkVersion=18)。它的脱壳原理深度依赖 Dalvik 的内部数据结构(mCookie、DexFile 指针表)。这意味着:
- 在 Dalvik 设备上,它是脱壳利器;
- 在 ART 运行时(Android 5.0+)上,由于底层结构完全不同,其核心脱壳能力不再适用。
详见 适用场景与局限。
这份文档是给谁看的
这份文档是一个教学站点,目标是让你从零开始:
- 理解 ZjDroid 解决了什么问题、解决得如何;
- 看懂它每个功能点的实现原理与代码细节;
- 能够上手使用它进行 Android 动态逆向分析。
如果你是 Android 安全研究者、逆向工程师,或正在学习移动安全的同学,这份文档就是为你准备的。