周璐璐
摘 要:隨著網(wǎng)絡(luò)技術(shù)的發(fā)展及其應(yīng)用的普及,互聯(lián)網(wǎng)上的信息資源日漸繁多,復(fù)雜的網(wǎng)絡(luò)環(huán)境使得信息存儲、處理的風(fēng)險大大增加,同時信息傳送也產(chǎn)生了新的問題。本設(shè)計IP網(wǎng)絡(luò)數(shù)據(jù)嗅探器是軟件網(wǎng)絡(luò)數(shù)據(jù)嗅探器,它可以獲得計算機的網(wǎng)卡列表供用戶選中要用于監(jiān)聽工作的網(wǎng)卡。它還可以將計算機網(wǎng)卡設(shè)置為混雜模式,從而監(jiān)聽到連接端口上出現(xiàn)的一切數(shù)據(jù)。
關(guān)鍵字:嗅探器;協(xié)議;數(shù)據(jù)包;Winpcap;MFC;類
隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,人們對網(wǎng)絡(luò)安全的要求越來越高,因此捕獲并分析數(shù)據(jù)包的軟件應(yīng)用日漸廣泛。IP網(wǎng)絡(luò)數(shù)據(jù)嗅探器是一款用來捕獲和分析以太網(wǎng)數(shù)據(jù)包的軟件。它可用于維護網(wǎng)絡(luò)安全,還可以獲得計算機的網(wǎng)卡列表供用戶選中要用于監(jiān)聽工作的網(wǎng)卡。它會根據(jù)用戶自定義的過濾規(guī)則捕獲數(shù)據(jù)包。通過分析數(shù)據(jù)包幀結(jié)構(gòu),它可以獲取該數(shù)據(jù)包的各層協(xié)議內(nèi)容。它可以將分析結(jié)果以及整個數(shù)據(jù)包在軟件主界面中顯示,并把數(shù)據(jù)包寫入pcap文件、導(dǎo)出到用戶所選路徑。
下面給讀者介紹IP網(wǎng)絡(luò)數(shù)據(jù)嗅探器的總體設(shè)計和捕包過程。
1 系統(tǒng)功能設(shè)計
本設(shè)計的基本功能是捕獲并分析數(shù)據(jù)包,具體包括獲取網(wǎng)卡信息、打開網(wǎng)卡;用戶自定義過濾規(guī)則;捕獲數(shù)據(jù)包;通過分析數(shù)據(jù)包在網(wǎng)絡(luò)中第二、三、四層所用協(xié)議,獲得其源目的MAC地址、IP地址以及端口號,將上述內(nèi)容以列表控件的報表格式顯示在軟件主界面中;以樹控件的形式將數(shù)據(jù)幀在數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層使用的協(xié)議數(shù)據(jù)報各字段信息顯示在軟件主界面中;以編輯框的形式將數(shù)據(jù)包內(nèi)容顯示在軟件主界面中;最后還將數(shù)據(jù)導(dǎo)出到pcap格式的文件中。
網(wǎng)卡的配置、過濾器以及數(shù)據(jù)包的捕獲功能的實現(xiàn)主要是通過調(diào)用Winpcap提供的API函數(shù)完成的,數(shù)據(jù)解析、顯示功能的實現(xiàn)主要是通過自定義函數(shù)完成,文件導(dǎo)出部分功能的實現(xiàn)主要通過Windows Shell編程中的函數(shù)完成。
2 系統(tǒng)的架構(gòu)設(shè)計
IP網(wǎng)絡(luò)數(shù)據(jù)嗅探器的總體設(shè)計可以由三個模塊構(gòu)成,自底向上分別是網(wǎng)絡(luò)嗅探器設(shè)置模塊、數(shù)據(jù)包捕獲模塊和數(shù)據(jù)處理模塊。
網(wǎng)絡(luò)嗅探器設(shè)置模塊主要是通過調(diào)用Winpcap提供的部分API函數(shù),實現(xiàn)獲取網(wǎng)卡列表信息、設(shè)置并編譯過濾器、將網(wǎng)卡置為混雜模式三個步驟;
數(shù)據(jù)包捕獲模塊創(chuàng)建了一個新的線程,利用pcap_loop函數(shù)循環(huán)讀取數(shù)據(jù)包,直到用戶單擊操作菜單的“停止”子菜單后就會跳出循環(huán),同時調(diào)用pcap_close函數(shù)關(guān)閉捕獲模塊。該模塊在執(zhí)行捕包操作時,網(wǎng)卡已經(jīng)綁定了過濾器,因此網(wǎng)卡只會捕獲符合條件的數(shù)據(jù)包。
數(shù)據(jù)處理模塊用于處理捕獲到的數(shù)據(jù)包。該模塊首先通過使用new 語句動態(tài)分配內(nèi)存空間用來存放捕獲數(shù)據(jù)頭部和數(shù)據(jù)信息,再通過自定義數(shù)組結(jié)構(gòu)將以上數(shù)據(jù)添加到數(shù)組結(jié)構(gòu)中以供處理數(shù)據(jù)時使用。
3 基于Winpcap的捕包過程
利用 Winpcap 捕獲、分析網(wǎng)絡(luò)數(shù)據(jù)時,主要是調(diào)用packet.dll和wpcap.dll庫中提供的一些函數(shù)。下面是基于Winpcap 的網(wǎng)絡(luò)數(shù)據(jù)包捕獲流程和對部分Winpcap 庫函數(shù)的介紹。各函數(shù)之間參數(shù)傳遞的具體情況如圖2所示。
3.1 獲取網(wǎng)卡列表
利用Winpcap 捕獲數(shù)據(jù)包時要先獲取本地網(wǎng)卡列表,Winpcap提供pcap_findalldevs和pcap_findalldev_ex函數(shù)實現(xiàn)以上功能,這兩個API 函數(shù)都返回一個pcap_if 結(jié)構(gòu)的列表,列表中含有全面的網(wǎng)卡信息,例如網(wǎng)卡設(shè)備名、網(wǎng)卡型號以及網(wǎng)卡地址。對于這兩個函數(shù),后者是前者的衍生,它不僅可獲取本地網(wǎng)卡列表,還可作用于遠程計算機,但在pcap.h中對它沒有聲明,所以調(diào)用容易出現(xiàn)錯誤,本設(shè)計選用pcap_findalldevs來獲取網(wǎng)卡列表。
3.2 設(shè)置并編譯過濾器
Winpcap提供pcap_compile和pcap_setfilter函數(shù)來實現(xiàn)過濾數(shù)據(jù)的功能,其中pcap_compile的作用是將用戶制定的過濾表達式編譯到過濾程序中,pcap_setfilter的作用是把過濾器綁定到抓包過程中,即為抓包過程設(shè)置過濾器。若不采用過濾機制時,該過程將省略掉,軟件抓取經(jīng)過的所有數(shù)據(jù)包。
3.3 網(wǎng)卡設(shè)置為混雜模式
Winpcap提供pcap_open和pcap_open_live函數(shù)設(shè)置網(wǎng)卡工作模式,函數(shù)返回用于捕獲數(shù)據(jù)包的網(wǎng)卡描述字,對該網(wǎng)卡的任何操作都要基于這個描述字。函數(shù)的promisc參數(shù)是1則表示把網(wǎng)卡設(shè)置設(shè)為混雜模式。本設(shè)計調(diào)用的是pcap_open_live函數(shù)。
3.4 捕獲數(shù)據(jù)包
網(wǎng)卡被打開后,就可以調(diào)用pcap_next、pacp_next_ex或pcap_loop函數(shù)捕獲數(shù)據(jù)包。pcap_next和pacp_next_ex函數(shù)捕獲一個可用數(shù)據(jù)包就返回,pcap_loop函數(shù)可以循環(huán)捕包捕獲多個數(shù)據(jù)包,直到出現(xiàn)錯誤為止。本設(shè)計調(diào)用pcap_loop函數(shù)實現(xiàn)循環(huán)捕包。
3.5 處理數(shù)據(jù)包
Winpcap提供的捕包函數(shù)pcap_loop會在捕獲到數(shù)據(jù)包的同時調(diào)用一個回調(diào)函數(shù)pcap_handle函數(shù)處理數(shù)據(jù)包,但回調(diào)函數(shù)具體內(nèi)容由用戶自己編寫。本設(shè)計在處理數(shù)據(jù)包方面,除了回調(diào)函數(shù)以外還有許多其他函數(shù),具體情況見數(shù)據(jù)包處理模塊的詳細分析部分。
3.6 關(guān)閉捕包系統(tǒng)
Winpcap提供pcap_close函數(shù)來關(guān)閉網(wǎng)卡,結(jié)束循環(huán)捕包過程。
IP網(wǎng)絡(luò)數(shù)據(jù)嗅探器是Win32平臺下的數(shù)據(jù)包捕獲和分析軟件,它的設(shè)計基于Winpcap系統(tǒng),主要算法是調(diào)用MFC工程新建類,類中封裝實現(xiàn)各模塊功能所需的成員變量、成員函數(shù)。軟件性能的優(yōu)點在于利用Winpcap的NPF構(gòu)件直接抓取數(shù)據(jù)鏈路層的數(shù)據(jù)包,通過分析操作可得知該數(shù)據(jù)包在高層所用協(xié)議,再根據(jù)不同的協(xié)議類型對應(yīng)分析協(xié)議各字段內(nèi)容。