Android 逆向入门:DEX 文件格式详解
什么是 DEX
DEX(Dalvik Executable)是 Android 平台上 Dalvik/ART 虚拟机的可执行文件格式,可以理解为 Android 世界的 .class 文件。
文件头(Header)
DEX 文件的前 112 字节是固定的 header,包含以下关键字段:
| 偏移 | 大小 | 字段 | 说明 |
|---|---|---|---|
| 0x00 | 8 | magic | dex\n035\0 或 dex\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 | string_ids[0] -> offset -> "Ljava/lang/Object;" |
type_ids
引用 string_ids 的下标,表示类型描述符。
proto_ids
方法原型,包含返回类型和参数列表,用于构成方法签名。
数据区
code_item
每个方法的字节码存储在 code_item 中:
1 | registers_size - 寄存器数量 |
smali 对照
以下是一段简单的 smali 和对应的 DEX 字节码:
1 | .method public constructor <init>()V |
对应 DEX 指令:
1 | 70 10 xx xx 00 00 # invoke-direct |
010 Editor 解析
使用 010 Editor 配合 DEX 模板可以可视化所有字段,推荐直接从 SweetScape 官方模板库安装 DEX.bt。
更新日志
2025-06-01初稿,覆盖文件头 header 结构
2025-09-14补充 string_ids / type_ids / proto_ids 索引区
2026-01-20新增 method_ids 和 code_item 数据区解析
2026-06-04增加 smali 对照示例和 010 Editor 模板
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Q7h2q9のblog!
评论




.png)