重新定位/移动用于检测/代理库的ARM指令

时间:2017-08-27 21:56:42

标签: assembly arm instrumentation

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

伪代码

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>

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

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

但是,我想知道是否有其他类/类型的指令可能有问题。我一直试图找到帮助我的参考资料,但我无法做到。另外,我认为检测库很常见,所以我试着看看我是否可以找到一个开源示例,但我找不到任何。

是否有人知道类似的开源项目正在这样做?或任何参考?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

  

是否有人知道类似的开源项目正在这样做?或任何参考?

你可以查看DynamoRIO - 它做的远不止这些:除此之外,它可以解码指令,传递给你进行插入/删除/重新排序(有一些限制)并将它们重新编码为代码缓存(实际执行代码)。它是开源的,支持ARM。