[求助]对dex文件格式中解析指令的一点疑惑
发表于:
2017-5-11 18:01
4010
在dex文件的解析时,逐步学习,在学习解析DexClassDef这个结构体时,总觉得查找的指令所体现的内容和dex文件中结构体所展示的内容的有出入,请大家帮我解惑一下,谢啦,以下是我学习的一点记录。
Struct DexClassDef
{
U4 classIdx; 类类型 指向DexTypeId的索引
U4 accessFlags; 访问标志
U4 superclassIdx; 父类类型 指向DexTypeId的索引
U4 interfaseoff; 接口,指向DexTypeList的偏移
U4 sourceFileIdx; 源文件名,指向DexStringId的索引
U4 annotationsoff; 注解,指向DexAnnotationsDirectoryItem结构
U4 classDataOff; 指向DexClassData结构的偏移 也就是类的数据部分
U4 staticValuesOff; 指向DexEncodeArray结构的偏移 也就是类中的静态数据
} 当获得了classDataOff也就是结构体struct DexClassData,就能获取类的数据
Struct DexClassData
{
DexClassDataHeader header;
DexField *staticFields; 静态字段
DexField *instanceFields; 实例字段
DexMethod* directMethods; 直接方法
DexMethod* virtualMethods; 虚方法
} 然后就可以通过DexClassData的DexMethod* 成员去获得方法对应的指令,struct DexMethod结构如下
Struct DexMethod
{
U4 methodIdx; 指向DexMethodId的索引
U4 accessFlags; 访问标志
U4 codeOff; 指向DexCode的偏移
} 指令就在DexMethod的成员codeOff中,它又是一个结构体
Struct DexCode
{
U2 registerSize; 寄存器个数
U2 insSize; 参数个数
U2 outSize; 调用其他方法时使用的寄存器个数
U2 triesSize; try/catch个数
U4 debugInfoOff; 指向调试信息的偏移
U4 insnsSize; 指令集个数,以2字节为单位
U2 insns[1]; 指令集
} 此时指令在insns中,就可以获得指令了。在此,我找了一个最简单的apk做例子,就找MainActivity的指令来看,请看截图,一共4个指令集8字节,前6个字节为一条指令,后2个字节为1个指令。
因为找到了对应MethodId里的下标为6,所以我在就去对应的表中找下标6代表的名字,
感觉是对的,但是呢,我把指令拿出来,也就是7010 0000 0000,对应的指令格式为A|G|op BBBB |F|E|D|C,也就是[A=0
] op
{}, kind
@BBBB,
因为此处代表指令的3个16位的数据,后两个16位都是0,那岂不是kind@0,意味着对应MethodId里的下标为0?那如果根据指令来,就变成这个方法了?
懵逼了,盼解惑!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!