摘要:隨著信息化發(fā)展,網(wǎng)絡安全問題日漸突出,網(wǎng)絡攻擊日益泛濫,所以網(wǎng)絡信息安全就變的非常重要。網(wǎng)絡主機必須有足夠的安全措施,否則網(wǎng)絡的價值就會貶值。該設計就是為了給網(wǎng)絡使用者提供一個有用的網(wǎng)絡數(shù)據(jù)包分析工具,其有四個主要功能:數(shù)據(jù)包的捕獲、數(shù)據(jù)包解析、數(shù)據(jù)包信息分析和數(shù)據(jù)包信息的顯示,實現(xiàn)了基于TCP/IP協(xié)議簇。通過對所在機器的網(wǎng)上設置為混雜模式,探索局域網(wǎng)絡里所有經(jīng)過的數(shù)據(jù)包,并實現(xiàn)了數(shù)據(jù)包捕獲、解析、信息分析、信息顯示,為使用者了解當前的網(wǎng)絡數(shù)據(jù)包狀況提供了很好的參考。
關鍵詞:TCP/IP協(xié)議簇;WinPcap;控件自繪;雙緩沖技術繪圖
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2010)02-311-03
Windows Network Packet Analysis Tool
LIAO Fang
(Fixed Assets Management of Hunan Normal University, Changsha 410081, China)
Abstract: With the development of information industry, the problem of network security becomes more and more serious. The increasing proliferation of network attacks. So the network information security becomes very important. Web hosting must have adequate security measure, otherwise the value of network will depreciate. This system is developed in order to provide a useful Internet users of network packet analysis tool. This system has four main functions: packet capture, packet analysis, packet analysis and display information packets information. Realized based on TCP/IP protocol suite. System based on the Internet where machine Settings for mixed mode, explore the local area network packets, and after all, realized the packet capture, information analysis, information shows that for users understand current network packets provide a good reference.
Key words: TCP/IP protocol suite; control redraw; double-buffering technical drawing
網(wǎng)絡技術的飛速發(fā)展與普及,給我們帶來了巨大的社會和經(jīng)濟效益,同時網(wǎng)絡安全問題變得日益嚴重,計算機網(wǎng)絡的設計、維護難度日益增加,安全問題正威脅著每一個網(wǎng)絡用戶,對網(wǎng)絡安全的研究也越來越重要。因此,人們迫切的需要能夠分析、診斷和測試網(wǎng)絡的工具,以及保護我們的電腦盡可能的減少收到侵害的堡壘——防火墻。對于網(wǎng)絡數(shù)據(jù)包的捕獲現(xiàn)在也有著很多的實現(xiàn)方法,存在著許多開源的sniffer軟件供我們參考,但是其中的某些細節(jié)上還是有一些問題的存在,在效果和效率上都有一些問題,分析上也并不是很方便 [1]。本設計是windows下的網(wǎng)絡數(shù)據(jù)包的捕獲工具的開發(fā)和實現(xiàn),主要的研究方向和側(cè)重點是在于最基本也是最核心的網(wǎng)絡數(shù)據(jù)包的捕獲和分析等功能上。網(wǎng)絡數(shù)據(jù)包的捕獲在于網(wǎng)絡安全領域有著無可代替的重要作用,不論是防火墻技術,網(wǎng)絡監(jiān)聽技術或者是網(wǎng)絡測試都離不開數(shù)據(jù)包的捕獲,這是一切的基礎,其他的功能都要基于這個功能才能實現(xiàn)。
1 主要功能描述[2]
1) 網(wǎng)絡數(shù)據(jù)包存儲:將經(jīng)過分析后的數(shù)據(jù)包以科學合理的方式存儲到內(nèi)存中,這也是本設計中最為復雜的部分,程序在界面層的所有工作都建立在這個基礎之上,它的數(shù)據(jù)結構設計直接影響到程序的穩(wěn)定性、效率。
2) 流量分析:以示波器的形式來顯示數(shù)據(jù)包流量。圖上的一點表示了在相應秒的所有流量,和鼠標單擊或指向時可顯示出流量。這部分主要是利用按鈕的重繪功能來實現(xiàn)。
1.1 網(wǎng)絡數(shù)據(jù)包存儲功能的設計
1.1.1 子模塊的劃分
整個功能模塊分為NetBiosContainer、UdpContainer、TcpContainer、IcmpContainer、IpContainer、ArpContainer、RarpContainer、EthernetContainer八個子模塊,分別負責處理對應協(xié)議的工作,每個功能模塊為一個獨立的類。根據(jù)協(xié)議結構圖所規(guī)定的各協(xié)議關系,規(guī)定了不含有子節(jié)點的協(xié)議才能進行數(shù)據(jù)包信息的存儲。
1.1.2 核心功能代碼分析
核心功能代碼如圖2所示。從代碼m_nReOtherIndex = ++m_nReOtherIndex % m_lsOther.size();可以看出一些內(nèi)存管理方式的端倪,通過數(shù)據(jù)包分析功能分析后的數(shù)據(jù)包,必須調(diào)用CdataFactory 類的PushBack()函數(shù),將數(shù)據(jù)包信息存儲到內(nèi)存,此段代碼功能是將系統(tǒng)識別的IP協(xié)議范圍之外的協(xié)議存儲起來。系統(tǒng)在運行中將所有捕獲到的數(shù)據(jù)包信息存儲到內(nèi)存,但并不存儲原始數(shù)據(jù),所以當運行時間長,網(wǎng)絡流量大時,內(nèi)存的消耗會不斷的增加,而無限制地申請內(nèi)存,最后只會導致一個結果——內(nèi)存資源枯竭,甚至系統(tǒng)崩潰,而成功的系統(tǒng)應該有一套很好的內(nèi)存管理機制,參考了“科來網(wǎng)絡分析系統(tǒng)”,該系統(tǒng)采用了定量的內(nèi)存分配管理方式,即當系統(tǒng)申請的內(nèi)存到了一個指定的上限時,就不再開辟新的內(nèi)存,而是要么丟棄前面舊的數(shù)據(jù)包,要么停止捕獲,要么清除所有內(nèi)存數(shù)據(jù)等方式。本系統(tǒng)采用了丟棄舊的數(shù)據(jù)包方式。
1.2 流量分析功能設計
1.2.1 子模塊劃分
為了達到流量顯示的效果,將該模塊分為流量數(shù)據(jù)存儲和流量數(shù)據(jù)的圖形顯示兩個部分。
1.2.2 圖形顯示功能模塊設計
在VC中不存在這種波形圖顯示的控件[3],但MFC提供了我們實現(xiàn)這種控件的可能,那就是控件的自繪[4],即將一個控件從根本上改變其事件、方法等執(zhí)行操作,以達到我們想要的效果。選擇CButton類作為實現(xiàn)這種效果的基類。這個類實現(xiàn)的最終形式就是最熟悉的按鈕控件,通過自繪就可以將一個按鈕繪制成一個示波器。
實現(xiàn)的第一步就是將這個控件的style屬性修改成用戶自繪,實現(xiàn)代碼如下:
void COscillograph::PreSubclassWindow()
{CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);
…………}
當具有自繪風格的按鈕、組合框、列表框或者菜單的可見部分發(fā)生改變時,就會發(fā)送WM_DRAWITEM消息給自繪控件所在的窗體。
設置控件的自繪風格,就必須重載WM_DRAWITEM消息對應的虛函數(shù),該函數(shù)定義為:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);這是必須做的一步,如果沒有這個函數(shù)的重載,程序執(zhí)行就必然會報錯。其中該函數(shù)的唯一參數(shù)是一個結構體,其定義如下:typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
ULONG_PTR itemData;
}DRAWITEMSTRUCT;
其中需要用到一個成員變量hDC,該變量是一個繪圖句柄,是在繪制網(wǎng)絡線和波形時需要用到的。使用該變量時需要非常注意,繪圖時一般使用CDC,而不是HDC,而我們將該句柄轉(zhuǎn)換成CDC有兩個方法:
方法一:CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
方法二:CDC hDC;hDC.Attach(lpDrawItemStruct->hDC);
兩個方法在一般的情況下均適用,程序不會出現(xiàn)致命錯誤,但是當將該類生成的控件放到程序運行時動態(tài)加載的控件中去時(例如選項卡控件),因為無法獲取到合法的繪圖環(huán)境,導致程序出現(xiàn)錯誤,實驗證明方法二沒有出現(xiàn)錯誤,而方法一卻報出錯誤。值得注意的是,CDC是資源對象,它必須有被釋放的過程,它不會自動釋放,即意味著,如果不釋放它,內(nèi)存就會被無休止地消耗,直至內(nèi)存枯竭,系統(tǒng)崩潰,所以一般調(diào)用hDC.Detach();hDC.DeleteDC();這兩個操作進行手動地資源釋放。
第二步是如何實現(xiàn)圖形的動態(tài)效果。
圖5 網(wǎng)絡數(shù)據(jù)流量波形圖
想要的結果必須是網(wǎng)格線與波形圖同步地以一秒為間隔地從右至左移動,背景為黑色,前景為淺綠色,波形圖為深綠色,且在有流量顯示的地方,鼠標經(jīng)過時有該處代表時間點的流量提示。
參考Windows XP的“任務管理器”的風格,我們將網(wǎng)格繪制成由12(像素)*12(像素)大小的正方形組合而成的圖形,橫軸由下至上繪制,縱軸從左至右繪制。
為了讓人感覺到網(wǎng)格是從右至左移動的,所以每隔一秒所有垂直的線條的位置都必須向左移動一個像素,而每兩根線之間的間隔是12個像素點,所以我們只要解決了左邊第一根線的位置,其后的線條自然都會以12像素的等距變換位置,這樣我們就可以歸結為對一根線的位置操作了,也就是只要對第一根線條在0-11這12個像素之間變換,移動效果就出來了,但是需要注意的是第一次運行時位置為0,第二次繪圖是第一根線的位置應該是多少?絕對不是1,而應該是11,這是一個比較特殊的地方,具體實現(xiàn)位置控件的代碼如下:
void COscillograph::MoveLeft()
{m_now = (m_now == 0 ? 11 : --m_now);}
其中m_now必須初始化為0,該函數(shù)必須在每次繪圖完成之后再調(diào)用,不應在前,否則結果就不是我們預期的了。
在上面我們實現(xiàn)了圖形的繪制,但是這樣遠不夠,因為在程序運行過程中,發(fā)現(xiàn)屏幕會間歇性地閃爍,效果不好,所以為了解決這個問題,就得介紹一下“雙緩沖技術繪圖”[5],對于該技術的專業(yè)解釋是:
雙緩沖即在內(nèi)存中創(chuàng)建一個與屏幕繪圖區(qū)域一致的對象,先將圖形繪制到內(nèi)存中的這個對象上,再一次性將這個對象上的圖形拷貝到屏幕上,這樣能大大加快繪圖的速度。
雙緩沖實現(xiàn)過程如下:1)在內(nèi)存中創(chuàng)建與畫面一致的緩沖區(qū); 2)在緩沖區(qū)畫圖; 3)將緩沖區(qū)位圖拷貝到當前畫布上; 4)釋放內(nèi)存緩沖區(qū)。
1.2.3存儲模塊設計
作為繪圖模塊賴以存在的根本,就是它所顯示的數(shù)據(jù)信息,本模塊就是專門為這個意義提出來的,設計之初就規(guī)定了存儲流量數(shù)據(jù)的數(shù)據(jù)結構必須是循環(huán)隊列,考慮每隔一秒就要存儲一個流量數(shù)據(jù),而時間軸最左邊的一個數(shù)據(jù)必須被拋棄,相應的存儲結點要不要從內(nèi)存中釋放的問題,最后提出一個優(yōu)化方案,即用一個大小與波形顯示控件寬度相同的數(shù)組作為循環(huán)隊列,當數(shù)組填充滿數(shù)據(jù)后,新添加進來的數(shù)據(jù)就填充到被拋棄數(shù)據(jù)的位置。這樣程序運行中不需要另外開辟內(nèi)存空間,也不需要釋放內(nèi)存空間,且訪問速度快,效率高。具體代碼如下:
if (m_DataOffPos == GetLength())
{ m_pData[m_DataStartPos] = dbFlux;
m_DataStartPos = ++m_DataStartPos % GetLength();
}
else
{ m_pData[m_DataOffPos] = dbFlux;
++m_DataOffPos;}
判斷語句用于判斷整個數(shù)組是否填滿,只有填滿了數(shù)據(jù)起始點(m_DataStartPos)才能自增,循環(huán)隊列的作用才發(fā)揮出來,未滿之前,填充的位置都由m_DataOffPos決定。
2 總結
本設計為輕量級計算機網(wǎng)絡數(shù)據(jù)包分析工具,整個軟件主要用于實現(xiàn)對網(wǎng)絡的監(jiān)測,對捕獲數(shù)據(jù)包進行分析和處理,并以清新、友好的用戶界面將網(wǎng)絡數(shù)據(jù)信息呈現(xiàn)給用戶。實現(xiàn)了網(wǎng)絡數(shù)據(jù)包捕獲,網(wǎng)絡數(shù)據(jù)包分析、網(wǎng)絡數(shù)據(jù)包存儲、網(wǎng)絡數(shù)據(jù)包顯示、網(wǎng)絡流量統(tǒng)計及波形顯示。前三部分通過線程方式運行在系統(tǒng)底層,目的是為了減少丟包率,提高系統(tǒng)運行效率和反應速度。本設計的關鍵部分是網(wǎng)絡數(shù)據(jù)包存儲部分,分析后的數(shù)據(jù)包必須以結構體的形式存儲到內(nèi)存中,但系統(tǒng)內(nèi)存是寶貴及有限的資源,而如何管理這些內(nèi)存成為了本設計成敗關鍵。
參考文獻:
[1] 設計PK學習資料網(wǎng).網(wǎng)絡數(shù)據(jù)包捕獲工具的設計與實現(xiàn)[DB/OL].(2009-10-11).http://www.shejipk.cn/www/17/2009-04/2376.html.
[2] 劉文濤.網(wǎng)絡安全開發(fā)包詳解[M].北京:電子工業(yè)出版社,2005.
[3] VC知識庫.樹視控件在多文檔中的使用[DB/OL].(2003-12-23).http://www.vckbase.com/document/viewdoc/?id=953.
[4] VC知識庫.自繪按鈕的實現(xiàn)[DB/OL].(2003-2-25).http://www.vckbase.com/document/viewdoc/?id=55.
[5] 百度百科.雙緩沖技術繪圖[DB/OL].(2007-09-12).http://baike.baidu.com/view/1149326.htm.