c++ - 如何在Linux中实现绕行功能

标签 c++ c gcc

我的要求是在运行时修补一个功能,这相当于 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/

相关文章:

c++ - 计算opencv中轮廓内子轮廓的数量

c++ - OpenMP 循环运行代码比串行循环慢

c - 为什么这个小的 C 程序没有按预期运行?

c++ - 应用编译器选项 -00 与 -03 在 clang 上调用 malloc 的不同输出

c++ - 非常量左值引用类型 _normal_iterator<> 无法在 gcc 中绑定(bind)类型为 _normal 的临时迭代器

c++ - 堆摘要错误中不匹配

python - 如何在 bcc64 项目中嵌入 python?

c - 执行直接操作时,输出值与函数内作为参数接收的值不同

c - 在 C : prevent generating stack pointer initialization 中写入引导扇区

gcc - 如何在 Makefiles/GCC 中启用 OpenMP 支持