是否有用于处理 x86/x64 机器代码的 C 库?具体来说,我想在运行时修改程序地址空间中的函数。
例如,我有函数 foo
和 bar
,我知道它们的内部工作原理或知识,但无法重新编译它们的库重新进入,我有了自己编写的函数 baz
。现在我希望能够这样说:“在函数 foo
中,找到对 bar
的调用,并注入(inject) baz的指令
就在它的前面”。该工具必须相应地调整程序中的所有相关地址。
我知道所有细节都存在,例如,有一些工具可以对函数进行热修补。我想由于优化等原因,对可能的功能有一些限制,但基本功能应该是可能的。我找不到这样的东西,有人有链接吗?
最佳答案
这被称为“自修改代码”(参见 wikipedia),它在 80 年代和 90 年代初期非常流行。然而,特别是在机器代码和 ASM 中,它作为现代语言的一种方法几乎已经消失,因为它非常脆弱。托管语言试图提供更安全的模型,因为它也是缓冲区溢出攻击的基础。
请记住,您的代码页可能被标记为只读或写时复制,并且您可能会在许多现代操作系统上遇到访问冲突,但如果我没记错的话,您需要掌握内存的基本原则变量或函数的地址,您需要对该位置生成的代码和/或堆栈布局有非常具体的了解。
这里有一些帮助您入门的链接;
具体来说,在您的情况下,我不会通过插入操作然后尝试调整所有代码来修改foo
,您需要做的就是更改jump
地址到 bar
以通过中介。这称为 Thunk
。这样做的好处是,将跳转地址从一个地址修改为另一个地址的脆弱性要小得多,因为它不会改变原始函数的结构,只是改变一个数字。事实上,相比之下这是微不足道的。
在您的thunk
中,您可以在调用真实函数之前和之后执行任何您喜欢的操作。如果您已经在同一个地址空间中并且您的 thunk 代码已加载,那么您就到家了。
如果您使用的是 Windows,您可能还想看看 Detours.
关于c - 用于在运行时操作机器代码的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257735/