本文主要讨论两部分内容:
-
分支指令,B、BL 等
-
v7中的模式切换,arm切thumb,thumb切arm。理解了模式切换就会明白为什么在做 inline hook 时,有些地址需要加上1,加上 1 的作用是什么。
B

B指令是无条件跳转指令。看描述是一个相对于PC地址的跳转,范围是使用 imm26 来描述。26 位表示的范围是 +/-128M。为啥会是 128M 呢?是因为最后的值还需要乘以4。
举个例子:

在 000000000001EDA4 处有一条 B 指令,执行完该指令之后就会直接跳转到 000000000001EDAC 处,IDA使用一条带箭头的线给出了提示。
之前在学习 so 的时候,写过一个死循环指令:
00 00 00 14
我们可以分析一下其具体的每一位:
00010100 00000000 00000000 00000000 ->
0 00101 00000000000000000000000000
因为是跳转到自己位置,所以 imm26 是 0,很好理解。
对比了一下 v7 与 v8 中的死循环指令,发现一个未曾注意到的区别:
v8: 00 00 00 14
v7: fe ff ff ea
在 v7 中,feffff 表示的是 -2,由于 pc = pc + 8,所以算下来,offset = 8 + (-2)* 4 = 0。
但是在 v8 中,offset 就直接是 imm26 的值,这是否说明在 v8 中,pc就是自身的值?暂时未找到具体文档,先留个疑问。
在 V7 中,存在 arm 与 thumb 指令,那么 B 指令跳转会发生模式切换吗?是不会的,编译器可以保证,除非你修改了指令代码,如果在 B 指令中发生了模式切换,肯定是会出问题的,


9483

被折叠的 条评论
为什么被折叠?



