gpt4 book ai didi

c - 在 netfilter Hook 中查找可执行发送数据包的名称

转载 作者:太空狗 更新时间:2023-10-29 11:12:12 24 4
gpt4 key购买 nike

我正在编写一个内核模块,它使用 netfilter Hook 来过滤 TCP 数据包,并且需要找出发送数据包的可执行文件的路径。到目前为止,我使用了以下方法,但它打印的名称似乎与所使用的可执行文件无关(/usr/lib/firefox/firefoxusr/bin/telnet.netkit/usr/bin/wget)。

pid_t pid = current->pid;
struct path path;
char buff[BUFF_LEN];
snprintf (buff, BUFF_LEN, "/proc/%d/exe", pid);
if(!kern_path(buff, LOOKUP_FOLLOW, &path)) {
struct dentry* procEntry = path.dentry;
printk("Process: %s\n", procEntry->d_name.name);
printk("Parent: %s\n", procEntry->d_parent->d_name.name);
}

内核日志输出: enter image description here

最佳答案

这看起来像是一份质量很差的大学作业,我有一种明显的印象,这种东西已经出现在这里了。

您的代码很可能是从中断上下文中执行的,即随机线程被中断以进行数据包处理,而“当前”是指向该随机线程的指针。这应该很容易验证,例如通过获取回溯——可通过 WARN_ONCE 等实现。

通过 procfs 查找 current 的可执行文件名非常糟糕。 procfs 必须做更多 工作并最终访问有效最新的内容。更糟糕的是,您无法放置找到的路径,因此会泄漏资源。如果此代码确实是从中断处理程序执行的,则结果不仅是无意义的,而且由于潜在的休眠而无法使用此方法安全地获得。

即使您获得了“正确的”可执行文件名称,整个分配也是废话。一个进程可以通过多种方式改变另一个进程的执行。从而有效地绕过您现有的任何过滤器。有趣的是,有一种方法可以将您的进程名称更改为其他名称而无需执行任何操作,这再次使该概念无效。

您能做的最好的事情就是按凭据进行过滤,但它们不是特定于流程的。原则上,您可以将 selinux 标签添加到文件并据此进行过滤,但这又一次很弱。

简而言之,作业是胡说八道。

关于c - 在 netfilter Hook 中查找可执行发送数据包的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47634064/

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