Skip to content

🔧 baksmali — DEX 反汇编器内部原理

baksmali 是 ZjDroid 内嵌的 DEX → smali 反汇编引擎,由 Ben Gruver(JesusFreke)开发并以 BSD 协议发布。ZjDroid 在脱壳流程中通过 MemoryBackSmali 直接在内存中调用 baksmali.disassembleDexFile(),将从内存 dump 出的 DEX 字节流即时转换为可阅读的 smali 文本。


📦 包结构

org.jf.baksmali/
├── baksmali.java            # 反汇编入口,线程池调度
├── baksmaliOptions.java     # 全局配置(apiLevel、classpath 等)
├── main.java                # 命令行前端(ZjDroid 不直接使用)
├── dump.java                # DEX dump 辅助
└── Adaptors/                # 各层级"适配器"——真正负责生成 smali 文本
    ├── ClassDefinition.java
    ├── MethodDefinition.java
    ├── FieldDefinition.java
    ├── MethodItem.java          # 抽象基类(排序 + 写出)
    ├── LabelMethodItem.java
    ├── CatchMethodItem.java
    ├── AnnotationFormatter.java
    ├── RegisterFormatter.java
    ├── ReferenceFormatter.java
    ├── ...
    ├── Format/                  # 指令格式渲染
    │   ├── InstructionMethodItem.java        # 核心指令渲染
    │   ├── InstructionMethodItemFactory.java # 工厂分发
    │   ├── PackedSwitchMethodItem.java
    │   ├── SparseSwitchMethodItem.java
    │   ├── ArrayDataMethodItem.java
    │   └── ...
    ├── Debug/                   # 调试信息渲染
    │   ├── DebugMethodItem.java  # 抽象工厂
    │   ├── StartLocalMethodItem.java
    │   ├── EndLocalMethodItem.java
    │   ├── LineNumberMethodItem.java
    │   └── ...
    └── EncodedValue/            # 常量/注解值渲染
        ├── EncodedValueAdaptor.java
        ├── AnnotationEncodedValueAdaptor.java
        └── ArrayEncodedValueAdaptor.java
└── Renderers/               # 基础类型文字量渲染
    ├── LongRenderer.java
    ├── IntegerRenderer.java
    ├── FloatRenderer.java
    └── ...(共 8 个)

🔄 反汇编流水线

ZjDroid 脱壳调用点

MemoryBackSmali.backSmali() 将内存中的 DEX 字节数组包装为 DexFile,再调用 baksmali.disassembleDexFile(dexFile, options) 完成反汇编,生成的 smali 文件保存到 SD 卡指定目录。


📋 关键类清单

类名所在文件职责
baksmalibaksmali.java入口,线程池调度反汇编
baksmaliOptionsbaksmaliOptions.java全局配置参数容器
ClassDefinitionAdaptors/ClassDefinition.java单个 class 的 smali 头 + 字段 + 方法输出
MethodDefinitionAdaptors/MethodDefinition.java单个方法体:指令 + label + try/catch + debug
MethodItemAdaptors/MethodItem.java方法体元素抽象基类,支持排序
InstructionMethodItemAdaptors/Format/InstructionMethodItem.java单条 Dalvik 指令渲染(覆盖 30+ 格式)
InstructionMethodItemFactoryAdaptors/Format/InstructionMethodItemFactory.java根据指令类型分发到对应 Item 子类
DebugMethodItemAdaptors/Debug/DebugMethodItem.java调试信息工厂(local/line/prologue 等)
RegisterFormatterAdaptors/RegisterFormatter.java寄存器编号 → v0/p0 格式转换
EncodedValueAdaptorAdaptors/EncodedValue/EncodedValueAdaptor.java所有编码值类型的统一分发渲染
LongRendererRenderers/LongRenderer.javalong/int 字面量输出为十六进制文本

🏗️ 层次关系


🔗 相关文档

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