邢寶玉 呂雪鳴 孫朝宇
【摘要】Linux操作系統(tǒng)使用libnet函數(shù)庫(kù)和Qt函數(shù)庫(kù)設(shè)計(jì)的網(wǎng)絡(luò)協(xié)議數(shù)據(jù)單元發(fā)生器。本項(xiàng)目的意義在于該系統(tǒng)提供了提供協(xié)議驗(yàn)證、協(xié)議分析等功能;為進(jìn)一步學(xué)習(xí)和理解TCP/IP協(xié)議族、模擬攻擊、威脅發(fā)現(xiàn)以及網(wǎng)絡(luò)故障定位等內(nèi)容提供實(shí)踐平臺(tái)。對(duì)非網(wǎng)絡(luò)專(zhuān)業(yè)的學(xué)生驗(yàn)證協(xié)議、對(duì)網(wǎng)絡(luò)工程專(zhuān)業(yè)學(xué)生深入理解協(xié)議、鍛煉協(xié)議分析能力起到重要作用。
【關(guān)鍵詞】libnet網(wǎng)絡(luò)協(xié)議PDU構(gòu)造
一、引言
Libnet是一個(gè)專(zhuān)業(yè)網(wǎng)絡(luò)安全構(gòu)造和發(fā)送數(shù)據(jù)包的一個(gè)高層次的API函數(shù)庫(kù),允許開(kāi)發(fā)者構(gòu)造和發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包。Libnet提供了一個(gè)對(duì)底層網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行構(gòu)造,修改和發(fā)送的高級(jí)接口。它隱藏了很多底層細(xì)節(jié),省去了很多麻煩,如多路技術(shù),緩沖區(qū)管理,網(wǎng)絡(luò)數(shù)據(jù)包頭信息,字節(jié)流順序,操作系統(tǒng)兼容性,以及校驗(yàn)和計(jì)算問(wèn)題等等。
二、設(shè)計(jì)思想
首先創(chuàng)建一個(gè)Libnet句柄,并將句柄初始化,為數(shù)據(jù)包分配存儲(chǔ)空間,確定Libnet的類(lèi)型。確定網(wǎng)絡(luò)接口,可以自己指定也可以Libnet自動(dòng)查詢(xún)搜索(將libnet_init()的參數(shù)device賦值NULL即可)。將校驗(yàn)和的參數(shù)設(shè)置為0,libnet就會(huì)自動(dòng)計(jì)算校驗(yàn)和。獲取libnet初始化后的句柄,構(gòu)造數(shù)據(jù)包,這里使用Qt Creator中的QLineEdit和QComboBox為libnet句柄所代表的數(shù)據(jù)包賦值,使用QPushButton執(zhí)行開(kāi)始發(fā)送和結(jié)束,通過(guò)Libnet定義的句柄返回值來(lái)判斷我們所構(gòu)造的數(shù)據(jù)包是否合法,如果合法就調(diào)用libnet_write()函數(shù)發(fā)送數(shù)據(jù)包。
三、程序流程
3.1構(gòu)造協(xié)議模塊流程
首先通過(guò)初始化函數(shù)libnet_init(),對(duì)內(nèi)存、網(wǎng)絡(luò)進(jìn)行初始化,再通過(guò)不同的libnet_build()函數(shù)構(gòu)造各種協(xié)議的網(wǎng)絡(luò)數(shù)據(jù)包,其中包括libnet_build_arp(),libnet_build_ip()等等。將網(wǎng)絡(luò)數(shù)據(jù)包構(gòu)造好后,通過(guò)libnet_write()函數(shù)將構(gòu)造好的網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行發(fā)送,最后通過(guò)libnet_destroy()函數(shù)關(guān)閉網(wǎng)絡(luò)接口,釋放內(nèi)部?jī)?nèi)存空間,構(gòu)造結(jié)束。
3.2主函數(shù)流程
創(chuàng)建一個(gè)QThread 類(lèi)的子類(lèi)myThread,重載QThread 的run()函數(shù),run()函數(shù)中發(fā)射構(gòu)造相應(yīng)數(shù)據(jù)包的信號(hào)。實(shí)例化一個(gè)線(xiàn)程對(duì)象并調(diào)用QThread::start()函數(shù),開(kāi)始發(fā)送數(shù)據(jù)包,重載的run()函數(shù)將會(huì)在新建的獨(dú)立的線(xiàn)程中執(zhí)行。
選擇想要構(gòu)造的數(shù)據(jù)包,即跳轉(zhuǎn)到各自協(xié)議的數(shù)據(jù)包構(gòu)造函數(shù),檢查構(gòu)造的數(shù)據(jù)包是否合法,如果合法就調(diào)用libnet_write()函數(shù)發(fā)送數(shù)據(jù)包,否則,查看linux終端輸出的錯(cuò)誤信息,然后重新填寫(xiě)數(shù)據(jù)包,繼續(xù)執(zhí)行。
程序界面如圖1所示:
四、結(jié)束語(yǔ)
在實(shí)驗(yàn)室局域網(wǎng)環(huán)境中進(jìn)行測(cè)試并且結(jié)果表明系統(tǒng)能夠構(gòu)造不同協(xié)議數(shù)據(jù)包,可以通過(guò)Wireshark和Tcpdump網(wǎng)絡(luò)數(shù)據(jù)包捕獲工具捕獲成功。
參考文獻(xiàn)
[1]劉文濤. 網(wǎng)絡(luò)安全開(kāi)發(fā)包詳解[M]. 北京:電子工業(yè)出版社,2005.10
[2]黃俊杰,王建新,張靜. 基于Linux的網(wǎng)絡(luò)協(xié)議學(xué)習(xí)系統(tǒng)[J]. 中南大學(xué)碩士學(xué)位論文,2009.11
[3]布蘭切特(Jasmin Blanchette)(作者),薩默菲爾德(Mark Summerfield)(作者),閆鋒欣(譯者),等. C++ GUI Qt 4編程[M]. 第2版. 電子工業(yè)出版社,2013.5