gpt4 book ai didi

c++ - 为什么ARM的这条分支指令不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:23 24 4
gpt4 key购买 nike

现在我正在编写一个库来模拟 C/C++ 的普通函数。它是这样使用的:MOCK(mocked, substitute)如果您调用模拟函数,则会调用替代函数。

我修改代码页的属性,将跳转代码注入(inject)到函数中实现。我已经为 x86 CPU 实现了它,我想将它移植到 ARM CPU。但是我在注入(inject)二进制代码时遇到了问题。

例如substitute函数地址为0x91f1,mock函数地址为0x91d1。所以我想将ARM分支代码注入(inject)到0x91d1中跳转到substitute函数。

根据网上的文档,相对地址是

(0x91f1 - (0x91d1 + 8)) / 4 = 6

所以二进制指令是:

0xea000006

因为我的arm模拟器(我用的是Android arm v7模拟器)是little endian,所以要注入(inject)的二进制代码是:

0x060000ea

但是当我在注入(inject)分支代码后执行模拟函数时,发生了段错误。我不知道为什么分支指令是错误的。没有学过ARM架构,不知道ARM的分支指令是否有一些限制。

最佳答案

您要跳转到的地址是奇数编号的,这意味着它们处于 Thumb 模式。

您的方法存在明显的问题。

如果目标处于 Thumb 模式,您要么需要在分支点处处于 Thumb 模式,要么需要使用 bx(分支和交换)指令。

您的函数处于 Thumb 模式(目标为 +1)但您使用的是 ARM 模式分支编码(B A1 编码?),所以很明显,您要么不处于 Thumb 模式,要么您在 Thumb 模式下使用 ARM 模式指令.

关于c++ - 为什么ARM的这条分支指令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24152894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com