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類是整個操作的核心,把它用好了就成.