这两天看丰生强先生的《Android软件安全与逆向分析》,在4.3节的最后以如下指令:
7010 0400 0000
为例解释了如何将Dalvik指令解析成汇编代码。
要想看懂这段解释,得首先明白几个基本知识。
1. arm是小字节序的,也就是高位高地址,低位低地址
1. 当使用16进制显示hello.dex文件时,这条指令显示为7010 0400 0000
2. 解析指令的时候是以16bit为单位读取内容的,也就是每次读取16bit。读取第一个16bit的后,这16bit的内容以16进制打印为:1070,为什么是这样呢?因为按照字节流读取2字节(16bit)之后,10在高位,70在低位。
3. 指令位表示为:A|G|op BBBB F|E|D|C
A|G|op 高8bit表示A|G,低8bit表示op
因此这个指令的A为1,G为0,op为70
0400对应于BBBB,按照字节流读取0400,这个16bit的高8位为0,低8位为4,因此BBBB解析为4
0000对应于F|E|D|C,F = E =D =C = 0
在A=1的时候,op为70的指令格式为:
[A=1] op {vC}, kind@BBBB
70对应于invoke-direct
C值为0
BBBB为4,为kind@类型,kind@4表示DexMethodId为4的字符串
因此7010 0400 0000解析后的smali代码为:
invoke-direct {v0}, Ljava/lang/Object;.<init>:()v