Assembly 仪器/代理库的重新定位/移动ARM说明

Assembly 仪器/代理库的重新定位/移动ARM说明,assembly,arm,instrumentation,Assembly,Arm,Instrumentation,我正在尝试编写一个二进制指令库(用于ARM),它需要我移动/重新定位ARM装配指令。请注意,指令的顺序保持不变,我只是将它们移动到内存的不同区域,以便输入代理/挂钩指令。作为代理/钩子的一部分,我跳回原始指令(以相同的顺序),然后跳回原始函数。下面是一个可能的示例: 伪码 function: <jump to proxy> <rest of original function> proxy: <some additional proxy i

我正在尝试编写一个二进制指令库(用于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的相对偏移量都不再正确

但是,我想知道是否还有其他类/类型的指令可能存在问题。我一直在努力寻找推荐人来帮助我,但一直没能找到。另外,我认为插装库非常常见,所以我试着看看是否可以找到一个开源示例,但没有找到

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

任何帮助都将不胜感激

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


您可以看到——它的作用远不止于此:除此之外,它可以解码指令,将指令传递给您进行插入/删除/重新排序(有一些限制),并将其重新编码到代码缓存(代码实际上是从该缓存执行的)。它是开源的,支持ARM。

ARM文档包含您需要的所有内容。您不理解其中的哪一部分?取决于您正在检测的代码。在手写汇编中,几乎可以使任何指令对重新定位敏感。如果您正在检测一些幼稚的编译器输出,那么它可能永远不会构造出如此脆弱的东西,而仅仅通过保护偏移量和正确地重新定位一切就可以工作。但实际上,您应该让钩子在适当的位置工作(在被调用的代理中注入原始代码,因此它充当原始代码的一部分),这样您就根本不需要重新定位。你仍然会破坏一些机器代码,这将有敏感的插件。在钩子上。啊,现在我看到你真的在原地做了。例如,如果您中断thumb条件块,它可能仍然会中断。然后,在您的块中,堆栈可能是不同的(因为您需要某个返回地址,除非您使用某种硬编码的返回创建每个钩子的代理(我不知道从头开始的ARM指令,以确保返回的选项是什么)因此,
pc
+
sp
显然是不同的。当然,它也会破坏任何像样的防篡改代码。与编译器合作插入代码更合理,这是做这些事情的正常方式。“我认为插入库非常常见”-从理论的角度来看,如果你想产生任何完全正确的东西(以数学的方式),它将是NP完全的,因为这基本上是“停止问题”的延伸我可以想象,一些基于启发式的工具,对一些已知的编译器输出进行检测,大多数情况下都能工作,只有很少的故障,所以它甚至可能“足够好”要发布,但似乎并不是很多人需要一种方法来通过不确定的机会破坏某些代码,普通bug的情况已经很糟糕了。pc relative是可重新定位的bug,那些你不会弄乱的bug,它们指向的内容可能会有所不同。有时它们只是加载一个不适合立即加载的常量。有时它们被加载某个东西的地址…一个绝对地址,可能需要更改。这是数据地址还是函数地址?这有关系吗?这正是我要找的。谢谢。