1. dex文件是啥?
dex文件也即Android的可执行文件,包含应用程序的全部操作指令以及运行时数据,在Android逆向工程中对app的逆向也就是分析dex文件,因为dex里面包含了所有app代码,利用反编译工具可以获取java源码,理解并修改dex文件,就能更好的实现apk破解和防破解。注:.class运行在PC上的java虚拟机,.dex运行在Android上的Davlik虚拟机。
2. dex文件结构
数据名称 | 说明 |
---|---|
Header | dex文件头部,记录整个dex文件的相关属性 |
String_ids | 字符串数据索引,记录了每个字符串在数据区的偏移量 |
Type_ids | 类似数据索引,记录了每个类型的字符串索引 |
Proto_ids | 原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表 |
Field_ids | 字段数据索引,记录了所属类,类型以及方法名 |
Method_ids | 类方法索引,记录方法所属类名,方法声明以及方法名等信息 |
Class_defs | 类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量 |
Data | 数据区,保存了各个类的真实数据 |
Link_data | 连接数据区 |
3. Header
字段 | 说明 |
---|---|
magic | 魔数字段,值为"dex\n035\0" |
checksum | 校验码,检验dex文件完整性 |
signature | sha-1签名 |
file_size | dex文件总长度 |
header_size | 文件头长度 |
endian_tag | 标示字节顺序的常量 |
link_size | 链接段的大小,如果为0就是静态链接 |
link_off | 链接段的开始位置 |
map_off | map数据基址 |
DexHeader定义如下:
struct DexHeader {
u1 magic[8]; /* DEX版本标识 */
u4 checksum; /* adler32检验 */
u1 signature [kSHAlDigestlen]; /* SHA-1散列值 */
u4 fileSize; /* 整个文件的大小 */
u4 headerSize; /* DexHeader结构的大小 */
u4 endianTag; /* 字节序标记 */
u4 linkSize; /* 链接段的大小 */
u4 linkOff; /* 链接段的偏移量 */
u4 mapOff; /* DexMaplist的文件偏移 */
u4 stringidsSize; /* DexStringId的个数 */
u4 stringidsOff; /* DexstringId的文件偏移 */
u4 typeIdsSize; /* DexTypeId的个数 */
u4 typeIdsOff; /* DexTypeId的文件偏移 */
u4 protoIdsSize; /* DexProtoId的个数 */
u4 protoIdsOff; /* DexProtoId的文件偏移 */
u4 fieldIdsSize; /* DexFieldId的个数 */
u4 fieldIdsOff; /* DexFieldId的文件偏移 */
u4 methodIdsSize; /* DexMethodId的个数 */
u4 methodIdsOff; /* DexMethodId的文件偏移 */
u4 classDefsSize; /* DexClassDef的个数 */
u4 classDefsOff; /* DexClassDef的文件偏移 */
u4 dataSize; /* 数据段的大小 */
u4 dataOff; /* 数据段的文件偏移 */
};