socket程式設計之DEV C++配置winpcap開發環境並編寫網路嗅探器sniffer

棉花糖灬發表於2017-12-29

期末計算機網路課程設計讓做一個網路嗅探器,要求可以檢測和選擇網路卡,並開啟到混雜模式,監聽區域網中的所有資料包並解析出所用網路協議以及首部各個欄位的值,如 MAC地址,IP地址,埠號等。

 

然後從網上各種找資料,C語言下基本上都是基於 winpcap包做的,難的是配置環境。網上有各種 VS的配置教程,但是本人用不慣 VS,所以就配置了 DEV C++,朋友也有把 codeblocks 配置成功的。下面就和大家分享一下配置過程。參考文章:DEV 搭建winpcap開發環境。

 

首先要下載 winpcap的兩個東西:

WinPcap V4.1.2:驅動程式、Dll檔案

http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe

WinPcap V4.1.2 Developer’s Pack:庫檔案、標頭檔案、簡單的示例程式程式碼和幫助檔案

http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip

 

第一個 exe檔案直接安裝到任意目錄即可。第二個 zip檔案下載解壓後將名為 WpdPack的資料夾放到 C盤下,當然放到別的地方也可以。

 

配置步驟:

 

第一步:

 

在Tools->Compiler Options->Directories->Libraries (即工具->編譯選項->目錄->庫) 裡面設定winpcap開發包目錄的Lib目錄;在Tools->Compiler Options->Directories->Includes(即工具->編譯選項->目錄->C/C++包含檔案)(C和C++兩個我都設定了,方便)裡面設定winpcap開發包目錄的Include目錄。

這裡的 lib目錄和include目錄就是上面 zip檔案解壓後的 C:\WpdPack 中的資料夾。

 

第二步:

在Project->Project Options->Parameters->Linker(即專案->專案屬性->引數->連結)下面點選“Add Library or Object”(加入庫或物件)按鈕,將開發包目錄 Lib下的wpcap.lib檔案(即 C:\WpdPack\Lib 目錄下的檔案)新增上去。

 

第三步:

在原始碼檔案#include "pcap.h"的前面增加預處理定義——#define WPCAP和#define HAVE_REMOTE。好像我只加了“#define HAVE_REMOTE”,例子中的程式碼就可以執行了。但是看文件中,好像不是這樣,具體好要多測試一些程式碼才能知道。

 

上面的步驟是其他 CSDN部落格上給的,但是在實際操作的時候還需要加上 #include "winsock.h" 這句話,包含 winsock.h 標頭檔案,不然會提示某些變數未定義的錯誤。此外在上面第二步中還需要加入 C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/WS2_32.Lib 這個檔案,不然也是會報一些亂七八糟的錯誤。

 

至此開放環境就配置好了,然後就是編寫程式碼。先給出一個 winpcap中文技術文件。嗅探器的程式碼基本上都是這裡面的原碼,然後在它的基礎上改一下、拼接一下就可以了。大體流程是檢測網路卡->選擇網路卡->篩選器的設定(可以只捕捉使用upd或tcp等協議的包)->將捕捉到的資料包分析。

另外DEV C++在編譯執行的時候需要選擇 32位的編譯器,這個我也不知道為什麼……自己試出來的。

 

再另,網路嗅探器捕捉到的大多數都是亂碼,因為編碼方式是多種多樣的。可以使用 ICMP協議中的 ping命令,ping通某個網站,然後將捕獲的資料包以 ascii碼形式輸出,將會是有規矩的字元。

 

這裡要提一下的是,分析資料包的時候好像沒有現成的函式或資料結構等,需要自己定義。比如要定義 IP協議的首部,根據每個欄位的含義解析,這裡充分利用了二進位制的相與、左移、右移等操作。另,我們捕獲到的資料包是完整的 MAC幀,也就是資料鏈路層的包,然後可以根據使用的協議確定協議首部的長度,並進一步確定資料部分的位置和大小。

 

執行效果如下:

 

最後附上上面說的用到的各種檔案以及原始碼的下載地址:原始碼及配套檔案下載。

相關文章