我正在尝试编写一个二进制检测库(用于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相对偏移都不再正确。
但是,我想知道是否有其他类/类型的指令可能有问题。我一直试图找到帮助我的参考资料,但我无法做到。另外,我认为检测库很常见,所以我试着看看我是否可以找到一个开源示例,但我找不到任何。
是否有人知道类似的开源项目正在这样做?或任何参考?
非常感谢任何帮助!
答案 0 :(得分:2)
是否有人知道类似的开源项目正在这样做?或任何参考?
你可以查看DynamoRIO - 它做的远不止这些:除此之外,它可以解码指令,传递给你进行插入/删除/重新排序(有一些限制)并将它们重新编码为代码缓存(实际执行代码)。它是开源的,支持ARM。