【问题标题】:Hooking sys_send挂钩 sys_send
【发布时间】:2014-09-30 20:53:17
【问题描述】:

我正在编写一个内核模块,我在其中挂钩系统调用表并重定向许多系统调用。我用两种方法做到了这一点。找到系统调用表的地址并将内存 rw 描述为here 的传统方法,对于 exec 和 fork 等情况,我搜索相关的函数符号(do_forkdo_execve)并替换其参考我自己的功能,例如完成here

我目前正在尝试挂钩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;

我得到错误:

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

我在 lxr 中搜索,发现__NR_send 定义在大约 16 个不同的头文件中,具有各种不同的值。

我也尝试使用第二种方法挂钩它,但无法找到sys_send的相关函数,因为do_forksys_fork

谁能告诉我 1) 在哪里可以找到 __NR_send 的正确值,以便我可以从系统调用表中挂钩它,2) 包含为 sys_send 执行的实际 c 代码的函数的名称是什么就像do_forksys_fork 所做的那样,它位于什么文件中,或者两者都更好?

【问题讨论】:

    标签: c linux kernel-module


    【解决方案1】:

    又找了几个小时,终于发现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_sendto 并检查 NULL 参数以了解调用最初是 send 还是 sendto。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多