SharpPcap學習筆記

2021-08-23 15:32:41 字數 2564 閱讀 1710

在做飛信的時候看到nathan2007寫的feitionsniffer(乙個用bc++和winpcap開發的小工具,小巧卻很實用),不禁暗暗想自己也能做個類似的東西,以後分析起協議就方便了.上網搜尋了一下,發現有人已經用c#把winpcap的功能進行了封裝,開發了sharppcap.然後看了sharppcap tutorial,感覺還是挺簡單的.順便做個筆記以後用起來就方便了.

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

PPPOE資料報轉換及SharpPcap應用

在最近寫的乙個程式中需要用到sniffer功能,但由於通過.net自身的socket做出來的sniffer不能達到實際應用的要求 如不能監聽wifi資料報 所以找到了winpcap的.net庫sharppcap 說下我遇到的問題,由於我自己用的是通過路由器上網,所以做出來的東西所有功能都可以用,但把...

c 使用sharppcap實現 網路抓包

原文 詳細用法 csharp view plain copy print?using system using system.collections.generic using system.linq using system.text using system.io using system.th...

C 使用sharppcap實現網路抓包 2

雖然網上已經有了sharpsniffer 1 建立套接字 2 繫結到本機 3 設定iocontrol 4 接收資料 5 處理 顯示 資料 1 建立套接字 建立socket 據msdn,iocontrolcode.receiveall 後面要使用到 使用時有以下限制 receiveall 啟用對網路上...