在 C 中挂钩到 TCP 堆栈

Posted

技术标签:

【中文标题】在 C 中挂钩到 TCP 堆栈【英文标题】:Hooking into the TCP Stack in C 【发布时间】:2010-09-08 22:55:09 【问题描述】:

这不仅仅是我想要在这里进行的捕获。我想首先捕获数据包,然后实时检查有效负载中的特定数据,删除它,注入签名并将数据包重新注入堆栈以像以前一样发送。

我阅读了使用 IPFW 的 ipfw 转移套接字,它看起来很有希望。修改数据包并使用转移套接字将它们重新注入堆栈的示例怎么样?另外,出于好奇,是否可以使用 Java 从套接字读取数据,或者这是否会限制我进行打包修改和重新注入等?

【问题讨论】:

【参考方案1】:

查看转移套接字:Divert Sockets mini HOWTO。

它们通过将符合特定 ipfw 规则的流量传递到一个特殊的原始套接字来工作,然后可以将更改的流量重新注入网络层。

【讨论】:

【参考方案2】:

如果您只是在寻找数据包捕获,那么 libpcap 非常受欢迎。它用于 tcpdump 和 ethereal 等基本工具。至于“挂钩到堆栈”,除非您计划从根本上改变网络实现方式(即添加您自己的层或更改 TCP 的行为),否则您使用 IPF 进行数据包修改或干预的想法似乎最好的选择。在 Linux 中,他们有一个特定的用户空间模块重定向目标,IPF 可能有类似的东西,或者你可以修改 IPF 来做类似的事情。

如果您只是对查看数据包感兴趣,那么 libpcap 是您的最佳选择。您可以在以下位置找到它:http://www.tcpdump.org/

【讨论】:

【参考方案3】:

我认为可以在用户空间中使用 QUEUE 或 NFQUEUE iptables 目标执行此操作。客户端应用程序附加到一个队列并接收所有匹配的数据包,它可以在重新注入之前对其进行修改(如果需要,它也可以丢弃它们)。

有一个需要链接的客户端库 libnetfilter_queue。遗憾的是,文档很少,但有一些邮件列表帖子和示例。

出于性能原因,您不会希望对每个数据包都执行​​此操作,而只想对特定匹配的数据包执行此操作,您必须使用标准 iptables 规则进行匹配。如果这还不够,您需要编写自己的 netfilter 内核模块。

【讨论】:

【参考方案4】:

我将回应其他推荐 iptables 的响应(取决于您尝试匹配的模式和您想要进行的数据包修改的复杂性) - 直到我注意到 BSD 标记问题。

正如Stephen Pellicer 已经提到的,libpcap 是捕获数据包的好选择。不过,我相信 libpcap 也可以用来发送数据包。作为参考,我很确定 tcpreplay 使用它来重放 pcap 格式的文件。

【讨论】:

以上是关于在 C 中挂钩到 TCP 堆栈的主要内容,如果未能解决你的问题,请参考以下文章

返回上一个屏幕时执行 useQuery() 挂钩反应原生堆栈导航器

返回时dll挂钩未正确更新调用堆栈

detours hooked CreateFile 函数触发堆栈溢出

docker 容器是不是有自己的 TCP/IP 堆栈?

如何在 VC++ 中禁用 Windows TCP/IP 堆栈 [以编程方式]

是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp