Dex文件的内存映射

本文介绍了Dex文件在内存中的映射关系,详细分析了DexMapList结构体,通过Hello.dex文件实例展示了DexMapItem的分布,并探讨了内存地址分析,特别是对于初学者理解汇编和内存地址存储方式提供了帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值