dex文件分析-8

来源:互联网 发布:合肥淘宝兼职 编辑:程序博客网 时间:2024/05/24 04:06

原博客地址:http://www.dusherry.com/

DexClassDef

  结构体申明如下

struct DexClassDef{

 u4  classIdx;                    //类的类型,指向DexTypeId列表的索引

 u4  accessFlags;                //访问标志

 u4  superclassIdx;             //父类类型,指向DexTypeId列表的索引

u4  interfacesOff;            //接口,指向DexTypeList的偏移

u4  sourceFieldIdx;           //源文件名,指向DexStringId列表的索引

 u4  annotationsOff;       // 注解,指DexAnnotationsDirectoryItem结构

 u4  classDataOff;        //指向DexClassData结构的偏移

 u4  staticValuesOff; //指向DexEncodeArray结构的偏移,记录了类中的静态数据

}


从图中可以看出有0x352个DexClassDef结构体,第一个DexClassDef结构体的偏移为0x2A6D4.


classIdx=0x9f

accessFlags=0x2601

superclassIdx=0x4B3

interfacesOff=0x36014 ,指向这个类实现的接口类型。

……

classDataOff=0x000000,代表这个类中没数据。实际这里面就是android.support.annotation.AnimRes这个类,这个类里面的确没数据。

省略的几个含义已经在结构体注释中说明。


现在重点分析一下DexClassData结构,它是类中的数据部分。定义在DexClass.h文件中

DexClassData结构的申明如下

struct DexClassData{

DexClassDataHeader header;    //指定字段和方法的个数

DexField * staticFields;     //静态字段

DexField * instanceFields;   //实例字段

DexMethod* directMethods;    //直接方法

DexMethod* virtualMethods;   //虚方法

}

DexClassDataHeader 结构记录了当前类中字段与方法的数目,它的申明如下:

struct DexClassDataHeader{

u4 staticFiledsSize;静态字段个数

u4 instanceFieldsSize;实例字段个数

u4 directMethodsSize; 直接方法个数

u4 virtualMrthodsSize; 虚方法个数

}

实际上这里面的u4只是在解析dex文件时在内存的数据类型,实际u4的字段类型是uleb128类型,这样可以减少dex文件的大小。

 

DexField 结构描述了类的字段类型与访问标志,它的结构体申明如下

struct DexField{

u4  fieldIdx;     //指向DexFieldId的索引

u4  accessFlags;  //访问标志

}

DexMethod{

u4 methodIdx; //指向DexMethodId的索引

u4 accessFlags   //访问标志

u4 codeOff;//指向DexCode结构的偏移

}

 

最重要的结构出现了,codeOff指向了一个DexCode结构体,这个里面就详细描述了方法中的指令的内容,之前所有的就是各种字符串啊。

DexCode结构申明如下:

struct DexCode{

 u2    registersSize;  //使用的寄存器个数

 u2    insSize; //参数个数

 u2    outsSize; //调用其它方法时使用的寄存器个数

 u4    debugInfoOff ;//指向调试信息的偏移

 u4    insnsSize;//指令集个数,以2字节为单位

 u2    insns[1];//指令集

}

到这里,dex分析差不多告一段路了,还有很多比较具体的东西还没分析,比如指令集的结构等等,希望以后有时间复习。

0 0
原创粉丝点击