基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告_第1頁
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告_第2頁
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告_第3頁
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告_第4頁
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析一、WinPcap介紹WinPcap簡介WinPcap是一個(gè)在Windows操作系統(tǒng)下的免費(fèi)、公開的用于直接訪問網(wǎng)絡(luò)的開發(fā)工具包(編程API)。大多數(shù)Windows網(wǎng)絡(luò)應(yīng)用程序都是通過WinsockAPI(Windows套接口)這類高級編程接口訪問網(wǎng)絡(luò)的。這種方法允許在網(wǎng)絡(luò)上進(jìn)行簡單的數(shù)據(jù)傳送,因?yàn)椴僮飨到y(tǒng)的TCP/IP協(xié)議棧實(shí)現(xiàn)軟件會(huì)處理底層細(xì)節(jié)(協(xié)議操作、流程重組等等),并提供一個(gè)類似于讀寫文件的函數(shù)接口。然而,有時(shí)候“簡便方法”并不能滿足實(shí)際需要。有些程序希望繞過TCP/IP協(xié)議棧,直接處理底層網(wǎng)絡(luò)中的通信數(shù)據(jù),它們需要對網(wǎng)絡(luò)進(jìn)行底層進(jìn)行直接訪問,即在沒有類似協(xié)議棧(TCP/IP協(xié)議棧)的實(shí)體介入條件下對網(wǎng)絡(luò)進(jìn)行原始訪問?;赪insockAPI編程,應(yīng)用程序是通過調(diào)用操作系統(tǒng)提供的編程接口訪問TCP/IP協(xié)議棧實(shí)現(xiàn)網(wǎng)絡(luò)通信的?;赪inPcap編程,網(wǎng)絡(luò)程序?qū)嶋H上是繞開操作系統(tǒng)的TCP/IP協(xié)議棧直接通過底層網(wǎng)絡(luò)發(fā)送數(shù)據(jù),因此,網(wǎng)絡(luò)程序可以實(shí)現(xiàn)一些更低級、更靈活的功能。WinPcap的組成與結(jié)構(gòu)如圖1.1,WinPcap由一個(gè)數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動(dòng)程序(NPF)、一個(gè)底層的動(dòng)態(tài)連接庫(packet.dll)和一個(gè)高層的不依賴于操作系統(tǒng)的靜態(tài)庫(wpcap.dll)共三個(gè)部分構(gòu)成。這里,NPF在操作系統(tǒng)的核級,packet.dll、wpcap.dll在用戶級。圖1.1圖1.1WinPcap的組成和結(jié)構(gòu)應(yīng)用程序wpcap.dllpacket.dllNPFDeviceDriver用戶層核心層網(wǎng)絡(luò)層數(shù)據(jù)包基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第1頁。技術(shù)實(shí)現(xiàn)上,為了實(shí)現(xiàn)抓包,系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包(rawpacket)。這就要求WinPcap的一部分運(yùn)行在操作系統(tǒng)核心部,直接與網(wǎng)絡(luò)接口驅(qū)動(dòng)交互。由于這個(gè)部分是系統(tǒng)依賴(systemdependent)的,在Winpcap的解決方案中它被視為是一個(gè)設(shè)備驅(qū)動(dòng),稱作NPF(NetgroupPacketFilter)。2)底層的動(dòng)態(tài)連接庫(packet.dll)和高層靜態(tài)庫(wpcap.dll)基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第1頁。為了方便編程,WinPcap必須提供一個(gè)編程接口(API),這就是WinPcap的底層的動(dòng)態(tài)連接庫(packet.dll)和高層靜態(tài)庫(wpcap.dll)。這里,packet.dll提供了一個(gè)底層API,伴隨著一個(gè)獨(dú)立于Microsoft操作系統(tǒng)的編程接口,這些API可以直接用來訪問驅(qū)動(dòng)的函數(shù);wpcap.dll導(dǎo)出了一組更強(qiáng)大的與libpcap一致的高層抓包函數(shù)庫(captureprimitives),這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無關(guān)的方式進(jìn)行。底層動(dòng)態(tài)庫運(yùn)行在用戶層,它將應(yīng)用程序和數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動(dòng)程序隔離開來,使得應(yīng)用程序可以不加修改地在不同的WINDOWS系統(tǒng)上運(yùn)行。高級的靜態(tài)庫和應(yīng)用程序編譯在一起,它使用低級動(dòng)態(tài)庫提供的服務(wù),向應(yīng)用程序提供完善的監(jiān)聽接口。WinPcap的基本原理抓包是WinPcap的基本功能,也是NPF最重要的操作。在抓包的時(shí)候,驅(qū)動(dòng)(例如NICDriver)使用一個(gè)網(wǎng)絡(luò)接口監(jiān)視著數(shù)據(jù)包,并將這些數(shù)據(jù)包完整無缺地投遞給用戶級應(yīng)用程序。如圖1.4,WinPcap的NPF抓包主要依靠兩個(gè)組件。1)數(shù)據(jù)包過濾器(filter)。數(shù)據(jù)包過濾器決定是否接收進(jìn)來的數(shù)據(jù)包并把數(shù)據(jù)包拷貝給監(jiān)聽程序。數(shù)據(jù)包過濾器是一個(gè)有布爾輸出的函數(shù)。如果函數(shù)值是true,抓包驅(qū)動(dòng)拷貝數(shù)據(jù)包給應(yīng)用程序;如果是false,數(shù)據(jù)包將被丟棄。NPF數(shù)據(jù)包過濾器更復(fù)雜一些,因?yàn)樗粌H決定數(shù)據(jù)包是否應(yīng)該被保存,而且還決定要保存的字節(jié)數(shù)。被NPF驅(qū)動(dòng)采用的過濾系統(tǒng)來源于BSDPacketFilter(BPF),一個(gè)虛擬處理器可以執(zhí)行偽匯編書寫的用戶級過濾程序。應(yīng)用程序采用用戶自定義的過濾器并使用wpcap.dll將它們編譯進(jìn)BPF程序。然后,應(yīng)用程序使用BIOCSETFIOCTL寫入核心態(tài)的過濾器。這樣,對于每一個(gè)到來的數(shù)據(jù)包該程序都將被執(zhí)行,而滿足條件的數(shù)據(jù)包將被接收。與傳統(tǒng)解決方案不同,NPF不解釋(interpret)過濾器,而是執(zhí)行(execute)它。由于性能的原因,在使用過濾器前,NPF提供一個(gè)JIT編譯器將它轉(zhuǎn)化成本地的80x86函數(shù)。當(dāng)一個(gè)數(shù)據(jù)包被捕獲,NPF調(diào)用這個(gè)本地函數(shù)而不是調(diào)用過濾器解釋器,這使得處理過程相當(dāng)快?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第2頁。2)循環(huán)緩沖區(qū)(Buffer)。NPF的循環(huán)緩沖區(qū)用來保存數(shù)據(jù)包以免丟失(如果一個(gè)包符合過濾器的要求,就被復(fù)制到循環(huán)緩沖區(qū))。一個(gè)保存在緩沖區(qū)中的數(shù)據(jù)包有一個(gè)頭,它包含了一些主要的信息,例如時(shí)間戳和數(shù)據(jù)包的大小,注意:它不是協(xié)議頭。另外,循環(huán)緩沖區(qū)以隊(duì)列插入的方式來保存數(shù)據(jù)包,提高數(shù)據(jù)的存儲(chǔ)效率。程序員可以以組的方式將數(shù)據(jù)包從NPF緩沖區(qū)拷貝到應(yīng)用程序,這樣就提高了性能,因?yàn)樗档土俗x的次數(shù)。如果一個(gè)數(shù)據(jù)包到來的時(shí)候緩沖區(qū)已經(jīng)滿了,那么該數(shù)據(jù)包將被丟棄,這時(shí)就發(fā)生了丟包現(xiàn)象?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第2頁。3)NetworkTap是一個(gè)用于探聽網(wǎng)絡(luò)中所有數(shù)據(jù)流的函數(shù)。4)數(shù)據(jù)統(tǒng)計(jì)如圖1.4,為了提高數(shù)據(jù)處理的速度,WinPcap將統(tǒng)計(jì)和監(jiān)聽功能移到核中,這樣避免了將任何數(shù)據(jù)都傳遞給用戶。WinPcap通過使用從NPF中得到的過濾器來執(zhí)行一個(gè)核級的可編統(tǒng)計(jì)模塊,這使其變成一個(gè)強(qiáng)大的分級引擎,而不只是個(gè)簡單的包過濾器。應(yīng)用程序可以構(gòu)造這個(gè)模塊來監(jiān)聽網(wǎng)絡(luò)活動(dòng)的任意方面(例如:網(wǎng)絡(luò)負(fù)荷、兩臺(tái)主機(jī)間的流量、每秒web請求的次數(shù)等等),并在預(yù)定的時(shí)間間隔接收核傳來的數(shù)據(jù)。圖圖1.4Wincap的內(nèi)部結(jié)構(gòu)和原理基于Winpcap的監(jiān)控程序packet.dllwpcap.dllNICDriver(NDIS3.0或更高)核心層網(wǎng)絡(luò)層數(shù)據(jù)包基于Winpcap的應(yīng)用程序1Filter1Filter2Filter3…Buffer1Buffer2統(tǒng)計(jì)引擎NetworkTapTCP/IP協(xié)議棧其他協(xié)議棧實(shí)現(xiàn)User-Buffer1User-Buffer2基于Winpcap的應(yīng)用程序2NPF調(diào)用packet.dllAPI的程序直接訪問NPF的程序用戶層基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第3頁。統(tǒng)計(jì)模式避免了復(fù)制數(shù)據(jù)包并且執(zhí)行0-copy機(jī)制(當(dāng)包仍存放在NIC(網(wǎng)絡(luò)接口卡)驅(qū)動(dòng)的存中時(shí)開始進(jìn)行統(tǒng)計(jì),隨后丟棄這個(gè)包)。而且,環(huán)境轉(zhuǎn)換的次數(shù)可以保持最低,這是因?yàn)榻Y(jié)果通過一次系統(tǒng)調(diào)用就可以返回給用戶。它不需要緩沖區(qū)(核或用戶),因此當(dāng)監(jiān)聽開始時(shí)不用為它分配存??梢姡y(tǒng)計(jì)模式是一種很有效的網(wǎng)絡(luò)監(jiān)聽方式,在高速網(wǎng)絡(luò)中利用libpcap來工作也沒任何問題?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第3頁。WinPcap為程序員提供了一套系統(tǒng)調(diào)用和高層函數(shù)來進(jìn)行網(wǎng)絡(luò)監(jiān)聽,這使得已經(jīng)知道libpcapAPI的程序員能很容易使用。5)構(gòu)造數(shù)據(jù)包BPF和NPF都提供了構(gòu)造包的函數(shù),使用戶可以將原始數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中。然而,Unix程序員一般不用libpcap提供的這些函數(shù),因?yàn)樵赨nix平臺(tái)上,應(yīng)用程序可以使用原始套接字來發(fā)送偽造的數(shù)據(jù)包。在Windows環(huán)境下,只有Windows2000提供了原始套接字,而且非常有限。因此在Windows環(huán)境下,WinPcap就成為首選的構(gòu)造數(shù)據(jù)包的函數(shù)庫,它提供了一套標(biāo)準(zhǔn)穩(wěn)定的函數(shù)。另外,NPF增加了一些新的函數(shù),這些函數(shù)可以使數(shù)據(jù)包通過一次用戶和核模式之間的轉(zhuǎn)換就發(fā)送幾次。數(shù)據(jù)復(fù)制到核中,然后通過調(diào)用一次NDIS將包發(fā)送到網(wǎng)絡(luò)中。盡管WinPcap提供了一套新的函數(shù)來開發(fā)這些特性,但它沒有提供那些強(qiáng)大的創(chuàng)建數(shù)據(jù)包的抽象函數(shù),這需要通過其它現(xiàn)有的工具來實(shí)現(xiàn)。程序員可以利用著名的LibnetPacketAssemblyLibrary的Windows版本實(shí)現(xiàn),這個(gè)函數(shù)庫增加了數(shù)據(jù)包結(jié)構(gòu)層并在WinPcap上構(gòu)造數(shù)據(jù)包。二、基于Winpcap的數(shù)據(jù)包捕獲與分析程序開發(fā)流程程序分析本課程設(shè)計(jì)采用VC++,基于應(yīng)用程序Winpcap來實(shí)現(xiàn)數(shù)據(jù)包的捕獲與分析。界面采用MFC實(shí)現(xiàn)一個(gè)單文檔的程序,用戶區(qū)分為左右兩個(gè)視圖,左邊視圖是一個(gè)列表,顯示捕獲數(shù)據(jù)包的簡要信息,右邊視圖是一個(gè)樹形圖,顯示選中數(shù)據(jù)包的詳細(xì)信息。由菜單項(xiàng)中的按鈕觸發(fā)操作,同時(shí)改進(jìn)了程序自帶的保存、另存為等圖標(biāo),成功加上了自己的圖標(biāo),并與按鈕ID相匹配。這個(gè)程序基本實(shí)現(xiàn)了預(yù)期功能,下面是程序開發(fā)的過程。建立工程基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第4頁。在VC++6.0下創(chuàng)建一個(gè)單文檔的MFC應(yīng)用程序,工程名:Sniffer,如圖2.1->圖2.2->圖2.3。基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第4頁。圖2.1建立工程圖2.2選中單文檔圖2.3自動(dòng)生成的類列表基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第5頁。到./devel.htm下載WinPcap4.0.2.zip,然后解壓,解壓縮就可以看見Include和lib;在"Project->Settings"標(biāo)簽欄中選擇"C/C++",在"Preprocessordefinitions"的輸入框里添加"WPCAP";再選擇"Link",在"Object/librarymodules"的輸入框里添加"wpcap.lib"。然后再設(shè)置VC++環(huán)境變量:選擇Tools->options->Directories的include里面加入下載的winpcap開發(fā)包解壓以后的include文件夾。選擇Tools->options->Directories的lib里面加入下載的winpcap開發(fā)包解壓以后的lib文件夾?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第5頁。界面設(shè)計(jì)工程建好了,下面進(jìn)行界面的設(shè)計(jì):首先,對菜單欄進(jìn)行修改,去掉原來單文檔所自帶的“文件”、“編輯”菜單選項(xiàng),保留“查看”和“幫助”,新建“文件”,下面有“開始抓包(ID_FILE_START)”、“停止抓包(ID_FILE_STOP)”、“退出(ID_APP_EXIT)”三個(gè)菜單選項(xiàng)。再建“適配器”菜單,下面有“選擇適配器(ID_ADP_CHOOSE)”選項(xiàng),并對每個(gè)新建的選項(xiàng)進(jìn)行注釋說明。如圖2.4:圖2.4菜單欄然后,打開Sniffer.rc文件,對工具欄進(jìn)行修改。自做了一個(gè)工具欄圖片Toolbar1.bmp來代替原來工程的Toolbar.bmp,然后將多余的復(fù)制粘貼等工具按鈕信息刪除掉,回到界面處,再對每個(gè)按鈕圖標(biāo)進(jìn)行ID設(shè)置。如圖:,從左向右依次是:開始抓包、停止抓包、選擇適配器、幫助圖標(biāo)按鈕。最后,新建一個(gè)選擇適配器的基本對話框,ID標(biāo)識(shí)為IDD_ADP_DIALOG,雙擊此對話框新建一個(gè)類:CAdpterDlg。在此基本對話框上拖入一個(gè)TreeContrl控件和ListContrl控件,對控件屬性界面進(jìn)行調(diào)整,打開類向?qū)?,將TreeContrl成員變量設(shè)置為:m_treeCtrl,ListContrl成員變量設(shè)置為m_listCtrl。如圖2.5:基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第6頁。圖2.5選擇適配器對話框基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第6頁。圖2.6類向?qū)гO(shè)置變量代碼編寫對菜單中的按鈕項(xiàng)分別建立類向?qū)А⒃黾雍瘮?shù),如“選擇適配器”的消息映射關(guān)系為ON_COMMAND(ID_ADP_CHOOSE,OnAdpChoose),“開始抓包”的消息映射關(guān)系為ON_COMMAND(ID_FILE_START,OnFileStart);“停止抓包”的消息映射關(guān)系為ON_COMMAND(ID_FILE_STOP,OnFileStop)以及菜單項(xiàng)是否禁用的菜單項(xiàng)的狀態(tài)的響應(yīng)消息映射關(guān)系。這些都是在CMainFrame類里面定義或聲明的,CMainFrame作為一個(gè)主控類,當(dāng)操作時(shí),其調(diào)用其他的對話框類、視圖類,然后再調(diào)用報(bào)文類。網(wǎng)卡的綁定為ID_ADP_CHOOSE選擇適配器建立類向?qū)?,新建函?shù):OnAdpChoose(),打開適配器對話框,并對網(wǎng)卡鏈表進(jìn)行傳遞。具體代碼如下:voidCMainFrame::OnAdpChoose(){CAdpterDlgadp;//為適配器對話框初始化值 adp.mainFrm=this; adp.alldevs=this->alldevs; adp.dev=this->dev; if(adp.DoModal()==IDOK){//將適配器信息返回 this->alldevs=adp.alldevs; this->dev=adp.dev; }}基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第7頁。適配器對話框的數(shù)據(jù)初始化:在類向?qū)е袨轭怌AdpterDlg添加WM_INITDIALOG消息,并添加默認(rèn)函數(shù):OnInitDialog,點(diǎn)擊“EditCode”對函數(shù)進(jìn)行編輯。Pcap提供cap_findAlldevs()這個(gè)函數(shù)來實(shí)現(xiàn)些功能,返回一個(gè)pcap_if結(jié)構(gòu)的鏈表,鏈表的每項(xiàng)容都含有全面的網(wǎng)卡信息,網(wǎng)卡名稱和網(wǎng)卡描述,特別是pcap_findalldevs()這個(gè)函數(shù)返回的每個(gè)pcap_if結(jié)構(gòu)體都同包含一個(gè)pcap_addr結(jié)構(gòu)的列表,它包含:一個(gè)地址列表,一個(gè)掩碼列表,一個(gè)廣播地址列表和一個(gè)目的地址列表?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第7頁。為TreeContrl建立類向?qū)?,增加OnClickAdpTree(),實(shí)現(xiàn)雙擊網(wǎng)卡,在ListContrl中顯示網(wǎng)卡具體信息,要注意的是顯示網(wǎng)卡詳細(xì)信息時(shí),調(diào)用DeleteAllItems()刪除原來容。捕獲包并顯示數(shù)據(jù)包的簡要信息=1\*GB3①規(guī)劃捕獲包和分析數(shù)據(jù)包的界面,我準(zhǔn)備將視圖分為左右兩部分,左邊為一個(gè)ListView,右邊為一個(gè)TreeView。所以新建兩個(gè)類CapPackView(繼承CListView)、ProTreeView(繼承CTreeView)。CapPackView負(fù)責(zé)顯示所有抓到的包的簡要信息,ProTreeView負(fù)責(zé)顯示選中的包的具體信息。=2\*GB3②在主窗口按下開始抓包按鈕時(shí),啟動(dòng)捕獲包線程ReceivePacket,調(diào)用pcap_open_live(dev->name,65536,1,1000,errbuf))打開網(wǎng)卡,在這里第三個(gè)參數(shù)設(shè)置為1代表將適配器設(shè)置為混雜模式,捕獲所有流經(jīng)此適配器的數(shù)據(jù)包。網(wǎng)卡一旦打開,就可以調(diào)用pcap_loop()進(jìn)行數(shù)據(jù)的捕獲。每次捕獲到數(shù)據(jù)包時(shí),libpcap都會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)pcap_handle(),在回調(diào)函數(shù)里,PostMessage()向CapPackView發(fā)送消息,通知CapPackView處理收到的包。在這里,使用的是自定義消息來實(shí)現(xiàn)的,即首先自定義消息#defineWM_MESSAGE_PACKET_RECEIVEWM_USER+1,類CCapPackView頭文件中聲明消息的數(shù)據(jù)包處理函數(shù):afx_msgvoidOnPacketReceive(conststructpcap_pkthdr*pkt_header,constu_char*pkt_data)。=3\*GB3③CapPackView收到消息,調(diào)用OnPacketReceive()將將所捕獲包的容復(fù)制下來,并保存到CArray數(shù)組中,然后對包的類型進(jìn)行判斷,當(dāng)為IP數(shù)據(jù)包時(shí),調(diào)用類IPGram中的函數(shù)GetSrcAddr()(獲取IP數(shù)據(jù)包的源IP地址),GetDestAddr()(獲取IP數(shù)據(jù)包的目的IP地址),ip.GetService()(得到IP數(shù)據(jù)包的協(xié)議類型),將這些信息及數(shù)據(jù)包的長度等顯示到界面。類似的,如果數(shù)據(jù)包為ARP或RARP類型,則相應(yīng)的調(diào)用類ARPGram、RARPGram中的GetSrcPrtAddr()、GetDestPrtAddr(),GetSrcPrtAddr()、GetDestPrtAddr()等函數(shù),并將信息逐行顯示于界面。選中CapPackView中的某條信息,將數(shù)據(jù)包的具體信息顯示于ProTreeView中?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第8頁。=1\*GB3①定義響應(yīng)操作的消息#defineWM_MESSAGE_PACKET_SELECTWM_USER+2,在類CProTreeView頭文件中聲明消息的處理函數(shù):afx_msgvoidOnPacketSelect(conststructpcap_pkthdr*pkt_header,constu_char*pkt_data);在類CCpPackView中,調(diào)用PostMessage()通知ProTreeView刷新為新選中的報(bào)文容。基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第8頁。=2\*GB3②類CProTreeView接收到消息后,調(diào)用OnPacketSelect(),對數(shù)據(jù)包進(jìn)行分析,首先解析以太幀,調(diào)用類EtherHead中的函數(shù)GetMacDestAddr()(獲取目的MAC地址)、GetMacSrcAddr()(獲取源MAC地址)。然后根據(jù)數(shù)據(jù)包類型的不同,調(diào)用IP數(shù)據(jù)包、ARP數(shù)據(jù)包、RARP數(shù)據(jù)包處理類IPGram、ARPGram、RARPGram中的函數(shù),逐行插入數(shù)據(jù)包的具體信息。需要停止抓包時(shí),點(diǎn)擊菜單項(xiàng)或圖標(biāo)按鈕停止抓包。只需要添加消息處理函數(shù)OnFileStop(),設(shè)置一下開始抓包或停止抓包狀態(tài)。完善程序。對一些可能出現(xiàn)的情況進(jìn)行錯(cuò)誤處理,如選擇網(wǎng)卡時(shí),抓包是時(shí)按鈕狀態(tài)是否禁用等等。到此,基本上完成了程序所需要的所有功能。三、主要建立的類及調(diào)用流程本程序中,主要有四種類型的類,主控類:CMainFrame,視圖類:CCapPackView、CProTreeView,對話框類:CAdpterDlg以及報(bào)文類。圖3.1為整體的類之間的調(diào)用流程圖?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第9頁?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第9頁。圖3.1總體類調(diào)用流程圖CMainFrame類CMainFrame,是用于主控的類,它起到分區(qū)、處理消息、傳遞消息的功能。將用戶區(qū)分為兩個(gè)視圖,點(diǎn)擊菜單里的按鈕,觸發(fā)打開適配器對話框或者開始抓包、停止抓包的動(dòng)作?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第10頁。表3.1CMainFrame類說明基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第10頁。CMainFrame類父類CFrameWnd類成員函數(shù)參數(shù)功能OnCreateClient()LPCREATESTRUCTlpcs,CCreateContext*pContext將用戶區(qū)分為左右兩個(gè)視圖ProTreeView、CapPackViewOnAdpChoose()消息處理函數(shù)無為適配器對話框初始化值,即點(diǎn)擊選中適配器按鈕彈出適配器對話框OnFileStart()消息處理函數(shù)無設(shè)置抓包狀態(tài),釋放所有包,清空容,啟動(dòng)收包線程,開始捕獲包。OnFileStop()消息處理函數(shù)無停止抓包OnUpdateFileStart()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)在捕獲包時(shí),禁用“抓包”按鈕OnUpdateFileStop()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)停止捕獲包時(shí),禁用“停止”按鈕成員變量類型含義*PackViewCCapPackView顯示所有抓到的包的簡要信息*ProTreeViewCProTreeView顯示選中的包的具體信息,用解析樹表達(dá)*alldevspcap_if_t適配器鏈表*devpcap_if_t適配器鏈表isStartbool是否開始抓包isStopbool是否停止抓包圖3.2為CMainFrame類中方法調(diào)用流程圖。圖3.2CMainFrame類中方法調(diào)用流程圖CAdpterDlg類基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第11頁。CAdpterDlg:對話框類,此對話框分為兩部分:樹形控件和list控件。當(dāng)對話框被觸發(fā)后,樹形控件顯示了本機(jī)所有的適配器列表,雙擊選中網(wǎng)卡,list控件顯示其名稱、描述、子網(wǎng)掩碼、IP地址等信息。點(diǎn)擊確定按鈕即綁定了此網(wǎng)卡,注意虛擬網(wǎng)卡是不能被綁定的。表3.2為類CAdpterDlg基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第11頁。表3.2CAdpterDlg類說明CAdpterDlg類父類CDialog類成員函數(shù)參數(shù)功能OnInitDialog()公有無初始化樹形控件,設(shè)置list控件,讀取適配器并將適配器列表顯示在樹形控件中。當(dāng)網(wǎng)卡綁定以后再次打開此對話框,直接顯示其信息。OnClickAdpTree()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResult當(dāng)雙擊選中網(wǎng)卡時(shí),找到選中的網(wǎng)卡,設(shè)置list控件,并顯示網(wǎng)卡名稱、描述等信息。OnOK()消息處理函數(shù)無對選中的網(wǎng)卡進(jìn)行判斷,不可以選虛擬網(wǎng)卡也不可不選。OnCancel()消息處理函數(shù)無關(guān)閉對話框成員變量類型含義*devpcap_if_t適配器鏈表*alldevspcap_if_t適配器鏈表errbuf[PCAP_ERRBUF_SIZE]char存儲(chǔ)錯(cuò)誤信息的字符串CAdpterDlg類中函數(shù)調(diào)用流程圖如圖3.3所示?;赪inPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第12頁。圖3.3CAdpterDlg類中函數(shù)調(diào)用流程圖基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第12頁。CCapPackView類CCapPackView,視圖類,主要功能是實(shí)現(xiàn)接收從類MainFrm傳遞過來的消息和報(bào)文,將數(shù)據(jù)包的頭部及數(shù)據(jù)包的數(shù)據(jù)容分別保存在CArray數(shù)組中,然后調(diào)用報(bào)文類IPGram、ARPGram、RARPGram中的函數(shù),將數(shù)據(jù)包簡要信息顯示于界面。表3.3為CCapPackView的成員函數(shù)及成員變量的說明。圖3.4為其類中方法調(diào)用流程圖。表3.3CCapPackView類說明CCapPackView類父類CListView類成員函數(shù)參數(shù)功能OnInitialUpdate()公有無設(shè)置CapPackView視圖的視圖風(fēng)格,設(shè)置其列信息。OnPacketReceive()消息處理函數(shù)pcap_pkthdr*pkt_header,constu_char*pkt_data顯示所有抓到的包的簡要信息OnItemchanged()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResult當(dāng)點(diǎn)擊列表中某行信息,將向ProTreeView發(fā)送消息,并傳遞報(bào)文信息。成員變量類型含義indexint序號(hào)totalmemint收到的報(bào)文占用總字節(jié)數(shù)timeint流逝的秒數(shù)deltaint一秒收到的字節(jié)數(shù)基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第13頁。圖3.4CCapPackView類中函數(shù)調(diào)用流程圖基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第13頁。CProTreeView類CProTreeView,視圖類,主要功能是接收來自于CapPackView的消息,調(diào)用消息處理函數(shù)OnPacketSelect(),在顯示數(shù)據(jù)前清空列表及捕獲的數(shù)據(jù)包。對傳遞過來的報(bào)文頭部和容進(jìn)行分析,調(diào)用報(bào)文類IPGram、ARPGram、RARPGram中的函數(shù)將具體信息顯示于樹形列表中。表3.4為CProTreeView的成員函數(shù)及成員變量的說明。表3.4CProTreeView類說明CProTreeView類父類CTreeView類成員函數(shù)參數(shù)功能OnInitialUpdate()無設(shè)置ProTreeView視圖的視圖風(fēng)格,解析樹。OnPacketSelect()消息處理函數(shù)pcap_pkthdr*pkt_header,constu_char*pkt_data(報(bào)文頭部和容指針)以樹形結(jié)構(gòu)顯示選中的包的具體信息。OnClick()NMHDR*pNMHDR,LRESULT*pResult無成員變量類型含義*ipIPGram指向IP報(bào)文的指針*etherEtherHead指向以太幀的指針*arpint指向ARP報(bào)文的指針*rarpint指向RARP報(bào)文的指針報(bào)文類IPGram:IP報(bào)文classIPGram { int version; //IP版本 intIHL; //IP報(bào)文頭長,包含多少個(gè)32位 intservicetype; //服務(wù)類型 intprecedence; //優(yōu)先級 booldelay; //延遲 boolthroughtput; //吞吐量 boolreliability; //可靠性 unsignedinttotallen; //IP報(bào)文總長 boolDF; //是否分段,為1表示沒有分段 boolMF; //是否有進(jìn)一步分段,為1表示有 intfragoffset; //偏移量基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第14頁。 intTTL; //生命期timetolive基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為第14頁。 intprotocol; /協(xié)議:TCP,UDP,ICMP unsignedintchecksum; //校驗(yàn)和 longsrcaddr; //源IP地址 longdestaddr; //目的IP地址 intdatalen; //數(shù)據(jù)長度 unsignedchar*data; //數(shù)據(jù)容IPGram();//構(gòu)造函數(shù) IPGram(constunsignedchar*buf,intbuflen);//重構(gòu)函數(shù) virtual~IPGram();//析構(gòu)函數(shù) CStringGetService();//獲取IP數(shù)據(jù)包的協(xié)議類型 voidGetDestAddr(char*str);//獲取目的IP地址 CStringGetDestAddr();//獲取目的IP地址 voidGetSrcAddr(char*str);//獲取源IP地址 CStringGetSrcAddr();//獲取源IP地址 };ARPGram:ARP報(bào)文RARPGram:RARP報(bào)文 classARPGram&classRARPGram { inthdwaddrtype; //硬件地址類型 intprtaddrtype; //協(xié)議地址類型 inthdwaddrlen; //硬件地址長度 intprtaddrlen; //協(xié)議地址長度 intoperation; //操作類型 BYTEsrchdwaddr[6]; //源硬件地址 intsrcprtaddr; //源協(xié)議地址 BYTEdesthdwaddr[6]; //目的硬件地址 intdestprtaddr; //目的協(xié)議地址ARPGram();//構(gòu)造函數(shù) ARPGram(constunsignedchar*buf,unsignedintbuflen);//重構(gòu)函數(shù) virtual~ARPGram();//析構(gòu)函數(shù) CStringGetSrcHdwAddr();//ARP/RARP包發(fā)送方MAC CStringGetSrcPrtAddr();//ARP/RARP包發(fā)送方IP CStringGetDestHdwAddr();//ARP/RARP包接收方MAC CStringGetDestPrtAddr();//ARP/RARP包接收方IP };EtherHead:以太幀頭部 classEtherHead { intsrcaddr[6]; //源硬件地址 intdestaddr[6]; //目的硬件地址基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析報(bào)告全文共19頁,當(dāng)前為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論