如何在Linux中实现绕行功能

时间:2015-06-17 15:17:33

标签: c++ c gcc

我的要求是在运行时修补一个函数,它相当于K-Patch但是对于应用程序代码。 在K-Patch视频(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指令用于通过用近/远JUMP替换NOP来连接新函数?

1 个答案:

答案 0 :(得分:1)

问题不是“Linux”问题,而是“GCC”问题。

GCC提供ms_hook_prologue函数属性(online reference),它与/hotpatch(MS编译器)的cl.exe编译器选项几乎相同,但在函数级别上。

示例:

__attribute__((ms_hook_prologue)) void foo() { }

如果要在多个函数上使用它,可以创建一个宏来隐藏属性:

#define HOTPATCHABLE    __attribute__((ms_hook_prologue))