【发布时间】:2014-06-11 00:25:11
【问题描述】:
现在我正在编写一个库来模拟 C/C++ 的琐碎函数。它是这样使用的:MOCK(mocked, substitute)
如果调用模拟函数,则会调用替代函数。
我修改了代码页的属性,将跳转代码注入到函数中来实现。我已经为x86 CPU 实现了它,我想将它移植到ARM CPU。但是我在注入二进制代码时遇到了问题。
例如,替代函数的地址是0x91f1,要模拟的函数地址是0x91d1。所以想将ARM分支代码注入0x91d1,跳转到替代函数。
根据网上的文档,相对地址是
(0x91f1 - (0x91d1 + 8)) / 4 = 6
所以二进制指令是:
0xea000006
因为我的arm模拟器(我用的是Android arm v7模拟器)是little endian,所以要注入的二进制代码是:
0x060000ea
但是当我在注入分支代码后执行模拟函数时,发生了段错误。我不知道为什么分支指令是错误的。没学过ARM架构,不知道ARM的分支指令有没有限制。
【问题讨论】:
-
您确定不是注入导致了故障吗?您在哪个操作系统上运行,您如何确保您可以访问 .text 的数据?
-
要插入的字节是
0x06, 0x00, 0x00, 0xea,但是如果你将它作为一个整数插入,那么你应该保留0xea000006,因为字节序将被适当地应用到它上面。大概你的模拟器有一些调试功能,使用它。 -
确保代码不在 Thumb 中。目前大多数 ARM 平台默认使用 Thumb。
-
ARM 没有对齐要求吗?函数的词边界可能吗? 0x91f1 看起来很可疑。
-
哪种 ARM 架构?