Skip to content

命令总览

ZjDroid 的所有指令都是一条 com.zjdroid.invoke 广播,区别只在 cmd 这个 JSON 里的 action 字段。

通用格式

bash
adb shell am broadcast \
  -a com.zjdroid.invoke \
  --ei target <PID> \
  --es cmd '{"action":"<动作>", ...其他参数}'
参数含义
-a com.zjdroid.invoke固定的广播 action
--ei target <PID>目标进程 PID(整数)
--es cmd '<JSON>'指令 JSON 字符串

指令速查表

action参数作用输出文件详见
dump_dexinfo列出已加载的 DEX 及 mCookie(仅日志)DEX 信息收集
dump_classdexpath列出指定 DEX 的类名(仅日志)类信息枚举
backsmalidexpath内存反编译并重组 DEX(脱壳)files/dexfile.dexBackSmali 脱壳
dump_dexfiledexpath导出内存 DEX(odex 格式)files/<name>DEX 内存 Dump
dump_memstartaddr, length导出内存区域files/<起始地址>内存区域 Dump
dump_heap导出 Java 堆快照files/<PID>.hprofDalvik 堆 Dump
invokefilepath运行 Lua 脚本(脚本自定义)Lua 脚本注入
(自动)敏感 API 监控(仅日志)API 监控

7 条指令全景

按用途分三组:脱壳类(4 条,围绕 DEX)、内存类(2 条)、脚本类(1 条)。

指令数量以源码为准

源码 CommandHandlerParser.java 的分发链里真实接入的指令就是这 7 条NativeHookInfoHandler 虽存在于目录中,但未被调度器接入,属死代码,不计入可用指令。

完整命令示例

1. dump_dexinfo

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"dump_dexinfo"}'

2. dump_class

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"dump_class","dexpath":"/data/data/com.example.target/files/x.dex"}'

3. backsmali(脱壳)

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"backsmali","dexpath":"/data/data/com.example.target/files/x.dex"}'

4. dump_dexfile

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"dump_dexfile","dexpath":"/data/data/com.example.target/files/x.dex"}'

5. dump_mem

参数名是 startaddr

README 里写的是 start,但代码实际解析的 key 是 startaddr。请用 startaddr

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"dump_mem","startaddr":12345678,"length":1024}'

6. dump_heap

bash
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"dump_heap"}'

7. invoke(Lua 脚本)

bash
# 先 push 脚本到设备
adb push script.lua /data/local/tmp/

# 再执行
adb shell am broadcast -a com.zjdroid.invoke \
  --ei target 12345 \
  --es cmd '{"action":"invoke","filepath":"/data/local/tmp/script.lua"}'

查看结果

bash
# 指令执行结果
adb shell logcat -s zjdroid-shell-<>

# API 监控结果
adb shell logcat -s zjdroid-apimonitor-<>

脱壳工作流

脱壳是一个三步流程:先用 dump_dexinfo 拿到每个 DEX 的 mCookie 与路径,再用 dump_class 看类名定位目标 DEX,最后用 backsmali(重组可读)或 dump_dexfile(直出 odex)导出。

选 backsmali 还是 dump_dexfile

backsmali 走"反汇编→重组"路径,产出可被 baksmali/smali 工具链直接处理的 DEX;dump_dexfile 直接 dump 内存中的 odex,更快但可能需额外修复。壳破坏了 DEX 时优先试 backsmali


指令的协议细节见 指令协议

基于 MIT 协议发布 · 本文档仅用于安全研究与教学目的