linux内核2.6.18中的sys_call_table

时间:2009-10-19 00:41:44

标签: linux-kernel system-calls

我试图通过

将sys退出调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]

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

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

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

2 个答案:

答案 0 :(得分:4)

由于您在内核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

答案 1 :(得分: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或{{1}在某处工作)或者因为它是通过#ifndef在其他地方删除的。

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

相关问题