天天看點

【轉】SHarpPcap(winpcap基于c#封轉的庫)網絡嗅探程式核心 - LT

【轉】SHarpPcap(winpcap基于c#封轉的庫)網絡嗅探程式核心

1. 獲得網絡裝置

由于一個系統的網絡裝置可能不止一個,因而使用了一個清單類來儲存所有的裝置,這裡使用了一個靜态方法進行操作

/* Retrieve the device list */

PcapDeviceList devices = SharpPcap.GetAllDevices();

擷取清單後,就能對裝置進行操作了,其實裝置分為2個子類,一類是NetworkDevice,這個是算是真實的網絡裝置吧,還有一類是PcapOfflineDevice,這個類是通過讀取抓封包件生成的虛拟裝置.

如果是NetworkDevice,那麼還有些其他的網絡資訊,如ip位址,子網路遮罩等.

2. 抓包過程

在標明了一個PcapDevice後,就能使用他的方法進行抓包了.首先要打開裝置.

 //Open the device for capturing

 //true -- means promiscuous mode

 //1000 -- means a read wait of 1000ms

 device.PcapOpen(true, 1000);

方法提供2個參數,第一個為抓包模式,指明是否抓其他Ip位址的包,類似Hub的功能;第二個是指逾時時間,毫秒級.

下面就能正式抓包了,一共提供了3種方法:

 device.PcapStartCapture();

 異步方式,調用之後立即傳回,具體抓下來的包,由PcapOnPacketArrival事件處理.需要停止的時候調用device.PcapStopCapture()進行關閉.

 device.PcapCapture(int packetCount);

半同步方式,調用後,直到抓到packetCount數量的包才傳回., 具體抓下來的包,由PcapOnPacketArrival事件處理.

注意:如果傳入SharpPcap.INFINITE将不退出,永遠都在接收,且程式就停在這個語句了.

packet=device.PcapGetNextPacket()

同步方式,調用後直接等待收到的下一個包,并獲得該包.

注意:如果逾時,就可能還沒有獲得包體就退出該過程.這時packet=null,是以使用該方法每次都要對包進行檢測.

最後一定要記得,關閉裝置.

device.Close();

3. 包體分析.

在捕捉到包後,就需要根據實際的包進行轉換了.

 if(packet is TCPPacket)

 {

TCPPacket tcp = (TCPPacket)packet;

}

因為這個需要轉換的包類型很多,具體都在Tamir.IPLib.Packets裡面.按照說明,一直嘗試轉換是不對的了,需要與過濾機制配合使用,隻對自己有用的包分析

4. 過濾機制

包過濾是抓包程式的必備機制,要想對某次捕捉進行過濾,就必須在裝置打開後,開始抓包前設定裝置的過濾參數.

 //tcpdump filter to capture only TCP/IP packets           

 string filter = "ip and tcp";

 //Associate the filter with this capture

 device.PcapSetFilter( filter );

注意的是,filter是一個文本,遵循了tcpdump syntax.

5. 其他

A. SharpPcap還能儲存捕獲的包,而且使用起來也很簡單.

儲存: 在抓包前設定Dump的檔案

//Open or create a capture output file

device.PcapDumpOpen( capFile);

抓到包後,把需要的包儲存起來

 //dump the packet to the file

    device.PcapDump( packet );

使用:把封包件當作一個脫機裝置

 //Get an offline file pcap device

device = SharpPcap.GetPcapOfflineDevice( capFile );

然後這個裝置也可以捕捉包,使用起來和真實的一樣(當然,不會有逾時了就是)

B.對裝置直接發包

相對與捕捉包,也可以發送包.提供了2種方法

 //Send the packet out the network device,直接發送包

     device.PcapSendPacket( bytes );

  //使用裝置的發送隊列

device.PcapSendQueue(squeue, true );

兩種顯然上面的容易,下面的高效

C.網絡流量統計—沒看,我暫時也不想用.

6.總結

主要來說PcapDevice類是整個操作的核心,把它用好了就成.