Android应用的补丁方法
Android应用程序的补丁方法
???
* These are mapped out of the "auxillary" section, and may not be
* included in the file. ???
*/
const DexClassLookup* pClassLookup;
const void* pRegisterMapPool; // RegisterMapClassPool
/* points to start of DEX file data */
const u1* baseAddr;
/* track memory overhead for auxillary structures */
int overhead;
/* additional app-specific data structures associated with the DEX */
//void* auxData;
};
DexOptHeader这里我们先不讨论,如结构中注释所说,DexLink下面的四个字段也不属于原始的DEX文件。
原始的DEX文件只包含下面几个字段:
const DexHeader* pHeader;
const DexStringId* pStringIds;
const DexTypeId* pTypeIds;
const DexFieldId* pFieldIds;
const DexMethodId* pMethodIds;
const DexProtoId* pProtoIds;
const DexClassDef* pClassDefs;
const DexLink* pLinkData;
整个DEX文件分成了头和体两个部分,DexHeader存放着DEX文件的校验以及各数据类型起始地址、偏移量等信息,其它的字段即为DexBody部分。在“DexFile.h”文件中DexHeader的定义如下:
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;
};
magic字段用于验证是否为DEX,正常值为“dex/n035/0”,checksum为DEX文件的adler32 检验值,这个校验值验证DEX文件是否损坏,signature用于识别未优化过的DEX档案的SHA1值,checksum与signature这两个字段在后面突破DEX验证小节会详细的分析,fileSize为整个DEX文件的大小,headerSize为本结构DexHeader的大小,值为0x70,endianTag记录标示与处理器相关,在Little-Endian的CPU上值为“0,在Big-Endian的CPU上值为“0”,linkSize表示LinkSection的大小,如果为0表示DEX文件不是静态链接,linkOff表示LinkSection距离DexHeader的偏移,如果li