3

有没有办法(使用原始套接字或其他方式)来获取进程使用的 TCP 序列号。例如,如果一个进程处于活动状态并且有一个活动的 TCP 连接,是否有可能从进程启动时获取该进程的 TCP 序列号,或者至少是它接收或发送的最后一个确认号?如果是这样,我该如何使用 C 或任何低级语言来做到这一点?

实际上,可以:

  • ProcessA 检测到与活动 ProcessB 相关联的已发送的 TCP 序列号(在 ProcessA 启动时)?

或者

  • ProcessA 可以在事后检测到 ProcessA 接收或发送的最后一个 ACK​​ 号吗?
4

3 回答 3

0

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

但是,当然,您必须监视连接才能知道序列号。您必须从实时数据包中提取序列号。如果您决定中断已经运行的连接,则必须等待下一个数据包来获取您的信息。

于 2012-11-30T16:30:02.790 回答
0

您将需要一个数据包分析器来查看进程使用的序列号和确认号的值。wireshark 是一个众所周知的数据包分析器,适用于所有平台。

如果您想编写自己的数据包分析器,您必须使用库 winpcap for windows,pcap for linux。

下载并运行这个程序。嗅探

您将对监控和捕获数据包有很多了解。

于 2013-04-03T16:24:09.930 回答
0

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

但是,Linux 上的另一个选择,我越来越喜欢,是使用 iptables NFQUEUE目标将您感兴趣的数据包发送到用户空间(可能与 tee 结合使用)。使用这种技术,您可以使用 iptables 的强大功能来仅获取您感兴趣的数据包(例如 SYN 或一些基于概率的随机数据包)。

一个如何使用 NFQUEUE 的例子在这里这里。在原始表中使用 NFQUEUE 以确保评估所有数据包。应该使用Libnetfilter_queue来简化接收数据包的过程。

于 2013-04-03T20:18:50.177 回答