我正在尝试重新实现旧的庞然大物内核拦截(在这个 Phrack 问题中描述)。
替换 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(内核位于低内存)。
那么(长)新函数指针是否只适合movl指令的 4 个\x00字节?
顺便说一句,请将此链接到我可以用模块替换 Linux 内核功能吗?和用Linux内核中的模块覆盖功能,上面描述的hacky方法更灵活(可以拦截非外部函数=>无需重新编译内核)。