sharppcap
一个完全托管的、跨平台(Windows、Mac、Linux)的 .NET 库,用于从实时和基于文件的设备捕获数据包
SharpPcap 的官方仓库。
目录
功能特性
关于数据包解析和创建,请参见 Packet.Net。
-
在 Linux 上,支持 libpcap
-
在 Windows 上,支持:
- Npcap(前身为 WinPcap)扩展,请参见 Npcap API 指南
- WinDivert (https://www.reqrypt.org/windivert.html)
-
在所有平台上:
- 实时设备列表
- 统计信息
- 从实时设备(实际网络设备)和离线设备(捕获文件)读取数据包
- 支持 Berkeley 数据包过滤器
- 将数据包转储到 Pcap 文件
- Pcap 和 pcap-ng 格式(当使用 libpcap >=1.1.0 或 npcap 时)
- 使用 ReadOnlySpan<> 以避免 SharpPcap 内部的内存分配和复制,提供最佳性能
- 提供辅助方法,用于将数据转换为对象实例,如果需要在内存中持久化捕获的数据包
-
NativeLibrary 支持
- 捕获库解析在 Linux、OSX 和 Windows 上运行顺畅
- 在 Linux 上干净地加载 libpcap,无论发行版是否有指向 libpcap.so 的符号链接
-
支持 .NET Core 3 和 .NET Framework
示例
查看 Examples 文件夹,了解使用 SharpPcap 的一系列完整示例项目
列出设备
var devices = CaptureDeviceList.Instance;
foreach (var dev in devices)
Console.WriteLine("{0}\n", dev.ToString());
捕获数据包
void Device_OnPacketArrival(object s, PacketCapture e)
{
Console.WriteLine(e.GetPacket());
}
using var device = LibPcapLiveDeviceList.Instance[0];
device.Open();
device.OnPacketArrival += Device_OnPacketArrival;
device.StartCapture();
从捕获文件读取
void Device_OnPacketArrival(object s, PacketCapture e)
{
Console.WriteLine(e.GetPacket());
}
using var device = new CaptureFileReaderDevice("filename.pcap");
device.Open();
device.OnPacketArrival += Device_OnPacketArrival;
device.Capture();
写入捕获文件
using var device = new CaptureFileWriterDevice("somefilename.pcap", System.IO.FileMode.Open);
var bytes = new byte[] { 1, 2, 3, 4 };
device.Write(bytes);
CI 支持
我们支持多个 CI 系统,原因如下:
- CI 系统的多样性,以防其中一个停止运行
- 提供示例,以便您可以自定义 SharpPcap 并在内部构建中使用这些 CI 系统。请注意,我们假设您遵循该库的许可证。
发布
SharpPcap 通过 nuget 发布
平台特定说明
- OSX(至少在 11.1 版本)缺少带有 pcap_open 的 libpcap
致谢
SharpPcap 能够发展到今天的水平,要归功于许多提供改进和修复的开发者,以及通过问题和功能请求提供有用反馈的用户。
我们特别感谢一些我们所依赖的项目(因为 SharpPcap 是一个 C# 封装):
- libpcap - 非常感谢发布 1.10 版本
- npcap - 为 Windows 上继续提供数据包捕获支持
从 5.x 版本迁移到 6.0 版本
我们希望您会发现 6.x 的 API 更加简洁易用。
6.0 版本带来了许多清理工作,这导致了与 5.x 用户的 API 不兼容。
为了帮助从 5.x 迁移到 6.0,以下是您需要对 SharpPcap 使用进行的一些更改列表。
这些示例也是很好的资源,因为它们展示了使用最新 API 的工作示例。
- 数据包数据通过 PacketCapture 返回,它使用 ReadOnlySpan<>。
- 从 ReadOnlySpan<> 到 RawCapture 的转换由 PacketCapture.GetPacket() 执行。
- 这避免了在数据包捕获过程中分配内存。
- 通过避免内存分配和内存复制,原始捕获性能可能会提高高达 30%。
- Span 非常适合将数据包转储到磁盘以供后续处理的用例。
- 使用 NativeLibrary 以改进捕获库的解析
- 改善了在 Linux 发行版上的库解析情况,这些发行版有 libpcap.so.X.Y 符号链接但没有 libpcap.so 符号链接
- 移除了对 Mono DllMap 的支持,因为 Mono 支持 NativeLibrary。参见 https://www.mono-project.com/news/2020/08/24/native-loader-net5/
- 设备实现 IDisposable 接口
- 移除对 Close() 的调用
- 将 'var device = xxx;' 改为 'using device = xxx;'
- 将 OpenFlags 重命名为 DeviceModes
- Open() 方法已合并为更少的方法,并带有默认变量。
- DeviceMode 已被 DeviceModes 替代,因为 DeviceMode 无法涵盖打开设备的所有组合方式。
- NpcapDevice 改为 LibPcapLiveDevice
- 如果您正在使用 NpcapDevice,应考虑使用 LibPcapLiveDevice。最新版本的 Npcap 附带了较新版本的 libpcap,提供了几乎所有 Npcap 原生 API 的功能。
- 当前的差距在于统计模式,目前仅由 Npcap 支持。
- 有人提出过统计模式包装器的想法,可以提供类似的功能,尽管效率可能不如在 Windows 上在内核或驱动程序中实现的那样高,但可用于 libpcap 系统。
- WinPcap 已被废弃
- 我们建议切换到 LibPcapLiveDevice
- 远程认证
- 如果您正在使用 RemoteAuthentication,一些功能已被整合到这个类中,并且 API 已更改,不再使用 ICredentials 和 NetworkCredentials。