c - 用于在运行时操作机器代码的库?

标签 c assembly x86 machine-code

是否有用于处理 x86/x64 机器代码的 C 库?具体来说,我想在运行时修改程序地址空间中的函数。

例如,我有函数 foobar,我知道它们的内部工作原理或知识,但无法重新编译它们的库重新进入,我有了自己编写的函数 baz。现在我希望能够这样说:“在函数 foo 中,找到对 bar 的调用,并注入(inject) baz就在它的前面”。该工具必须相应地调整程序中的所有相关地址。

我知道所有细节都存在,例如,有一些工具可以对函数进行热修补。我想由于优化等原因,对可能的功能有一些限制,但基本功能应该是可能的。我找不到这样的东西,有人有链接吗?

最佳答案

这被称为“自修改代码”(参见 wikipedia),它在 80 年代和 90 年代初期非常流行。然而,特别是在机器代码和 ASM 中,它作为现代语言的一种方法几乎已经消失,因为它非常脆弱。托管语言试图提供更安全的模型,因为它也是缓冲区溢出攻击的基础。

请记住,您的代码页可能被标记为只读或写时复制,并且您可能会在许多现代操作系统上遇到访问冲突,但如果我没记错的话,您需要掌握内存的基本原则变量或函数的地址,您需要对该位置生成的代码和/或堆栈布局有非常具体的了解。

这里有一些帮助您入门的链接;

  1. How to write self-modifying code in x86 assembly
  2. Self-modifying code for debug tracing in quasi-C

具体来说,在您的情况下,我不会通过插入操作然后尝试调整所有代码来修改foo,您需要做的就是更改jump 地址到 bar 以通过中介。这称为 Thunk。这样做的好处是,将跳转地址从一个地址修改为另一个地址的脆弱性要小得多,因为它不会改变原始函数的结构,只是改变一个数字。事实上,相比之下这是微不足道的。

在您的thunk 中,您可以在调用真实函数之前和之后执行任何您喜欢的操作。如果您已经在同一个地址空间中并且您的 thunk 代码已加载,那么您就到家了。

如果您使用的是 Windows,您可能还想看看 Detours.

关于c - 用于在运行时操作机器代码的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257735/

相关文章:

c - AND 和 OR 运算符 c

assembly - x86 上有偏移写回吗?

assembly - Haswell/Skylake 上的部分寄存器究竟如何执行?写AL好像对RAX有假依赖,AH不一致

c - 强制整数常量为四字

linux - 在 x86_64 AT&T 中调用 scanf 时出现段错误

c++ - 如何使用内联汇编程序保存寄存器值

assembly - 为什么在xv6中gdtdesc中有sizeof(gdt)-1

c - RobuSTLy 以亚像素精度找到图像 block 的局部最大值

c - 当我们在 C 中的字符串末尾不包含 '\0' 时会发生什么?

c - 尝试用指针做某事