1、背景介绍
前面我们了解过dex文件的文件格式,数据类型等知识,这里我们来简单分析一下,dex文件在内存中的映射关系。
DexFile的结构体源码如下:
struct DexFile {
/* directly-mapped "opt" header */
const DexOptHeader* pOptHeader;
/* pointers to directly-mapped structs and arrays in base 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;
// 一些附加的节段信息
const DexClassLookup* pClassLookup;
const void* pRegisterMapPool; // RegisterMapClassPool
/* points to start of DEX file data */
// 指向Dex文件开始
const u1* baseAddr;
/* track memory overhead for auxillary structures */
// 附属的内存数据
int overhead;
/* additional app-specific data structures associated with the DEX */
//void* auxData;
};
2、DexMapList结构体
在DexHeader结构中,有一个mapOff字段,它指明了DexMapList结构在dex文件中的偏移,它的声明如下:
struct DexMapList{
u4 size;// DexMapItem的个数
DexMapItem list[1];
};
struct DexMapItem {
u2 type;
u2 unused;
u4 size;
u4 offset;
};
第一个字段表示item的类型,unused暂时没有用处,size表示这样类型的item有几个,offset表示相对于文件开始地址的偏移。
3、Hello.dex分析
在Hello.dex文件中,mapOff字段值为0X290,读取此处一个双字值为0X0d,表明接下来会有13个DexMapItem结构。使用C32asm打开dex文件,如图所示:
0X290处的值:
mapOff处的字段值:
4、内存地址分析
这里我们给出dexmap的结构图示,其实是一些结构体。下面就是在Hello.dex文件分析中得到的13个结构体的数据,偏移量等信息,如下图所示:
这里表示HeaderItem有0x1个,偏移为0x0,TypeStringIdItem个数为0x10,偏移为0x70,后面的大家以此类推。
5、注意事项
对于刚开始分析内存地址,汇编代码等的同学,可能看不太明白,这里的数据是怎么的出来的。这里涉及到一些寄存器地址存储方式的问题,有的地址是从低位向高位,有的是从高位向低位划分。
在下面这幅图中,我将这幅图示与我们4中的图片数据,用红线做了划分,大家对照着看,应该能够明白地址的存储方式。建议大家对比看看,手动的在草稿纸上画画,就明白是什么意思了。
挺别人说的,不如自己手动划一下来得深切,大家动手看看吧。