簡體   English   中英

c# - 如何在不依賴WinPCap的情況下在應用程序中嗅探數據包?

[英]c# - how to sniff packets in an app without relying on WinPCap?

背景 :我現在了解如何編寫一個C#應用程序,它可以監視運行應用程序的PC上進出網卡的數據包。 我知道的方法依賴於已經安裝在PC上的http://www.winpcap.org/ ,然后我使用了一個C#包裝器,如http://pcapdotnet.codeplex.com/http:// sourceforge。 net / projects / sharppcap /

問題 :我的問題是,我需要做些什么才能擁有一個可以嗅探不需要預先安裝第三方應用程序/驅動程序的數據包的C#應用​​程序?

澄清 :這是我真的想要我目前擁有的應用程序,但沒有要求我告訴用戶必須先去下載/安裝XYZ才能使用該應用程序。 出於問題的目的,假設不允許自動下載和安裝第三方應用程序/驅動程序。 (使用WinPCap我不確定你是否可以捆綁它,但我相信你不應該在任何情況下不幸)

謝謝

我個人會堅持使用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數據包。

有一種方法可以使用標准的winsocks實現來捕獲.NET上的傳入/傳出數據包。 我看過一個博客的例子,但我沒有鏈接了。

長話短說,這是一個極端的邊緣情況,因為這不是winsocks(標准的Windows網絡驅動程序)的用途。

Pcap通常需要捕獲數據包的原因是,它使用自己的NDIS網絡驅動程序來解鎖NIC的全部功能。 最重要的是,它還提供了一種簡單的方法來設置過濾器,以限制在指定接口上捕獲的數據包數量。

IE,驅動程序將忽略內核級別而不是用戶模式級別的特定類型的數據包。 因此,您將能夠更有效地過濾數據包,並在網絡上的較大負載下捕獲。

在.NET中,要過濾數據包,您需要提供自己的應用程序層數據包過濾方案,效率會低得多。

Windows出於“安全原因”阻止訪問非標准協議,因此它們並不真正支持使用RAW數據包進行網絡連接(即使可能存在代碼使其成為可能)。 RAW數據包始終用於研究新協議的設計,而非一般用途。

出於所有這些原因,通常最好選擇Winpcap和特定語言的包裝器來實現任何類型的捕獲應用程序。

注意:我個人更喜歡SharpPcap,但我對項目的開發也有偏見。 在捕獲時,Pcap.net的實現非常相似,它主要涉及數據包的解析方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM