如何重新组装TCP数据段?

6

我现在正在使用winpcap开发一个项目,我知道被嗅探的数据包通常是分段的。如何重新组装这些TCP片段?是否有任何想法、建议或教程可用?我认为这是查看HTTP头文件的唯一方法...谢谢!

5个回答

10

tcp是一种字节流协议。您的HTTP应用程序发送的字节序列被封装在TCP数据段中,在将数据传递到另一端的应用程序之前,字节流将被重新创建。

由于您正在使用WinPcap访问TCP数据段,因此需要转到段的数据部分。TCP标头具有固定长度的20个字节+一个可选部分,您需要使用WinPcap API确定该部分的长度。

TCP段中数据部分的长度是通过从IP数据报中的字段(从封装TCP段的IP数据报中)减去TCP标头长度(从TCP段中的一个字段获取)和IP标头长度(从IP数据报中的另一个字段获取)来确定总长度(从IP数据报的另一个字段获得)。

现在您已经拥有了完整的段长度和段内数据部分的长度,因此您知道HTTP请求数据开始的偏移量。

偏移量为:

total length-length of data part
or
length of ip-header + length of tcp header

我没有使用过WinPcap,因此您需要通过API了解如何获取这些字段。

另外,IP数据包可能会进一步分片,但我希望您只通过此API获得已重组的数据包。 您可以开始了!


7
TCP不存在碎片,IP协议存在碎片。TCP是一种流协议,您可以通过跟随双方的序列号将流组装到其预期的顺序中。每个TCP数据包都进入IP层,可以在那里进行分段。您可以通过收集所有的碎片并按照头部的碎片偏移量来组装每个数据包。
需要的所有信息都在头部中。维基百科的文章非常有用,可以解释每个字段的含义。
http://en.wikipedia.org/wiki/TCP_header#Packet_structure
http://en.wikipedia.org/wiki/IPv4#Header

3

PcapPlusPlus提供了这个功能的开箱即用版本,支持所有主流操作系统(包括Windows)。请查看TcpReassembly示例以查看工作代码,并查看API文档以了解如何使用TCP重组特性。


2

根据你试图被动重组的流量来源,你可能会遇到一些TCP混淆技术,旨在困惑那些试图做与你相同事情的人。请查看这篇关于不同操作系统重组行为的论文:链接


链接已失效。我认为这里引用的论文可能是“基于目标的TCP时间戳流重组”,作者为Judy Novak和Steve Sturges,可以在Google搜索中找到许多相关内容:https://www.google.com/search?q=%22Target-Based+TCP+Timestamp+StreamReassembly%22+Judy+Novak+Steve+Sturges - Ian

1

libtins 提供了用于执行TCP流重新组装的类,以非常高层次的方式进行操作,因此您无需担心TCP内部细节。


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