Skip to content

🧊 immutable — 不可变 DEX 对象层

org.jf.dexlib2.immutable 提供了 dexlib2 接口层(iface)的不可变(Immutable)实现。这些对象线程安全、可缓存,是 MethodAnalyzerDexRewriter 和 ZjDroid 脱壳产出中的标准数据载体。

🗺️ 在流水线中的位置

DexBackedDexFile(dexbacked,另一同事负责)
       ↓ 读取字节流
ImmutableClassDef / ImmutableMethod / ImmutableMethodImplementation
       ↓ 传入分析/重写流水线
MethodAnalyzer / DexRewriter
       ↓ 最终写出
DexPool.intern(classDef) → DexWriter.writeTo()

📦 关键类清单

职责
ImmutableClassDef不可变类定义,持有字段、方法、注解的 ImmutableSortedSet
ImmutableMethod不可变方法,持有参数、注解和 MethodImplementation
ImmutableMethodImplementation不可变方法体,持有寄存器数量、不可变指令列表和 TryBlock
ImmutableField不可变字段定义
ImmutableDexFile不可变 DEX 文件,持有 ImmutableSet<ImmutableClassDef>
ImmutableAnnotation不可变注解
ImmutableTryBlock不可变 try-catch 块

🔗 结构关系

与 dexbacked 的关系

dexbacked 包(另一同事负责)中的 DexBackedClassDef 等对象是从 DEX 字节流懒加载的实现,访问时才解析字节。而 ImmutableClassDef 等是已完全实体化的内存对象,适合缓存、传递和写回。两者都实现相同的 iface 接口,可互换。

ZjDroid 使用场景

MemoryBackSmali 从内存中获取 DEX 字节流后,通过 DexBackedDexFile 解析,再遍历所有类构建 ImmutableClassDef 集合,最后通过 DexPool.writeTo() 写出。
参见 MemoryBackSmali

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