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