首页
社区
课程
招聘
[求助]对dex文件格式中解析指令的一点疑惑
发表于: 2017-5-11 18:01 3920

[求助]对dex文件格式中解析指令的一点疑惑

2017-5-11 18:01
3920

在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=0op {},    kind@BBBB,

因为此处代表指令的3个16位的数据,后两个16位都是0,那岂不是kind@0,意味着对应MethodId里的下标为0?那如果根据指令来,就变成这个方法了?


懵逼了,盼解惑!


[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
看起来并没什么问题,MainActivity继承自Activity,init的时候需要执行父类的init
2017-5-11 20:34
0
雪    币: 26
活跃值: (79)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
嗯,谢谢提点!
反编译看了一下MainActivity的smali文件,确实有这么个意思!
#  direct  methods
.method  public  constructor  <init>()V
        .locals  0

        .prologue
        .line  8
        invoke-direct  {p0},  Landroid/app/Activity;-><init>()V      //基类方法调用了

        return-void
.end  method
2017-5-12 09:12
0
游客
登录 | 注册 方可回帖
返回
//