[英]Why this branch instruction of ARM doesn't work
现在,我正在编写一个库来模拟C / C ++的琐碎函数。 它的用法如下: MOCK(mocked, substitute)
如果调用MOCK(mocked, substitute)
函数,则会替代调用替代函数。
我修改了代码页的属性,并将跳转代码注入到函数中以实现它。 我已经为x86 CPU
实现了它,我想将其移植到ARM CPU
。 但是当我注入二进制代码时,我遇到了一个问题。
例如,替代函数的地址为0x91f1
,要模拟的函数的地址为0x91d1
。 因此,我想将ARM分支代码注入0x91d1
以跳转到替代函数。
根据在线文件,相对地址为
(0x91f1 - (0x91d1 + 8)) / 4 = 6
所以二进制指令是:
0xea000006
因为我的arm模拟器(我使用Android arm v7模拟器)是低端字节序的,所以要注入的二进制代码是:
0x060000ea
但是当我在注入分支代码后执行了模拟功能时,发生了段错误。 我不知道分支指令为什么出错。 我还没有学习过ARM体系结构,所以我不知道ARM的分支指令是否有一些限制。
分支到的地址为奇数,表示它们处于Thumb模式。
您的方法存在明显的问题。
如果目标是在Thumb模式下,则您需要从分支处进入Thumb模式,或者需要使用bx
(分支和交换)指令。
您的函数处于Thumb模式(目标为+1),但是您使用的是ARM模式分支编码(BA 1编码?),因此很明显,您未处于Thumb模式或正在Thumb模式中使用ARM模式指令。
ARM系列允许使用值加载寄存器。 这些寄存器之一是PC(程序计数器)。
一些替代方案:
这些选择加上修改分支指令的目标都是“最佳”的所有不同选项。 选择最适合您并且最容易维护的一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.