介绍ARM机器码

首先我们来看一条ARM指令:
00001BD0 BEQ loc_1c04
如果说这条指令切换为16进制如何表示:
00001BD0 0B 00 00 0A
如果说这条指令切换为2进制如何表示:
0000 101 0 000000000000000000001011

是不是觉得特别神奇,那么小编是怎么来计算的呢,接下来就跟着小编一起来学习一下吧。
首先我们前面讲过一个ARM指令是32位的,格式是: {} {s} , {,}
这里B 的跳转指令可以拆分为这样的格式:

安卓逆向之ARM指令机器码
31-28位就是cond,这里的意思就是条件码。例如ne、eq等。
它们对应的机器码格式:
安卓逆向之ARM指令机器码
第二个就是25-27位了 这里由于是B指令101即可
第三个24位可以这样理解L我们前面也讲过 带有连接的如果是BL指 令对应的二进制操作数就是1 无条件跳转B指令就是0。
0-23位就是目标地址与该指令的相对偏移,这里如何计算的勒,我们需 要记住一个公式。

(目标跳转的地址-(当前这条指令的地址+8))/4
这里+8的原因就是因为arm指令有3级流水线的原因,/4是因为要做对 其处理
这里我们带入到一开始我们举例的arm指令来试试
00001BD0 BEQ loc_1c04
我们先利用上面讲的格式切换为2进制的机器码
第31-28:cond=>条件是EQ EQ对应的机器码是 0000
27-25=>101
25-24:L=>B:0
0-23:就套用我们上面的公式 (1c04-(1bd0+8))/4=1011
然后我们拼接一下 0000 101 0 000000000000000000001011
由于计算出来的是1011 不足的位数用0补齐即可
那么切换为16进制就是0A 00 00 0B
然后由于编码的问题 得按照字节倒一下就是0B 00 00 0A

你学会了吗?

相关文章: