> 文章列表 > dex文件结构

dex文件结构

dex文件结构

DEX文件结构

dex结构定义位置

android-10.0.0_r41\\dalvik\\libdex\\DexFile.h
/ Direct-mapped "header_item" struct.*/
struct DexHeader {u1  magic[8];           /* includes version number */u4  checksum;           /* adler32 checksum */u1  signature[kSHA1DigestLen]; /* SHA-1 hash */u4  fileSize;           /* length of entire file */u4  headerSize;         /* offset to start of next section */u4  endianTag;u4  linkSize;u4  linkOff;u4  mapOff;u4  stringIdsSize;u4  stringIdsOff;u4  typeIdsSize;u4  typeIdsOff;u4  protoIdsSize;u4  protoIdsOff;u4  fieldIdsSize;u4  fieldIdsOff;u4  methodIdsSize;u4  methodIdsOff;u4  classDefsSize;u4  classDefsOff;u4  dataSize;u4  dataOff;
};

图解
dex文件结构
dex文件结构

例子

dex文件结构
010editor 加上dex.bt
dex文件结构

checksum(校验和)是DEX位于文件头部的一个信息,用来判断DEX文件是否损坏或者被篡改,它位于头部的0x08偏移地址处,占用4个字节,采用小端序存储。
    在DEX文件中,采用Adler-32校验算法计算出校验和,将DEX文件从0x0C处开始读取到文件结束,将读取到的字节数组使用Adler-32校验算法计算出结果即是校验和即checksum字段

字段名 长度(bit) 备注
magic 8 64 65 78 0a 30 33 35 00
checksum 4 6c 35 8a d0 0xd08a356c
signature 20 0c 68 37 ef ab 09 36 3e 65 5b 47 24 af 54 75 fa 2e 7f 12 2f
filesize 4 34 3a 20 00 0x203a34,2112052
headsize: 4 70 00 00 00 0x70, 112
endiantag 4 78 56 34 12
linksize 4 00 00 00 00
linkOff 4 00 00 00 00
mapOff 4 78 56 34 12
stringIdsSize 4 2f 52 00 00 0x522f, 21039
stringIdsOff 4 70 00 00 00 0x70, 112
typeIdsSize 4 42 08 00 00 0x0842,2114
typeIdsOff 4 64 39 20 00
protoIdsSize 4 2d 0d 00 00 0x0d2d,3373
protoIdsOff 4 34 6a 01 00
fieldIdsSize 4 b8 2b 00 00 0x2bb8,11192
fieldIdsOff 4 50 08 02 00
methodIdsSize 4 bb 3d 00 00 0x3dbb,15803
methodIdsOff 4 10 66 03 00
classDefsSize 4 53 05 00 00 0x0553,1363
classDefsOff 4 e8 53 05 00
dataSize 4 ec 3b 1a 00 0x1a3bec,1719276
dataOff 4 48 fe 05 00

python计算checksum和signature

import hashlib
import zlibdef getCheckSum(dexfile):f = open(filename, 'rb', False)f.seek(0x0c)chs = f.read()f.close()return hex(zlib.adler32(chs))def getSignature(dexfile):f = open(filename, 'rb', False)f.seek(0x20)chs = f.read()f.close()return hashlib.sha1(chs).hexdigest()if __name__ == '__main__':filename = 'classes.dex'checksum = getCheckSum(filename)print(f'checksum = {checksum}')signature = getSignature(filename)print(f'signature = {signature}')

参考

dex文件格式介绍

pythonhash库