4.如何解释dalvik字节码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.如何解释dalvik字节码
如何解释dalvik字节码
⽂档:
在Android系统源码⽬录dalvik\docs有相关指令⽂档
dalvik-bytecode.html
实战:
来直接实战模拟来理解枯燥的理论
⽤IDA打开⼀个dex⽂件, 设置显⽰指令
随便找⼀段代码
注意:
206E 28DE 0050是IDA的显⽰问题在⽂件中的存储顺序是
6E 20 DE 28 50 00
在WinHex搜索⼀下就知道了
上⾯截图的指令在⽂件中的排列顺序如下:
14 05 09 00 09 01
6E 20 DE 28 50 00
6E 20 81 29 04 00
6E 30 83 29 34 07
.....
我们分别对如上3个条指令做解释
1. 14 05 09 00 09 01
14 为操作码 (opcode) 去⽂档查询
3li表⽰
第1个数字3表⽰指令由3个16位字组成
第2个数字1表⽰该条指令使⽤到1个寄存器
第3个字母i表⽰后⾯有⼀个32位⽴即数
所以我们可以知道,这条指令⼀共有6个字节其中4个字节是⽴即数
此时你肯定有疑问i哪⾥来的?
助记符位⼤⼩说 明
b88位有符号⽴即数
c16,32常量池索引
f16接⼝常量(仅对静态链接格式有效)
h16有符号⽴即数(32位或64位数的⾼值位,低值位为0)
i32⽴即数,有符号整数或32位浮点数
l64⽴即数,有符号整数或64位双精度浮点数
m16⽅法常量(仅对静态链接格式有效)
n44位的⽴即数
s16短整型⽴即数
t8, 16, 32跳转,分⽀
x0⽆额外数据
没错⽂档中后⾯的字母就可以查询上表的助记符
那么指令格式⼜如何约定呢? instruction-formats.html
指令格式为: const VAA, #+BBBBBBBB
那么现在, 嗯! ⼜有⼀些很操蛋的约定了
●每16位的字采⽤空格分隔开来。
●每个字母表⽰4位,每个字母按顺序从⾼字节开始,排列到低字节。
每4位之间可能使⽤竖线 “|” 来表⽰不同的内容。
●顺序采⽤ A ~ Z 的单个⼤写字幕作为⼀个4位的操作码,op表⽰⼀个8位的操作码。
● “Φ” 来表⽰这字段所有位为0值
●每条指令从操作码开始,后⾯紧跟参数,参数个数不定,每个参数之间采⽤逗号分开。
●每条指令的参数从指令第⼀部分开始,op位于低8位,⾼8位可以是⼀个8位的参数,
也可以是两个4位的参数,还可以为空,如果指令超过16位,则后⾯部分⼀次作为参数
●如果参数采⽤ “vX” 的⽅式表⽰,表⽰它是⼀个寄存器,如v0、v1等。
这⾥采⽤v⽽不⽤r是为了避免与基于该虚拟机架构本⾝的寄存器名字产⽣冲突,如ARM架构寄存器命名采⽤r开头。
●如果参数采⽤ “#+X” 的⽅式表⽰,表明它是⼀个常量数字。
●如果参数采⽤ “+X” 的⽅式表⽰,表明它是⼀个相对指令的地址偏移。
●如果参数采⽤ “kind@X” 的⽅式表⽰,表明它是⼀个常量池的索引值。
其中kind表⽰常量池类型,它可以是
“string” 字符串常量池索引
“type” 类型常量池索引
“field 字段常量池索引
“meth” ⽅法常量池索引
那么对于上⾯的指令 const VAA, #+BBBBBBBB
const op操作码
VAA 8位来描述这个寄存器
#+BBBBBBBB 常量数值
于是有
140509 00 09 01
op寄存器下标⽴即数
const V50x01090009
最后翻译出指令 const V5, 0x01090009
2 .6E 30 8
3 29 3
4 07
同样的⽅法:
拿着6E查询dalvik-bytecode.html得到如下信息
指令格式下标为35c,拿着指令下表查询instruction-formats.html得到
对于6E 30 83 29 34 07
op = 6E
A = 3
B = 0
CCCC = 83 29
D = 4
E = 3
F = 7
G = 0
于是翻译成指令有
invoke-virtual {v4, v3, v7} kind@8329。