挂钩sys_send

时间:2014-08-07 14:45:32

标签: c linux kernel-module

我正在编写一个内核模块,其中我挂钩了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_senddo_fork

有人可以告诉我1)在哪里找到sys_fork的正确值,以便我可以从syscall表中挂钩,2)包含为{执行的实际c代码的函数的名称是什么像__NR_send sys_senddo_fork所做的{1}}及其所在的文件,甚至更好?

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参数,以了解该调用最初是发送还是发送。