0

我正在尝试将 sys 退出调用设置为变量

extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]

但是,当我尝试制作时,控制台给了我错误

error: ‘__NR_exit’ undeclared (first use in this function) 

任何提示将不胜感激:)谢谢

4

2 回答 2

5

由于您在内核 2.6.x 中,因此 sys_call_table 不再导出。如果你想避免编译错误,试试这个包括

#include<linux/unistd.h>

但是,它不起作用。因此,“玩” sys_call_table 的解决方法是使用以下命令在 SystemXXXX.map(位于 /boot)中找到 sys_call_table 的地址:

grep sys_call System.map-2.6.X -i

这将给出地址,然后这段代码应该允许您修改表:

unsigned long *sys_call_table; 
sys_call_table = (unsigned long *) simple_strtoul("0xc0318500",NULL,16); 


original_mkdir = sys_call_table[__NR_mkdir];
sys_call_table[__NR_mkdir] = mkdir_modificado;

希望它对你有用,我刚刚在内核 2.6.24 下测试过它,所以应该适用于 2.6.18

也在这里查看,它是一个非常好的 http://commons.oreilly.com/wiki/index.php/Network_Security_Tools/Modifying_and_Hacking_Security_Tools/Fun_with_Linux_Kernel_Modules

于 2009-12-09T00:29:44.183 回答
2

如果您没有包含文件 syscall.h,您应该在引用 __NR_exit 之前执行此操作。例如,

#include <syscall.h>
#include <stdio.h>

int main()
{
    printf("%d\n", __NR_exit);
    return 0;
}

返回:

$ cc t.c
$ ./a.out 
60

其他一些观察:

  1. 如果您已经包含该文件,则通常__NR_exit不会定义的原因是由于条件编译(#ifdef#ifndef在某处工作)而忽略了该定义,或者因为它在其他地方通过#undef.

  2. 如果您正在为内核空间编写代码,则可以使用一组完全不同的标头。LXR ( http://lxr.linux.no/linux ) 可搜索、可浏览的内核源代码存档是一个有用的资源。

于 2009-10-19T00:53:07.933 回答