如何使用SharpPcap捕获HTTP数据包

时间:2009-12-07 23:12:12

标签: c# network-protocols sniffing sharppcap

我想捕获我机器的所有传入HTTP数据包。为此,我使用的是SharpPcap,这是一个WinPcap包装器。

SharpPcap运行良好,但它捕获TCP数据包,这太低了,无法做我想要的。有谁知道如何轻松地从所有这些TCP数据包中获取完整的HTTP请求/响应?

由于

3 个答案:

答案 0 :(得分:8)

SharpPcap已经能够以与wireshark相同的方式捕获数据包(仅在代码而不是GUI中)。您可以直接解析它们,也可以将它们以普通的.pcap文件格式转储到驱动器中。

解析捕获的步骤是:

  • 选择一个界面
  • 以混杂模式打开连接
  • 使用while循环或事件回调开始捕获
  • 将原始数据包解析为您想要的类型

如果您正在阅读.pcap转储文件,除了您调用离线捕获阅读器,不需要选择接口,也不需要设置混杂模式之外,该过程几乎相同。 SharpPcap支持wireshark,tcpdump和大多数其他Pcap框架使用的所有标准过滤器。有关这些的参考,请检查tcpdump man。

目前不支持直接解析HTTP,但解析TCP数据包非常简单。

当您收到原始数据包(未解析)时,请执行以下操作:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

Packet.Net(SharpPcap的一个独立且包含的组件)解析器能够直接拔出TCP部分,即使通信是由VPN,PPoE或PPP封装的。

一旦解析了TCPPacket,只需抓取packet.PayloadBytes为一个字节数组中的有效负载,该数组应包含原始字节中的HTTP头,可以转换为正确的文本格式(我不确定HTTP头是否使用该级别的UTF-8或ASCII编码)。应该有大量免费提供的工具/库来解析HTTP头。


从TCP中提取HTTP数据包:

您需要收集连接的tcp数据包,如果数据被分段(大于1500字节),则需要重新组装内存中的部分。要发现哪些部分按照您需要的顺序仔细跟踪序列/确认号。

使用SharpPcap完成这项工作非常重要,因为您正在使用堆栈的较低部分并手动重新组装连接。

Wireshark有一篇关于如何在C中完成此任务的有趣文章。

截至目前,SharpPcap不支持TCP有效负载解析。


如果您正在寻找易于理解的如何使用SharpPcap的示例,请下载源代码树并查看包含的示例项目。还有tutorial for SharpPcap on codeproject

如果您有更多问题和/或想要向项目发出任何功能请求,请随时在SourceForge项目上发布。它远非死亡,而且还在继续积极发展。

注意:Chris Morgan是项目主管,我是SharpPcap / Packet.Net的开发人员之一。

更新:代码项目的教程项目现在是最新的,以匹配当前的API。

答案 1 :(得分:2)

将TCP流解码为HTTP请求/响应对并非易事。像WireShark这样的工具付出了相当大的努力。

我为Ruby编写了一个WireShark包装器(不是那会对你有所帮助),但在我编写它之前,我尝试使用tshark(WireShark的命令行版本)。这并没有解决我的问题,但它可能对你有用。方法如下:

您捕获数据包并将其写入pcap文件(SharpPcap可能有办法执行此操作)。在某些时候关闭cap文件并启动另一个文件,然后在旧文件上运行带有HTTP流量过滤器的tshark,以及一个表示您希望输出为PDML格式的标志。您会发现这是一种XML格式,可以使用System.Xml工具轻松解析,该工具包含各种格式的每个HTTP字段的值。您可以编写C#代码来生成tshark,并将其StdOut流传输到XML阅读器中,以便在出现时从tshark中获取数据包。我建议不要使用DOM解析器,因为大型捕获文件的PDML输出会很快变得疯狂。

除非你的要求很复杂(就像我的要求一样),否则这可能就是你所需要的。

答案 2 :(得分:0)

我认为您接近解决方案:如果您拥有来自HTTP流量的TCP数据包,则只需提取TCP有效负载即可重建HTTP请求/响应。有关可能的方法,请参阅此SO entry