我想要捕获我的机器的所有传入HTTP数据包。为此,我使用了SharpPcap,它是一个WinPcap包装器。
SharpPcap工作得很好,但是它捕获TCP数据包,这太低了,不能做我想做的事情。有人知道如何轻松地从所有这些TCP数据包中获得完整的HTTP请求/响应吗?
谢谢
发布于 2010-11-10 14:47:41
SharpPcap已经能够以与wireshark相同的方式捕获数据包(只是在代码中而不是在图形用户界面中)。您可以直接解析它们,也可以将它们以常见的.pcap文件格式转储到驱动器中。
解析捕获的步骤如下:
如果您正在读取.pcap转储文件,除了调用脱机捕获读取器,不需要选择接口,也不需要设置混杂模式之外,过程几乎相同。SharpPcap支持wireshark、tcpdump和大多数其他Pcap框架使用的所有标准过滤器。有关这些内容的参考,请查看tcpdump man。
目前还不支持直接解析HTTP,但解析TCP数据包非常容易。
当您收到原始数据包(未解析)时,请执行以下操作:
TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);
Packet.Net (SharpPcap的分离和包含组件)解析器能够直接提取TCP部分,即使通信是通过VPN、PPoE或PPP封装的也是如此。
解析了HTTP头之后,只需在字节数组中获取有效负载的packet.PayloadBytes,该字节数组应该包含原始字节的HTTP头,可以将其转换为适当的文本格式(我不确定HTTP头在该级别上使用的是UTF8编码还是ASCII码)。应该有很多免费可用的工具/库来解析HTTP头文件。
从TCP中提取HTTP包的:
您需要收集传入的连接的tcp数据包,如果数据是碎片(大于1500字节),则需要在内存中重新组装这些部分。要发现哪些部分按什么顺序进行,您需要仔细跟踪序列/确认号。
这是使用SharpPcap完成的一件很重要的事情,因为您正在处理堆栈的较低部分,并手动重新组装连接。
Wireshark有一篇有趣的文章,介绍了如何用C语言实现这一点。
到目前为止,SharpPcap还不支持TCP负载解析。
如果您正在寻找有关如何使用SharpPcap的简单示例,请下载源码树并查看其中的示例项目。还有一个tutorial for SharpPcap on codeproject。
如果您有更多的问题和/或您想对该项目提出任何功能请求,请随时在SourceForge项目上发布。它还远未消亡,仍在积极开发中。
注: Chris Morgan是项目负责人,我是SharpPcap/Packet.Net的开发人员之一。
API:代码项目上的教程项目现在是最新的,以匹配当前的。
发布于 2010-01-20 02:12:07
将TCP流解码为HTTP请求/响应对不是一件容易的事。像WireShark这样的工具付出了相当大的努力才做到这一点。
我为Ruby编写了一个WireShark包装器(这对您没有帮助),但在我写它之前,我尝试使用tshark (WireShark的命令行版本)。这并没有解决我的问题,但它可能对你有用。下面是操作步骤:
您可以捕获数据包并将它们写入一个pcap文件(SharpPcap可能有办法做到这一点)。在某个时刻,关闭cap文件并启动另一个文件,然后在旧的文件上运行tshark,其中包含一个HTTP流量过滤器,以及一个指示您希望输出为PDML格式的标志。您会发现这是一种XML格式,可以很容易地用System.Xml工具进行解析,它包含各种格式的每个HTTP字段的值。您可以编写C#代码来生成tshark,并通过管道将其StdOut流传输到XML阅读器中,以便在数据包出现时从tshark中获取数据包。我不建议使用DOM解析器作为大型捕获文件的PDML输出,因为它可能很快变得疯狂。
除非您的需求很复杂(就像我的一样),否则这可能就是您需要的全部。
发布于 2010-01-19 20:59:54
我认为您已经接近解决方案:如果您拥有来自HTTP流量的TCP数据包,则只需提取TCP有效负载,即可重新构建HTTP请求/响应。请查看此SO entry以了解实现此功能的可能方法。
https://stackoverflow.com/questions/1863564
复制相似问题