- A+
所属分类:笔记
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;                     /* 数据段的文件偏移 */
};

