我的要求是在运行时修补一个功能,这相当于 K-Patch 但针对应用程序代码。 在 K-Patch vedio ( https://www.youtube.com/watch?v=juyQ5TsJRTA ) 中,它在 @ 1:41 中提到它使用了传统用于跟踪 (noop) 函数开头的功能。 我们可以在其中注册处理程序以调用新的函数定义。
在 Windows 中看起来像这样:( http://www.ragestorm.net/blogs/?p=17 )
0005951e (01) 90 NOP
0005951f (01) 90 NOP
00059520 (01) 90 NOP
00059521 (01) 90 NOP
00059522 (01) 90 NOP
00059523 (02) 8bff MOV EDI, EDI
00059525 (01) 55 PUSH EBP
00059526 (02) 8bec MOV EBP, ESP
我在 Linux (2.6.32-431.el6.x86_64) 中编写了一个简单的函数,其中我没有看到任何可用于动态修补新函数的 NOP 指令。
0000000000400554 <mysym>:
400554: 55 push %rbp
400555: 48 89 e5 mov %rsp,%rbp
400558: b8 98 06 40 00 mov $0x400698,%eax
40055d: be 9b 06 40 00 mov $0x40069b,%esi
400562: 48 89 c7 mov %rax,%rdi
400565: b8 00 00 00 00 mov $0x0,%eax
40056a: e8 c9 fe ff ff callq 400438 <printf@plt>
40056f: c9 leaveq
400570: c3 retq
Linux 中是否存在任何编译器选项或等效指令,其中每个函数都有一些 NOP 指令,用于通过将 NOP 替换为 near/far JUMP 来连接新函数?
最佳答案
这个问题与其说是“Linux”问题,不如说是“GCC”问题。
GCC 提供了 ms_hook_prologue
函数属性 (online reference)这与 cl.exe
(MS 编译器)的 /hotpatch
编译器选项几乎相同,但在功能级别上。
例子:
__attribute__((ms_hook_prologue)) void foo() { }
如果你想在多个函数上使用它,你可以创建一个宏来隐藏该属性:
#define HOTPATCHABLE __attribute__((ms_hook_prologue))
关于c++ - 如何在Linux中实现绕行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895715/