c# - 如何在不依赖WinPCap的情况下在应用程序中嗅探数据包?

Gre*_*reg 12 .net c# winpcap packet-sniffers sharppcap

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

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

澄清:这是我真的想要我目前拥有的应用程序,但没有要求我告诉用户必须先去下载/安装XYZ才能使用该应用程序.出于问题的目的,假设不允许自动下载和安装第三方应用程序/驱动程序.(使用WinPCap我不确定你是否可以捆绑它,但我相信你不应该在任何情况下不幸)

谢谢

Chr*_*lor 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 就像Pratik所说,.Net依赖于Windows winsock网络驱动程序实现.WinPcap提供备用网络驱动程序,提供对网络接口的低级访问.尝试将winsock写入低级别捕获是一个坏主意,它是一个消费级实现,而WinPcap专门为那些进行协议原型设计和/或需要访问网络堆栈较低层的开发人员而设计. (2认同)
  • 我最近使用过这个代码,发现我的开发机器捕获了SharpPcap所做的所有数据包,但是当我把它放到测试中时,有大量错过的数据包,而SharpPcap得到了所有数据包. (2认同)

Eva*_*ice 6

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

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

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

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

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

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

出于所有这些原因,通常最好选择Winpcap和特定语言的包装器来实现任何类型的捕获应用程序.

注意:我个人更喜欢SharpPcap,但我对项目的开发也有偏见.在捕获时,Pcap.net的实现非常相似,它主要涉及数据包的解析方式.