我正在尝试将 sys 退出调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
但是,当我尝试制作时,控制台给了我错误
error: ‘__NR_exit’ undeclared (first use in this function)
任何提示将不胜感激:)谢谢
我正在尝试将 sys 退出调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
但是,当我尝试制作时,控制台给了我错误
error: ‘__NR_exit’ undeclared (first use in this function)
任何提示将不胜感激:)谢谢
由于您在内核 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
如果您没有包含文件 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
其他一些观察:
如果您已经包含该文件,则通常__NR_exit
不会定义的原因是由于条件编译(#ifdef
或#ifndef
在某处工作)而忽略了该定义,或者因为它在其他地方通过#undef
.
如果您正在为内核空间编写代码,则可以使用一组完全不同的标头。LXR ( http://lxr.linux.no/linux ) 可搜索、可浏览的内核源代码存档是一个有用的资源。