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