Relocating/Moving instrumentation/proxy 库的 ARM 指令

Relocating/Moving ARM instructions for instrumentation/proxy library

我正在尝试编写一个需要 move/relocate ARM 汇编指令的二进制检测库(用于 ARM)。请注意,指令的 顺序 保持不变,我只是 将它们 移动到不同的内存区域,以便我可以输入我的 proxy/hook 说明。作为我的 proxy/hook 的一部分,我跳回原始指令(以相同的顺序),然​​后跳回原始函数。下面是它的外观示例:

伪代码

function:
    <jump to proxy>
    <rest of original function>

proxy:
    <some additional proxy instructions for logging, etc.>
    <instructions from original function that were moved>
    <jump back to original function plus offset>

我注意到,如果我只是盲目地移动指令(不考虑指令类型),我最终会导致应用程序崩溃。

我确定这些指令中的 "class" 是引用程序计数器(PC 寄存器)的指令。这对我来说很有意义,因为位置现在已经改变(移动到新的内存区域)并且任何与 PC 相关的偏移量都不再正确。

但是,我想知道是否有 other class/type 的指令可能有问题。我一直在努力寻找参考资料来帮助我,但我一直没能找到。另外,我认为检测库很常见,所以我试图查看是否可以找到一个开源示例,但我找不到。

有人知道类似的开源项目正在做这件事吗?或任何参考资料?

如有任何帮助,我们将不胜感激!

Is anyone aware of a similar open source project that is doing this? Or any references?

您可以查看 DynamoRIO——它的功能远不止于此:除此之外,它还可以解码指令,将其传递给您 insertion/deletion/reordering(有一些限制),然后将它们重新编码为代码缓存(实际执行代码的地方)。它是开源的并且支持ARM。