劉 曉 靈
(遼寧林業職業技術學院 信息工程系,沈陽 110101)
隨著計算機技術與網絡應用的迅速普及發展,網絡已經逐漸成為人們日常生活中不可或缺的工具。當人們享受著網絡給生活帶來的諸多便利的同時,網絡的安全性和可靠性也日益受到人們的重視。其中,網絡安全性是指網絡上的數據信息不被更改、泄露以及破壞;網絡可靠性是指網絡系統能夠連續可靠地運行,網絡服務不會被事故造成中斷。作為網絡入侵的核心手段和網絡安全維護的基礎技術之一,對網絡數據包進行捕獲、監聽與分析等研究對于保證網絡的安全性和可靠性是具有重要意義的。
以太網(Ethernet)具有共享介質的特征,信息以明文的形式在網絡上傳輸,當網絡適配器設置為監聽模式(混雜模式)時,由于采用以太網廣播信道爭用的方式,使得監聽系統與正常通信的網絡能夠并聯連接,并可以捕獲任何一個在同一沖突域上傳輸的數據包。IEEE802.3標準的以太網采用的是持續CSMA/CO的方式,正是由于以太網采用這種廣播信道爭用的方式,使得各個站點可以獲得其他站點發送的數據。運用這一原理使信息捕獲系統能夠攔截到需要的信息,這是捕獲數據包的物理基礎。
以太網是一種總線型的網絡,從邏輯上來看是由一條總線和多個連接在總線上的站點所組成各個站點采用上面提到的CSMA/CD協議進行信道的爭用和共享。每個站點(這里特指計算機通過的接口卡)由網卡來實現這種功能。網卡主要的工作是完成對于總線當前狀態的探測,確定是否進行數據的傳送,判斷每個物理數據幀目的地是否為本站地址,如果不匹配,則說明不是發送到本站的而將它丟棄;如果是的話,接收該數據幀,進行物理數據幀的CRC校驗,然后將數據幀提交給LLC子層。
網卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發送給自己的幀。如果采用混雜模式,一個站點的網卡將接受同一網絡內所有站點所發送的數據包,這樣就可以到達對于網絡信息監視捕獲的目的。
網卡選擇模塊:初始化機器上所有的網卡,并在軟件界面的網卡選擇列表中列出所檢測到得網卡供用戶選擇。
監聽控制模塊:對流經所選擇網卡的數據包進行監聽控制,其中包括監聽開始和監聽終止,監聽開始則開始捕獲數據包,監聽終止即終止對數據包的捕獲。
IP包捕獲模塊:對流經網卡的數據包中的IP協議數據包進行捕獲。
ARP包捕獲模塊:對流經網卡的數據包中的ARP協議數據包進行捕獲。
ICMP包捕獲模塊:對流經網卡的數據包中的ICMP協議數據包進行捕獲。
其他格式捕獲模塊:根據需求和設計需要額外加入對流經網卡的數據包中的其他協議數據包進行捕獲。
數據包字段分析模塊:對于捕獲到并存入數據庫中的數據包進行各個字段詳細分析并提供顯示結果,并可將分析結果以指定格式的文件形式導出。
數據統計模塊:對網絡數據流量等信息進行統計分析。
該軟件功能總體模塊圖如圖1所示。

網卡選擇功能是讓用戶選擇需要進行數據包捕獲的網卡以便下一步繼續工作。此模塊采用樹控件列舉出了當前機器上被WinPcap驅動所支持的所有網卡,用戶可以選擇其中一個網卡進行即將的數據包捕獲。此處非必須選擇網卡,如果不選擇網卡而點擊取消則直接進入程序主界面,但無法進行數據包捕獲。
網絡數據包的捕獲和分析的功能均在該處予以實現。主要是捕獲IP層中IP,ICMP,ARP,IGMP等協議數據包,并分析各個數據包協議字段的內容然后反饋到程序主界面的相應部分中。
在數據包捕獲過程中,主要是對捕獲到的數據包進行分類個數統計以方便用戶時刻關注到流入數據包的數量。該處的實現主要是通過預先定義的數個全局變量,根據數據包流入的個數施行動態增長計數。
本程序開發充分考慮到程序在使用上的人性化以及界面的美觀效果。采用基于對話框模式開發的MFC程序需要自己手動添加各種工具條、狀態條等等。
主要是考慮到抓包器使用過程中難免要常用到一些其他程序軟件作為輔助,如用記事本記錄一些信息,打開任務管理器查看一下系統進程等等。為了方便用戶省去數量繁多的鼠標點擊操作,特意在菜單項中添加一個“快捷方式”子菜單項供用戶自定義其中的項目來添加個人所需的常用程序鏈接。其作用大體跟操作系統自帶的一個特殊彈出式菜單Quick Lanuch(中文名“快速啟動”)相似。
將捕獲到的數據包信息按照用戶需要保存到數據庫或者指定文件中,用戶選擇數據包條目保存范圍和保存位置。
作為一個程序給人最直觀的印象,其界面的重要性毋庸置疑。本程序開發充分考慮到程序在使用上的人性化以及界面的美觀效果。采用基于對話框模式開發的MFC程序需要自己手動添加各種工具條、狀態條等等,本部分主要說明如何手動添加相關控制條。自定義控制條代碼如下:
CRect rect;
GetClientRect(rect);
int iStatusBarPane;
iStatusBarPane=sizeof(indicators)/sizeof(UINT); //創建工具條并將位圖貼在工具條上
m_MainToolBar.Create(this); //創建工具條對象
m_MainToolBar.LoadToolBar(IDR_TOOLBAR1); //載入工具條資源
CImageList *imageList=new CImageList; //為imageList指針分配內存空間
CBitmap *bitmap=new CBitmap; //為bitmap指針分配內存空間
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; //在對話框底部創建狀態條
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的網絡數據捕獲和分析軟件在實際應用中還有些局限性,但仍然不失作為一種很有代表性的技術,對于今后發展更高層的網絡安全應用提供了前提和基礎,通過研究這方面的課題,可以更深刻地理解網絡各層通訊協議的機理,也加強了網絡編程的技巧。
[1]W.Richard Stevens.TCP/IP詳解 卷一:協議[M].北京:機械工業出版社,2000.
[2]謝希仁.計算機網絡(第四版)[M].北京:電子工業出版社,2003.
[3]朱雁輝.Windows防火墻與網絡封包截獲技術[M].北京:電子工業出版社,2002.
[4]劉文濤.網絡安全開發包詳解[M].北京:電子工業出版社,2005.
[5]鐘曉旭,吳玉.基于WinPcap的網絡數據獲取系統的研究[J].電腦知識與技術,2007,1(4):1094~1095,1106.