获取Windows、Linux和Mac的TCP序列号的C代码

3
有没有一种方式(使用原始套接字或其他方式)可以获取进程使用的TCP序列号。例如,如果一个进程处于活动状态并具有活动的TCP连接,是否可以从进程启动时获取该进程的TCP序列号,或者至少获取其最后接收或发送的确认号?如果可以,如何使用C或任何低级语言实现?
实际上,可以:
  • ProcessA检测到已经发送的TCP序列号(在ProcessA启动时)与活动的ProcessB相关联吗?
  • ProcessA后来能否检测到自己收到或发送的最后一个ACK号码?

1
为什么不看一下Wireshark的源代码呢?http://www.wireshark.org/ - Adrian Cornish
可能是重复的问题:获取TCP套接字序列号和确认号 - Celada
不同意将其视为重复,因为Wireshark可以显示这些值。 - Adrian Cornish
我认为你需要将进程B变成某种隧道或代理,以便进程A通过它来连接外部世界。 - MartyE
MartyE,隧道对我没有帮助,因为它只能捕获当前的数据包流。我需要事后找到序列号。例如,“ProcessB开始。创建一个TCP连接。最后一个确认号是3456。ProcessA开始。ProcessA试图找出已经发送的ack 3456。” - user1637509
可能有其他更有效的方法来完成这个任务。netstat -n -p 显示进程与其各种 TCP/IP 连接的关联,并立即完成,无需监听网络流量。 - Havenard
3个回答

0

您可以使用winpcap,http://www.winpcap.org/来捕获TCP数据包。它有一个API,可以让您访问NIC上所有进出的数据包。您可以访问完整的数据包,因此可以从中提取任何所需信息。

但是,您必须监视连接以了解序列号。当然,您必须从实时数据包中提取序列号。如果您决定突破已经运行的连接,则必须等待下一个数据包以获取所需信息。


0
你需要一个数据包分析器来查看进程使用的序列号和确认号的值。wireshark是一个知名的数据包分析器,适用于所有平台。
如果你想编写自己的数据包分析器,你需要在Windows中使用winpcap库,在Linux中使用pcap库。
下载并运行这个程序。sniffex 你将获得关于监控和捕获数据包的很多想法。

0

在已经提到的选项中,libpcap 是最好的选择,因为它提供了一种接近平台无关的捕获数据包的方式。

然而,在 Linux 上还有另一个选项,我已经喜欢上了它,那就是使用 iptables NFQUEUE 目标将你感兴趣的数据包发送到用户空间(可能与 tee 结合使用)。通过这种技术,你可以利用 iptables 的功能只获取你感兴趣的数据包(例如 SYN 或基于概率的一些随机数据包)。

NFQUEUE的使用示例可以在这里这里找到。在原始表中使用NFQUEUE以确保所有数据包都被评估。应该使用Libnetfilter_queue来简化接收数据包的过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接