当前位置:首页 » 其他

dex文件分析-8

2015-07-31 18:16 本站整理 浏览(10)

原博客地址: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分析差不多告一段路了,还有很多比较具体的东西还没分析,比如指令集的结构等等,希望以后有时间复习。