如何使用SharpPcap捕获HTTP数据包

Mic*_*ves 7 c# sniffing network-protocols sharppcap

我想捕获我的机器的所有传入HTTP数据包.要做到这一点,我使用的是SharpPcap,这是一个WinPcap包装器.

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

谢谢

Eva*_*ice 8

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

解析捕获的步骤是:

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

如果你正在读.pcap转储文件,除非你叫脱机捕获的读者,并不需要选择一个接口,而不必设置混杂模式的过程几乎是一样的.SharpPcap支持wireshark,tcpdump和大多数其他Pcap框架使用的所有标准过滤器.有关这些的参考,请检查tcpdump man.

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

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

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);
Run Code Online (Sandbox Code Playgroud)

所述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的示例,请下载源代码树并查看包含的示例项目.在codeproject上还有一个SharpPcap教程.

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

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

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