武焱 袁焊忠 席振元
摘 要:在當(dāng)今計算機網(wǎng)絡(luò)無處不在的時代,網(wǎng)絡(luò)攻擊時刻威協(xié)著我們所處局域網(wǎng)絡(luò)的安全。為了確保網(wǎng)絡(luò)的安全性,就要對網(wǎng)絡(luò)交互的數(shù)據(jù)包進行分析。本文提出了TCP/IP協(xié)議分析器的設(shè)計開發(fā)方案,并通過Qt Creator和C++編程實現(xiàn)。該分析器能夠捕獲網(wǎng)絡(luò)數(shù)據(jù)包,并根據(jù)網(wǎng)絡(luò)協(xié)議格式對數(shù)據(jù)進行解析,從而為進一步分析網(wǎng)絡(luò)系統(tǒng)的安全性提供依據(jù)。
關(guān)鍵詞:網(wǎng)絡(luò)數(shù)據(jù)包;TCP/IP協(xié)議;數(shù)據(jù)分析
1 系統(tǒng)需求分析
本系統(tǒng)主要功能需求有以下幾項:
①具備網(wǎng)絡(luò)數(shù)據(jù)包捕獲的參數(shù)設(shè)置: 在進行數(shù)據(jù)捕獲之前要進行協(xié)議類型、MAC地址、IP地址等參數(shù)的設(shè)置,滿足用戶的一些常規(guī)需求,保證用戶使用系統(tǒng)的合理性。
②能夠捕獲到本機所有的網(wǎng)絡(luò)數(shù)據(jù)包:通過本系統(tǒng)可以對網(wǎng)絡(luò)上的數(shù)據(jù)包進行捕獲,包括ICMP、DNS、ARP、RARP等一些網(wǎng)絡(luò)協(xié)議的數(shù)據(jù)包的捕獲,讓用戶通過本系統(tǒng)能夠捕獲到有用的數(shù)據(jù)包。
③能正確地對捕獲到的網(wǎng)絡(luò)數(shù)據(jù)包進行網(wǎng)絡(luò)協(xié)議分析:在捕獲到網(wǎng)絡(luò)數(shù)據(jù)包后能夠?qū)W(wǎng)絡(luò)數(shù)據(jù)包進行包結(jié)構(gòu)分析,對數(shù)據(jù)鏈路層數(shù)據(jù)按照幀格式進行分析,對網(wǎng)絡(luò)層的IP數(shù)據(jù)報的分析,對傳輸層TCP和UDP的頭格式進行分析,對應(yīng)用層協(xié)議進行分析。
④能夠把捕獲到的網(wǎng)絡(luò)數(shù)據(jù)包保存到當(dāng)?shù)匚募校涸谟脩舻氖褂眠^程中,可能需要對捕獲到的網(wǎng)絡(luò)數(shù)據(jù)包進行存儲,那么需要滿足用戶對網(wǎng)絡(luò)數(shù)據(jù)包的存儲功能,讓用戶能夠更靈活地使用本系統(tǒng)。
⑤能夠打開已經(jīng)捕獲到的網(wǎng)絡(luò)數(shù)據(jù)文件并進行網(wǎng)絡(luò)協(xié)議分析:能夠滿足用戶打開已經(jīng)保存的網(wǎng)絡(luò)數(shù)據(jù)文件,并進行網(wǎng)絡(luò)協(xié)議分析,這樣用戶就能隨時隨地對以前的網(wǎng)絡(luò)數(shù)據(jù)進行協(xié)議分析了。
⑥能統(tǒng)計當(dāng)前所有網(wǎng)絡(luò)接口的網(wǎng)絡(luò)數(shù)據(jù)包:通過這個功能,用戶可以查看當(dāng)前網(wǎng)絡(luò)接口的數(shù)據(jù)包數(shù)量和每秒通過的數(shù)據(jù)量,用戶可以清晰地掌握當(dāng)前網(wǎng)絡(luò)接口通過數(shù)據(jù)包的狀況,有助于用戶對網(wǎng)絡(luò)接口的檢測。
2 總體設(shè)計
2.1系統(tǒng)總體模塊設(shè)計
通過系統(tǒng)需求分析可以將網(wǎng)絡(luò)協(xié)議分析器分為四大主要功能模塊,分別為文件存儲與讀取模塊、抓包參數(shù)設(shè)置模塊、數(shù)據(jù)包捕獲模塊和數(shù)據(jù)包分析模塊。這些模塊詳細功能如下:
①文件存儲與讀取模塊:通過捕獲網(wǎng)絡(luò)數(shù)據(jù)包,把其存儲到文件中,有利于以后對網(wǎng)絡(luò)數(shù)據(jù)包的分析;讀取已經(jīng)捕獲到并存儲到文件中的數(shù)據(jù)包,并進行協(xié)議分析。
②抓包參數(shù)設(shè)置模塊:通過配置抓包參數(shù),來確定捕獲數(shù)據(jù)包的類型,可以指定捕獲網(wǎng)絡(luò)數(shù)據(jù)包的MAC地址和網(wǎng)絡(luò)地址,并能夠?qū)W(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)數(shù)據(jù)包大小進行設(shè)置。
③數(shù)據(jù)包捕獲模塊:通過配置的抓包參數(shù)進行數(shù)據(jù)包的捕獲,在程序運行的過程中,會將捕獲到的數(shù)據(jù)包以鏈表的形式存儲起來,以供下一步的分析。
④數(shù)據(jù)包分析模塊:根據(jù)捕獲到的數(shù)據(jù)包進行各層協(xié)議分析,將分析的結(jié)果以可視化的界面形式展示給用戶,讓用戶能夠看清每層協(xié)議的格式和數(shù)據(jù)包數(shù)據(jù)部分內(nèi)容。
系統(tǒng)功能模塊圖如圖1所示:
2.2 軟件開發(fā)平臺
本系統(tǒng)開發(fā)平臺是一般的PC機,使用Windows 8版本。因為本系統(tǒng)沒有涉及到數(shù)據(jù)庫所以就沒有使用數(shù)據(jù)庫。程序開發(fā)使用的編程環(huán)境是Qt 5.4.1中文版,并且opensource使用的版本是Qt Creator 3.3.1。用到的數(shù)據(jù)包捕獲函數(shù)庫為WinPcap,這個函數(shù)庫主要運行在操作系統(tǒng)的底層,所以使用這個函數(shù)庫會大大提升本系統(tǒng)的運行效率,尤其在大量循環(huán)捕獲網(wǎng)絡(luò)數(shù)據(jù)包的時候,優(yōu)勢就愈發(fā)明顯。編程工具Qt Creator具有很好的跨平臺性能,可以很輕松的把本系統(tǒng)移植到Linux環(huán)境的系統(tǒng)中去。
3 詳細設(shè)計
系統(tǒng)中各個功能模塊的界面是用Qt Designer來設(shè)計的,它提供可視化的界面操作,通過拖動控件來實現(xiàn)我們想要的界面效果,方便高效。Qt提供的信號與槽的機制對邏輯功能的編程更加方便。根據(jù)模塊所需要實現(xiàn)的功能,編寫代碼,最終實現(xiàn)系統(tǒng)的整體功能。
3.1 協(xié)議頭結(jié)構(gòu)設(shè)計
通過對協(xié)議頭結(jié)構(gòu)體的設(shè)計,幫助我們完成網(wǎng)絡(luò)數(shù)據(jù)包的解析,將定義的結(jié)構(gòu)體與捕獲到的網(wǎng)絡(luò)數(shù)據(jù)包進行匹配,把相應(yīng)的字段進行處理,從而分析出網(wǎng)絡(luò)協(xié)議頭格式,完成對網(wǎng)絡(luò)協(xié)議的分析。
設(shè)計協(xié)議頭結(jié)構(gòu)體的時候需要注意以下一些事項:①明確網(wǎng)絡(luò)數(shù)據(jù)包的結(jié)構(gòu);②清楚網(wǎng)絡(luò)數(shù)據(jù)包捕獲的方法;③明確各層協(xié)議頭數(shù)據(jù)每個字節(jié)或每個字段的含義;④定義對應(yīng)的結(jié)構(gòu)體用來解析網(wǎng)絡(luò)協(xié)議;⑤把分析的結(jié)果以可視化的方式顯示在界面上。
這個環(huán)節(jié)是整個系統(tǒng)中的一個重點,不管哪里出現(xiàn)任何差錯,都將導(dǎo)致最終對網(wǎng)絡(luò)協(xié)議的分析出現(xiàn)錯誤,所以在對網(wǎng)絡(luò)協(xié)議頭結(jié)構(gòu)體設(shè)計的時候要認真細致,確保結(jié)構(gòu)體里面的字段與網(wǎng)絡(luò)協(xié)議的字段能夠一一對應(yīng),保證對網(wǎng)絡(luò)協(xié)議分析的正確性。
通過對TCP/IP網(wǎng)絡(luò)體系各層協(xié)議格式的分析,本系統(tǒng)定義了以下的結(jié)構(gòu)體表:數(shù)據(jù)鏈路層幀首部結(jié)構(gòu)體表(_ETHERNET_HEADER)、ARP首部結(jié)構(gòu)體表(_ARP_HEADER)、IP首部結(jié)構(gòu)體表(_IP_HEADER)、IPv6首部結(jié)構(gòu)體表(_IP6_HEADER)、TCP首部結(jié)構(gòu)體表(_TCP_HEADER)、UDP首部結(jié)構(gòu)體表(_UDP_HEADER)、ICMP首部結(jié)構(gòu)體表(_ICMP_HEADER)。
3.2 算法概要
抓包模塊的程序流程圖如圖2所示。在對抓包參數(shù)設(shè)置完點擊確定的時候,將選擇的每一項按照網(wǎng)絡(luò)數(shù)據(jù)包過濾器過濾規(guī)則進行處理,轉(zhuǎn)化為字符串模式并通過調(diào)用相應(yīng)的接口函數(shù),對過濾條件進行編譯和設(shè)置,完成對抓包參數(shù)的設(shè)計。
當(dāng)捕獲到網(wǎng)絡(luò)數(shù)據(jù)包時,這時可以選擇一個想要分析的數(shù)據(jù)包并對數(shù)據(jù)包進行解析。這里用到數(shù)據(jù)包分析算法,算法中根據(jù)每層協(xié)議的協(xié)議類型對數(shù)據(jù)包進行解析,然后判斷下一層協(xié)議,依次解析,直到最后一層協(xié)議。
在系統(tǒng)使用的過程中,可能需要保存數(shù)據(jù)包,那么這里就會有數(shù)據(jù)包保存的算法。代碼中做這樣的處理:每當(dāng)有數(shù)據(jù)包到來都會把數(shù)據(jù)包追加到指定的文件中,當(dāng)用戶需要保存數(shù)據(jù)包的時候,只需要將數(shù)據(jù)包臨時文件拷貝到指定的目錄即可。
通常會對已經(jīng)保存的數(shù)據(jù)包進行讀操作,這樣我們就會有數(shù)據(jù)包文件的讀取功能。這個功能的算法使用標(biāo)準C語言的二進制讀取文件的方法,將文件一個字符一個字符地讀取出來,并分離每一個數(shù)據(jù)包,并對數(shù)據(jù)包進行相應(yīng)的處理。
4 系統(tǒng)的編碼
4.1 主要函數(shù)
此處列出了主要函數(shù),具體程序代碼省略。
①捕獲網(wǎng)絡(luò)數(shù)據(jù)包函數(shù)
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
函數(shù)返回值:成功返回0,失敗返回負數(shù)。
參數(shù)描述:p: Libpcap句柄,cnt: 指定捕獲的數(shù)據(jù)包個數(shù),-1代表無限個,callback: 回調(diào)函數(shù),可在此函數(shù)中對數(shù)據(jù)包進行處理,user: 表示往回調(diào)函數(shù)傳的參數(shù)。
②打開存儲文件函數(shù)
pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *filename)
函數(shù)返回值:成功返回一個文件句柄,失敗返回NULL。
參數(shù)描述:p: 表示一個Libpcap句柄,filename: 文件名。
函數(shù)功能:打開一個文件,并準備向其寫入網(wǎng)絡(luò)數(shù)據(jù)包。
③IP協(xié)議分析函數(shù)
void ethernet_protocol_IPpacket (LinkList p)
函數(shù)返回值:無返回值。
參數(shù)描述:p: LinkList類型的鏈表節(jié)點指針。
④TCP協(xié)議分析
void ethernet_protocol_TCPpacket (LinkList p, bool isIP6)
函數(shù)返回值:無返回值。
參數(shù)描述:p: LinkList類型的鏈表節(jié)點指針,isIP6: 是否為IPv6數(shù)據(jù)包。
4.2 數(shù)據(jù)包結(jié)構(gòu)分析結(jié)果顯示
在數(shù)據(jù)包成功捕獲后,選擇要解析的數(shù)據(jù)包進行數(shù)據(jù)包的解析,數(shù)據(jù)包協(xié)議分析界面如圖3所示。在主窗口的右上方有一個表格,里面顯示捕獲到的每一個數(shù)據(jù)包的基本信息,如果要對其中的一個數(shù)據(jù)包進行協(xié)議分析,那么需要點擊要分析的那個數(shù)據(jù)包,協(xié)議分析的結(jié)果會在左側(cè)的樹形列表中顯示出來,下面窗口中則顯示數(shù)據(jù)包的原始數(shù)據(jù)和數(shù)據(jù)包數(shù)據(jù)。
5 結(jié)束語
本系統(tǒng)實現(xiàn)了對網(wǎng)絡(luò)數(shù)據(jù)抓包以及對數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層等各層協(xié)議分析。在對網(wǎng)絡(luò)數(shù)據(jù)捕獲中,主要用到了操作系統(tǒng)底層的WinPcap函數(shù)庫,在大量捕獲網(wǎng)絡(luò)數(shù)據(jù)包時系統(tǒng)運行效率高;使用的編程工具是能夠跨平臺的Qt Creator,具有良好的可移植性和跨平臺性。應(yīng)用該系統(tǒng)能夠捕獲到網(wǎng)絡(luò)上交互的全部數(shù)據(jù)包,并把數(shù)據(jù)包的內(nèi)容顯示給用戶,把每層協(xié)議的協(xié)議頭按照協(xié)議格式解析,讓用戶更清楚地知道當(dāng)前網(wǎng)絡(luò)的網(wǎng)絡(luò)數(shù)據(jù)交互狀態(tài),進一步分析網(wǎng)絡(luò)系統(tǒng)的安全性。
參考文獻:
[1]劉文濤編著.網(wǎng)絡(luò)安全開發(fā)包詳解[M].電子工業(yè)出版社,2005.10:20-30.
[2]嚴蔚敏,吳偉民編著.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].清華大學(xué)出版社,1997.4:55-60.
[3]殷人昆,鄭人杰,馬素霞等編著.實用軟件工程[M].第三版.清華大學(xué)出版社,2011年.
[4]明日科技編著.Visual C++從入門到精通[M].第三版.清華大學(xué)出版社,2012年9月:3-31.
[5]Bruce Eckel,Chuck Allison編著.C++編程思想[M].劉宗田,袁兆山等譯.機械工業(yè)出版社,2011年7月:52-70.
[6]陸文周編著.QT5開發(fā)及實例[M].電子工業(yè)出版社,2014年1月:11-89.
[7]布蘭切特,薩默菲爾德編著.C++GUI Qt4編程[M].第二版,閆鋒欣等譯.電子工業(yè)出版社,2013年5月:21-33.
[8]Brian W.Kernighan,Dennis M.Ritchie編著.C程序設(shè)計語言[M].第二版.機械工業(yè)出版社,2004年1月:30-60.
[9]W.Richard Stevens編著.TCP_IP協(xié)議詳解:卷一[M].機械工業(yè)出版社,2005年7月:37-45.
[10]Gary R. Wright,W. Richard Stevens編著.TCP_IP協(xié)議詳解:卷二[M].機械工業(yè)出版社,2001年12月:28-67.
基金項目:
國家級大學(xué)生創(chuàng)新訓(xùn)練項目(201335)。