13

背景:我现在了解如何编写一个 C# 应用程序,该应用程序可以在运行应用程序的 PC 上监控进出网卡的数据包。我知道的方法依赖于http://www.winpcap.org/已经安装在 PC 上,然后我使用 C# 包装器,例如http://pcapdotnet.codeplex.com/http://sourceforge。净/项目/sharppcap/

问题:但是,我的问题是,我需要做什么才能拥有一个可以嗅探不需要预安装第 3 方应用程序/驱动程序的数据包的 C# 应用程序?

澄清:那是我真的想要我目前拥有的应用程序,但不需要我告诉用户必须去下载/安装 XYZ 才能使用该应用程序。出于问题的目的,假设也不允许自动下载和安装第 3 方应用程序/驱动程序。(使用 WinPCap 我不确定你是否可以捆绑它,但我相信无论如何你都不应该这样做)

谢谢

4

2 回答 2

6

我个人会坚持使用 WinPCap。但是既然你问过,可以使用以下代码从网络嗅探数据包以启用原始套接字。

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse("<IP Address Here of NIC to sniff>"), 0));
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte[] inBytes = new byte[] { 1, 0, 0, 0 };
byte[] outBytes = new byte[] { 0, 0, 0, 0 };
s.IOControl(IOControlCode.ReceiveAll, inBytes, outBytes);

完成此操作后,您可以使用Socket.ReceiveSocket.BeginReceive读取原始 IP 数据包。

于 2010-08-15T07:07:38.603 回答
6

有一种方法可以仅使用标准的 winsocks 实现来捕获 .NET 上的传入/传出数据包。我看过一个博客,上面有例子,但我没有链接了。

长话短说,这是一个极端的边缘案例,因为这不是 winsocks(标准 Windows 网络驱动程序)的用途。

通常需要 Pcap 来捕获数据包的原因是,它使用自己的 NDIS 网络驱动程序来解锁 NIC 的全部功能。最重要的是,它还提供了一种简单的方法来设置过滤器以限制在指定接口上捕获的数据包数量。

IE,驱动程序将在内核级别而不是用户模式级别忽略特定类型的数据包。因此,您将能够更有效地过滤数据包并在网络上的较大负载下进行捕获。

在 .NET 中,要过滤数据包,您需要提供自己的应用层数据包过滤方案,但效率会低得多。

出于“安全原因”,Windows 会阻止对非标准协议的访问,因此它们并不真正支持使用 RAW 数据包进行网络连接(即使可能存在使之成为可能的代码)。RAW 数据包总是用于研究新协议的设计,而不是一般用途。

由于所有这些原因,选择 Winpcap 和特定语言的包装器来实现任何类型的捕获应用程序通常是一个好主意。

注意:我个人更喜欢 SharpPcap,但我在做项目开发时也有偏见。Pcap.net 在捕获方面的实现非常相似,主要是在如何解析数据包方面存在分歧。

于 2010-11-10T23:19:13.137 回答