Dex文件的内存映射

来源:互联网 发布:判断素数的条件c语言 编辑:程序博客网 时间:2024/05/01 23:30

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中的图片数据,用红线做了划分,大家对照着看,应该能够明白地址的存储方式。建议大家对比看看,手动的在草稿纸上画画,就明白是什么意思了。

       挺别人说的,不如自己手动划一下来得深切,大家动手看看吧。




0 0
原创粉丝点击