gpt4 book ai didi

c - Hook sys_send

转载 作者:行者123 更新时间:2023-11-30 17:30:19 24 4
gpt4 key购买 nike

我正在编写一个内核模块,在其中 Hook 系统调用表并重定向许多系统调用。我用两种方法做到了这一点。传统方法是找到系统调用表的地址并使内存读写,如here所述。 ,对于 exec 和 fork 等情况,我搜索相关函数符号( do_forkdo_execve ),并将其引用替换为我自己的函数的引用,例如 did here .

我目前正在尝试 Hook 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 个不同的头文件中,具有各种不同的值。

我也尝试使用第二种方法来 Hook 它,但无法找到相关的函数,即 sys_senddo_forksys_fork .

有人可以告诉我 1) 在哪里可以找到 __NR_send 的正确值吗?这样我就可以从系统调用表中 Hook 它,2)包含为 sys_send 执行的实际 C 代码的函数的名称是什么?喜欢 do_forksys_fork做它位于哪个文件中,或者更好的是两者都存在?

最佳答案

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

关于c - Hook sys_send,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25185488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com