我正在尝试通过以下方式将sys exit调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
但是,当我尝试执行此操作时,控制台显示以下错误
error: ‘__NR_exit’ undeclared (first use in this function)
如有任何建议,我将不胜感激:)谢谢
发布于 2009-12-09 00:29:44
由于您使用的是内核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-10-18 16:53:08
如果没有包含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
.https://stackoverflow.com/questions/1586481
复制相似问题