2009-12-07 205 views
7

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

SharpPcap工作得很好,但它捕获了TCP数据包,而且这个级别太低而无法达到我想要的水平。有谁知道我怎么能轻松地从所有这些TCP数据包中获得完整的HTTP请求/响应?

感谢

回答

8

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

解析捕获的步骤是:

  • 选择一个接口
  • 开启在混杂模式的连接
  • 开始捕获或者使用一个while循环或事件回调
  • 解析原包你想

如果您正在阅读.pcap翻斗类型文件的过程几乎是同一封除非你打电话给一个离线捕捉阅读器,不需要选择一个界面,也不需要设置混杂模式。 SharpPcap支持wireshark,tcpdump和大多数其他Pcap框架所使用的所有标准过滤器。为了参考这些检查tcpdump的人。

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

当您收到原始数据包(非解析)做到这一点:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

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

一旦你有了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。

+0

'GetEncapsulated'等于'Packet.ParsePacket(e.Packet.LinkLayerType,e.Packet.Data);'对吗? – C4u 2016-07-09 11:51:22

0

我认为你是接近的解决方案:如果你有从HTTP流量的TCP数据包,你只需要提取TCP负载,以重建HTTP请求/响应。看到这个SO entry在一个可能的方式来做到这一点。

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输出可能会很快变得疯狂。

除非您的要求很复杂(如我的要求),否则这可能是您所需要的。

+0

有趣的是,PDML是一种众所周知的标准格式或应用程序特定的一次性。 SharpPcap的上限可以通过两种方式完成:对于低/中等流量,可以实时捕获/解析数据包;对于高流量捕获(如ftp传输),最好的选择是将原始上限转储到.pcap文件和后处理。 SharpPcap基本上只是一个跨平台框架,用于在C#应用程序中构建类似Wireshark的捕获。现在SharpPcap是pcap包装器,Packet.Net是解析器库。 – 2012-03-22 23:06:36

+0

您是否将代码发布到某处(例如GitHub)?如果是这样,我想在某个时候看看它。我想看看管理TCP重组步骤需要多少代码/精力。 – 2012-03-22 23:11:51

+0

我不知道PDML是一个标准还是wirehark特有的东西;无论如何,它很容易处理。 – anelson 2012-03-23 23:38:45