劉 曉 靈
(遼寧林業(yè)職業(yè)技術(shù)學(xué)院 信息工程系,沈陽 110101)
隨著計算機技術(shù)與網(wǎng)絡(luò)應(yīng)用的迅速普及發(fā)展,網(wǎng)絡(luò)已經(jīng)逐漸成為人們?nèi)粘I钪胁豢苫蛉钡墓ぞ?。?dāng)人們享受著網(wǎng)絡(luò)給生活帶來的諸多便利的同時,網(wǎng)絡(luò)的安全性和可靠性也日益受到人們的重視。其中,網(wǎng)絡(luò)安全性是指網(wǎng)絡(luò)上的數(shù)據(jù)信息不被更改、泄露以及破壞;網(wǎng)絡(luò)可靠性是指網(wǎng)絡(luò)系統(tǒng)能夠連續(xù)可靠地運行,網(wǎng)絡(luò)服務(wù)不會被事故造成中斷。作為網(wǎng)絡(luò)入侵的核心手段和網(wǎng)絡(luò)安全維護的基礎(chǔ)技術(shù)之一,對網(wǎng)絡(luò)數(shù)據(jù)包進行捕獲、監(jiān)聽與分析等研究對于保證網(wǎng)絡(luò)的安全性和可靠性是具有重要意義的。
以太網(wǎng)(Ethernet)具有共享介質(zhì)的特征,信息以明文的形式在網(wǎng)絡(luò)上傳輸,當(dāng)網(wǎng)絡(luò)適配器設(shè)置為監(jiān)聽模式(混雜模式)時,由于采用以太網(wǎng)廣播信道爭用的方式,使得監(jiān)聽系統(tǒng)與正常通信的網(wǎng)絡(luò)能夠并聯(lián)連接,并可以捕獲任何一個在同一沖突域上傳輸?shù)臄?shù)據(jù)包。IEEE802.3標準的以太網(wǎng)采用的是持續(xù)CSMA/CO的方式,正是由于以太網(wǎng)采用這種廣播信道爭用的方式,使得各個站點可以獲得其他站點發(fā)送的數(shù)據(jù)。運用這一原理使信息捕獲系統(tǒng)能夠攔截到需要的信息,這是捕獲數(shù)據(jù)包的物理基礎(chǔ)。
以太網(wǎng)是一種總線型的網(wǎng)絡(luò),從邏輯上來看是由一條總線和多個連接在總線上的站點所組成各個站點采用上面提到的CSMA/CD協(xié)議進行信道的爭用和共享。每個站點(這里特指計算機通過的接口卡)由網(wǎng)卡來實現(xiàn)這種功能。網(wǎng)卡主要的工作是完成對于總線當(dāng)前狀態(tài)的探測,確定是否進行數(shù)據(jù)的傳送,判斷每個物理數(shù)據(jù)幀目的地是否為本站地址,如果不匹配,則說明不是發(fā)送到本站的而將它丟棄;如果是的話,接收該數(shù)據(jù)幀,進行物理數(shù)據(jù)幀的CRC校驗,然后將數(shù)據(jù)幀提交給LLC子層。
網(wǎng)卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發(fā)送給自己的幀。如果采用混雜模式,一個站點的網(wǎng)卡將接受同一網(wǎng)絡(luò)內(nèi)所有站點所發(fā)送的數(shù)據(jù)包,這樣就可以到達對于網(wǎng)絡(luò)信息監(jiān)視捕獲的目的。
網(wǎng)卡選擇模塊:初始化機器上所有的網(wǎng)卡,并在軟件界面的網(wǎng)卡選擇列表中列出所檢測到得網(wǎng)卡供用戶選擇。
監(jiān)聽控制模塊:對流經(jīng)所選擇網(wǎng)卡的數(shù)據(jù)包進行監(jiān)聽控制,其中包括監(jiān)聽開始和監(jiān)聽終止,監(jiān)聽開始則開始捕獲數(shù)據(jù)包,監(jiān)聽終止即終止對數(shù)據(jù)包的捕獲。
IP包捕獲模塊:對流經(jīng)網(wǎng)卡的數(shù)據(jù)包中的IP協(xié)議數(shù)據(jù)包進行捕獲。
ARP包捕獲模塊:對流經(jīng)網(wǎng)卡的數(shù)據(jù)包中的ARP協(xié)議數(shù)據(jù)包進行捕獲。
ICMP包捕獲模塊:對流經(jīng)網(wǎng)卡的數(shù)據(jù)包中的ICMP協(xié)議數(shù)據(jù)包進行捕獲。
其他格式捕獲模塊:根據(jù)需求和設(shè)計需要額外加入對流經(jīng)網(wǎng)卡的數(shù)據(jù)包中的其他協(xié)議數(shù)據(jù)包進行捕獲。
數(shù)據(jù)包字段分析模塊:對于捕獲到并存入數(shù)據(jù)庫中的數(shù)據(jù)包進行各個字段詳細分析并提供顯示結(jié)果,并可將分析結(jié)果以指定格式的文件形式導(dǎo)出。
數(shù)據(jù)統(tǒng)計模塊:對網(wǎng)絡(luò)數(shù)據(jù)流量等信息進行統(tǒng)計分析。
該軟件功能總體模塊圖如圖1所示。
網(wǎng)卡選擇功能是讓用戶選擇需要進行數(shù)據(jù)包捕獲的網(wǎng)卡以便下一步繼續(xù)工作。此模塊采用樹控件列舉出了當(dāng)前機器上被WinPcap驅(qū)動所支持的所有網(wǎng)卡,用戶可以選擇其中一個網(wǎng)卡進行即將的數(shù)據(jù)包捕獲。此處非必須選擇網(wǎng)卡,如果不選擇網(wǎng)卡而點擊取消則直接進入程序主界面,但無法進行數(shù)據(jù)包捕獲。
網(wǎng)絡(luò)數(shù)據(jù)包的捕獲和分析的功能均在該處予以實現(xiàn)。主要是捕獲IP層中IP,ICMP,ARP,IGMP等協(xié)議數(shù)據(jù)包,并分析各個數(shù)據(jù)包協(xié)議字段的內(nèi)容然后反饋到程序主界面的相應(yīng)部分中。
在數(shù)據(jù)包捕獲過程中,主要是對捕獲到的數(shù)據(jù)包進行分類個數(shù)統(tǒng)計以方便用戶時刻關(guān)注到流入數(shù)據(jù)包的數(shù)量。該處的實現(xiàn)主要是通過預(yù)先定義的數(shù)個全局變量,根據(jù)數(shù)據(jù)包流入的個數(shù)施行動態(tài)增長計數(shù)。
本程序開發(fā)充分考慮到程序在使用上的人性化以及界面的美觀效果。采用基于對話框模式開發(fā)的MFC程序需要自己手動添加各種工具條、狀態(tài)條等等。
主要是考慮到抓包器使用過程中難免要常用到一些其他程序軟件作為輔助,如用記事本記錄一些信息,打開任務(wù)管理器查看一下系統(tǒng)進程等等。為了方便用戶省去數(shù)量繁多的鼠標點擊操作,特意在菜單項中添加一個“快捷方式”子菜單項供用戶自定義其中的項目來添加個人所需的常用程序鏈接。其作用大體跟操作系統(tǒng)自帶的一個特殊彈出式菜單Quick Lanuch(中文名“快速啟動”)相似。
將捕獲到的數(shù)據(jù)包信息按照用戶需要保存到數(shù)據(jù)庫或者指定文件中,用戶選擇數(shù)據(jù)包條目保存范圍和保存位置。
作為一個程序給人最直觀的印象,其界面的重要性毋庸置疑。本程序開發(fā)充分考慮到程序在使用上的人性化以及界面的美觀效果。采用基于對話框模式開發(fā)的MFC程序需要自己手動添加各種工具條、狀態(tài)條等等,本部分主要說明如何手動添加相關(guān)控制條。自定義控制條代碼如下:
CRect rect;
GetClientRect(rect);
int iStatusBarPane;
iStatusBarPane=sizeof(indicators)/sizeof(UINT); //創(chuàng)建工具條并將位圖貼在工具條上
m_MainToolBar.Create(this); //創(chuàng)建工具條對象
m_MainToolBar.LoadToolBar(IDR_TOOLBAR1); //載入工具條資源
CImageList *imageList=new CImageList; //為imageList指針分配內(nèi)存空間
CBitmap *bitmap=new CBitmap; //為bitmap指針分配內(nèi)存空間
bitmap->LoadBitmapW(IDB_BITMAP_TOOLBAR); //載入位圖資源
imageList->Create(32,32,ILC_COLOR32,10,1);
imageList->Add(bitmap,RGB(255,0,255));
m_MainToolBar.SendMessage(TB_SETIMAGELIST,0,(LPARAM)imageList->m_hImageList);
imageList->Detach();
bitmap->Detach();
delete imageList;
delete bitmap; //在對話框底部創(chuàng)建狀態(tài)條
if (m_MainStatusBar.Create(this))
{m_MainStatusBar.SetIndicators(indicators, iStatusBarPane);
m_MainStatusBar.SetPaneInfo(0,m_MainStatusBar.GetItemID(0),SBPS_NORMAL, rect.Width()/iStatusBarPane+300);
m_MainStatusBar.SetPaneInfo(1,m_MainStatusBar.GetItemID(1),SBPS_NORMAL, rect.Width()/iStatusBarPane-300);}
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top - rcClientStart.top);
CRect rcChild;
CWnd* pwndChild=GetWindow(GW_CHILD);
while (pwndChild)
{pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow(); }
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)捕獲和分析軟件在實際應(yīng)用中還有些局限性,但仍然不失作為一種很有代表性的技術(shù),對于今后發(fā)展更高層的網(wǎng)絡(luò)安全應(yīng)用提供了前提和基礎(chǔ),通過研究這方面的課題,可以更深刻地理解網(wǎng)絡(luò)各層通訊協(xié)議的機理,也加強了網(wǎng)絡(luò)編程的技巧。
[1]W.Richard Stevens.TCP/IP詳解 卷一:協(xié)議[M].北京:機械工業(yè)出版社,2000.
[2]謝希仁.計算機網(wǎng)絡(luò)(第四版)[M].北京:電子工業(yè)出版社,2003.
[3]朱雁輝.Windows防火墻與網(wǎng)絡(luò)封包截獲技術(shù)[M].北京:電子工業(yè)出版社,2002.
[4]劉文濤.網(wǎng)絡(luò)安全開發(fā)包詳解[M].北京:電子工業(yè)出版社,2005.
[5]鐘曉旭,吳玉.基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)獲取系統(tǒng)的研究[J].電腦知識與技術(shù),2007,1(4):1094~1095,1106.