【发布时间】:2011-07-10 11:37:42
【问题描述】:
我正在尝试重新实现旧的庞然大物内核拦截(在this Phrack issue 中描述)。
替换32位函数调用的代码如下:
#define SYSMAPADDR 0x12345678
#define CODESIZE 7
static char acct_code[7] = "\xb8\x00\x00\x00\x00"/*movl $0, %eax*/
"\xff\xe0";/*jmp *%eax*/
*(long*)&acct_code[1] = (long)my_hijacking_function;
// here, use either set_pages_rw or trick CR0 to do this:
memcpy(SYSMAPADDR, acct_code, CODESIZE);
但是原函数的64位地址是0xffffffff12345678(内核位于低内存)。
那么 (long) 新函数指针是否只适合 movl 指令的 4 个 \x00 字节?
顺便说一句,请把这个链接到Can I replace a Linux kernel function with a module?和Overriding functionality with modules in Linux kernel,上面描述的hacky方法更灵活(可以拦截非外部函数=>不需要重新编译内核)。
【问题讨论】:
-
这个 Phrack 问题已经过时了。 2.6.3x Linux 内核与 2.4.x 完全不同 - 所以我怀疑这个问题的任何内容都适用于当前内核。此外,系统调用的组织方式也不同,以支持现代 CPU 的快速系统调用功能。
-
@datenwolf,它可以通过一些修改工作 - memset.wordpress.com/2010/12/03/… - 只是试图将其修复为 64 位。
-
感谢 jmkeyes 和 Random832,将在选择的具有不同 2.4-2.6 内核(最新版本)的 32/64 位发行版上设置一组测试。同时,想要更多的想法.. :) 这是一项消耗代表的赏金。
标签: c assembly linux-kernel x86-64 interception