我正在编写一个内核模块,其中我挂钩了syscall表并重定向了许多系统调用。我用两种方法做到了这一点。传统方法,您可以找到syscall表的地址并按照here所述生成内存rw,对于exec和fork等情况,我会搜索相关的函数符号(do_fork
,{{1 }}并将其引用替换为我自己的函数,例如done here。
我目前正试图挂钩do_execve
,但遇到了几个问题。当我尝试以传统的方式做到这一点:
sys_send
我收到错误:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <asm/paravirt.h>
ref_sys_send = (void *)sys_call_table[__NR_send];
sys_call_table[__NR_send] = (unsigned long *)new_sys_send;
我在lxr中搜索,发现{16}在大约16个不同的头文件中定义了error: ‘__NR_send’ undeclared (first use in this function)
。
我也尝试使用第二种方法将其挂钩,但无法找到__NR_send
的相关函数,因为sys_send
是do_fork
。
有人可以告诉我1)在哪里找到sys_fork
的正确值,以便我可以从syscall表中挂钩,2)包含为{执行的实际c代码的函数的名称是什么像__NR_send
sys_send
对do_fork
所做的{1}}及其所在的文件,甚至更好?
答案 0 :(得分:0)
经过几个小时的搜索,我终于发现sys_send是通过宏在Linux/net/socket.c
中定义的
SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
unsigned int, flags)
{
return sys_sendto(fd, buff, len, flags, NULL, 0);
}
然后可以使用__NR_sendto
简单地挂钩sys_send并检查NULL参数,以了解该调用最初是发送还是发送。