什么是 DEX

DEX(Dalvik Executable)是 Android 平台上 Dalvik/ART 虚拟机的可执行文件格式,可以理解为 Android 世界的 .class 文件。

文件头(Header)

DEX 文件的前 112 字节是固定的 header,包含以下关键字段:

偏移 大小 字段 说明
0x00 8 magic dex\n035\0dex\n039\0
0x08 4 checksum Adler-32 校验和
0x0C 20 signature SHA-1 哈希
0x20 4 file_size 文件总大小
0x24 4 header_size 头部大小,固定 0x70

索引区

索引区紧跟在 header 之后,由多个 _ids 数组组成。

string_ids

存储所有字符串的偏移量列表,每条 4 字节,指向数据区中 string_data_item 的位置。

1
2
3
string_ids[0] -> offset -> "Ljava/lang/Object;"
string_ids[1] -> offset -> "Ljava/lang/String;"
...

type_ids

引用 string_ids 的下标,表示类型描述符。

proto_ids

方法原型,包含返回类型和参数列表,用于构成方法签名。

数据区

code_item

每个方法的字节码存储在 code_item 中:

1
2
3
4
5
registers_size  - 寄存器数量
ins_size - 入参占用寄存器数
outs_size - 调用其他方法时出参寄存器数
insns_size - 指令长度(以 2 字节为单位)
insns[] - 实际指令字节码

smali 对照

以下是一段简单的 smali 和对应的 DEX 字节码:

1
2
3
4
5
.method public constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method

对应 DEX 指令:

1
2
70 10 xx xx 00 00   # invoke-direct
0E 00 # return-void

010 Editor 解析

使用 010 Editor 配合 DEX 模板可以可视化所有字段,推荐直接从 SweetScape 官方模板库安装 DEX.bt