




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析一、WinPcap介紹WinPcap簡(jiǎn)介WinPcap是一個(gè)在Windows操作系統(tǒng)下的免費(fèi)、公開(kāi)的用于直接訪問(wèn)網(wǎng)絡(luò)的開(kāi)發(fā)工具包〔編程API〕。大多數(shù)Windows網(wǎng)絡(luò)應(yīng)用程序都是通過(guò)WinsockAPI〔Windows套接口〕這類(lèi)高級(jí)編程接口訪問(wèn)網(wǎng)絡(luò)的。這種方法允許在網(wǎng)絡(luò)上進(jìn)行簡(jiǎn)單的數(shù)據(jù)傳送,因?yàn)椴僮飨到y(tǒng)的TCP/IP協(xié)議棧實(shí)現(xiàn)軟件會(huì)處理底層細(xì)節(jié)〔協(xié)議操作、流程重組等等〕,并提供一個(gè)類(lèi)似于讀寫(xiě)文件的函數(shù)接口。然而,有時(shí)候“簡(jiǎn)便方法〞并不能滿足實(shí)際需要。有些程序希望繞過(guò)TCP/IP協(xié)議棧,直接處理底層網(wǎng)絡(luò)中的通信數(shù)據(jù),它們需要對(duì)網(wǎng)絡(luò)進(jìn)行底層進(jìn)行直接訪問(wèn),即在沒(méi)有類(lèi)似協(xié)議?!睺CP/IP協(xié)議?!车膶?shí)體介入條件下對(duì)網(wǎng)絡(luò)進(jìn)行原始訪問(wèn)?;赪insockAPI編程,應(yīng)用程序是通過(guò)調(diào)用操作系統(tǒng)提供的編程接口訪問(wèn)TCP/IP協(xié)議棧實(shí)現(xiàn)網(wǎng)絡(luò)通信的?;赪inPcap編程,網(wǎng)絡(luò)程序?qū)嶋H上是繞開(kāi)操作系統(tǒng)的TCP/IP協(xié)議棧直接通過(guò)底層網(wǎng)絡(luò)發(fā)送數(shù)據(jù),因此,網(wǎng)絡(luò)程序可以實(shí)現(xiàn)一些更低級(jí)、更靈活的功能。WinPcap的組成與結(jié)構(gòu)如圖1.1,WinPcap由一個(gè)數(shù)據(jù)包監(jiān)聽(tīng)設(shè)備驅(qū)動(dòng)程序〔NPF〕、一個(gè)底層的動(dòng)態(tài)連接庫(kù)〔packet.dll〕和一個(gè)高層的不依賴于操作系統(tǒng)的靜態(tài)庫(kù)〔wpcap.dll〕共三個(gè)局部構(gòu)成。這里,NPF在操作系統(tǒng)的內(nèi)核級(jí),packet.dll、wpcap.dll在用戶級(jí)。圖1.1圖1.1WinPcap的組成和結(jié)構(gòu)應(yīng)用程序wpcap.dllpacket.dllNPFDeviceDriver用戶層核心層網(wǎng)絡(luò)層數(shù)據(jù)包技術(shù)實(shí)現(xiàn)上,為了實(shí)現(xiàn)抓包,系統(tǒng)必須繞過(guò)操作系統(tǒng)的協(xié)議棧來(lái)訪問(wèn)在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包〔rawpacket〕。這就要求WinPcap的一局部運(yùn)行在操作系統(tǒng)核心內(nèi)部,直接與網(wǎng)絡(luò)接口驅(qū)動(dòng)交互。由于這個(gè)局部是系統(tǒng)依賴〔systemdependent〕的,在Winpcap的解決方案中它被視為是一個(gè)設(shè)備驅(qū)動(dòng),稱作NPF〔NetgroupPacketFilter〕。2〕底層的動(dòng)態(tài)連接庫(kù)〔packet.dll〕和高層靜態(tài)庫(kù)〔wpcap.dll〕為了方便編程,WinPcap必須提供一個(gè)編程接口〔API〕,這就是WinPcap的底層的動(dòng)態(tài)連接庫(kù)〔packet.dll〕和高層靜態(tài)庫(kù)〔wpcap.dll〕。這里,packet.dll提供了一個(gè)底層API,伴隨著一個(gè)獨(dú)立于Microsoft操作系統(tǒng)的編程接口,這些API可以直接用來(lái)訪問(wèn)驅(qū)動(dòng)的函數(shù);wpcap.dll導(dǎo)出了一組更強(qiáng)大的與libpcap一致的高層抓包函數(shù)庫(kù)〔captureprimitives〕,這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無(wú)關(guān)的方式進(jìn)行。底層動(dòng)態(tài)鏈接庫(kù)運(yùn)行在用戶層,它將應(yīng)用程序和數(shù)據(jù)包監(jiān)聽(tīng)設(shè)備驅(qū)動(dòng)程序隔離開(kāi)來(lái),使得應(yīng)用程序可以不加修改地在不同的WINDOWS系統(tǒng)上運(yùn)行。高級(jí)的靜態(tài)鏈接庫(kù)和應(yīng)用程序編譯在一起,它使用低級(jí)動(dòng)態(tài)鏈接庫(kù)提供的效勞,向應(yīng)用程序提供完善的監(jiān)聽(tīng)接口。WinPcap的根本原理抓包是WinPcap的根本功能,也是NPF最重要的操作。在抓包的時(shí)候,驅(qū)動(dòng)〔例如NICDriver〕使用一個(gè)網(wǎng)絡(luò)接口監(jiān)視著數(shù)據(jù)包,并將這些數(shù)據(jù)包完整無(wú)缺地投遞給用戶級(jí)應(yīng)用程序。如圖1.4,WinPcap的NPF抓包主要依靠?jī)蓚€(gè)組件。1〕數(shù)據(jù)包過(guò)濾器〔filter〕。數(shù)據(jù)包過(guò)濾器決定是否接收進(jìn)來(lái)的數(shù)據(jù)包并把數(shù)據(jù)包拷貝給監(jiān)聽(tīng)程序。數(shù)據(jù)包過(guò)濾器是一個(gè)有布爾輸出的函數(shù)。如果函數(shù)值是true,抓包驅(qū)動(dòng)拷貝數(shù)據(jù)包給應(yīng)用程序;如果是false,數(shù)據(jù)包將被丟棄。NPF數(shù)據(jù)包過(guò)濾器更復(fù)雜一些,因?yàn)樗粌H決定數(shù)據(jù)包是否應(yīng)該被保存,而且還決定要保存的字節(jié)數(shù)。被NPF驅(qū)動(dòng)采用的過(guò)濾系統(tǒng)來(lái)源于BSDPacketFilter〔BPF〕,一個(gè)虛擬處理器可以執(zhí)行偽匯編書(shū)寫(xiě)的用戶級(jí)過(guò)濾程序。應(yīng)用程序采用用戶自定義的過(guò)濾器并使用wpcap.dll將它們編譯進(jìn)BPF程序。然后,應(yīng)用程序使用BIOCSETFIOCTL寫(xiě)入核心態(tài)的過(guò)濾器。這樣,對(duì)于每一個(gè)到來(lái)的數(shù)據(jù)包該程序都將被執(zhí)行,而滿足條件的數(shù)據(jù)包將被接收。與傳統(tǒng)解決方案不同,NPF不解釋〔interpret〕過(guò)濾器,而是執(zhí)行〔execute〕它。由于性能的原因,在使用過(guò)濾器前,NPF提供一個(gè)JIT編譯器將它轉(zhuǎn)化本錢(qián)地的80x86函數(shù)。當(dāng)一個(gè)數(shù)據(jù)包被捕獲,NPF調(diào)用這個(gè)本地函數(shù)而不是調(diào)用過(guò)濾器解釋器,這使得處理過(guò)程相當(dāng)快。2〕循環(huán)緩沖區(qū)〔Buffer〕。NPF的循環(huán)緩沖區(qū)用來(lái)保存數(shù)據(jù)包以免喪失〔如果一個(gè)包符合過(guò)濾器的要求,就被復(fù)制到循環(huán)緩沖區(qū)〕。一個(gè)保存在緩沖區(qū)中的數(shù)據(jù)包有一個(gè)頭,它包含了一些主要的信息,例如時(shí)間戳和數(shù)據(jù)包的大小,注意:它不是協(xié)議頭。另外,循環(huán)緩沖區(qū)以隊(duì)列插入的方式來(lái)保存數(shù)據(jù)包,提高數(shù)據(jù)的存儲(chǔ)效率。程序員可以以組的方式將數(shù)據(jù)包從NPF緩沖區(qū)拷貝到應(yīng)用程序,這樣就提高了性能,因?yàn)樗档土俗x的次數(shù)。如果一個(gè)數(shù)據(jù)包到來(lái)的時(shí)候緩沖區(qū)已經(jīng)滿了,那么該數(shù)據(jù)包將被丟棄,這時(shí)就發(fā)生了丟包現(xiàn)象。3〕NetworkTap是一個(gè)用于探聽(tīng)網(wǎng)絡(luò)中所有數(shù)據(jù)流的函數(shù)。4〕數(shù)據(jù)統(tǒng)計(jì)如圖1.4,為了提高數(shù)據(jù)處理的速度,WinPcap將統(tǒng)計(jì)和監(jiān)聽(tīng)功能移到內(nèi)核中,這樣防止了將任何數(shù)據(jù)都傳遞給用戶。WinPcap通過(guò)使用從NPF中得到的過(guò)濾器來(lái)執(zhí)行一個(gè)內(nèi)核級(jí)的可編統(tǒng)計(jì)模塊,這使其變成一個(gè)強(qiáng)大的分級(jí)引擎,而不只是個(gè)簡(jiǎn)單的包過(guò)濾器。應(yīng)用程序可以構(gòu)造這個(gè)模塊來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)活動(dòng)的任意方面〔例如:網(wǎng)絡(luò)負(fù)荷、兩臺(tái)主機(jī)間的流量、每秒web請(qǐng)求的次數(shù)等等〕,并在預(yù)定的時(shí)間間隔內(nèi)接收內(nèi)核傳來(lái)的數(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的程序直接訪問(wèn)NPF的程序用戶層統(tǒng)計(jì)模式防止了復(fù)制數(shù)據(jù)包并且執(zhí)行0-copy機(jī)制〔當(dāng)包仍存放在NIC〔網(wǎng)絡(luò)接口卡〕驅(qū)動(dòng)的內(nèi)存中時(shí)開(kāi)始進(jìn)行統(tǒng)計(jì),隨后丟棄這個(gè)包〕。而且,環(huán)境轉(zhuǎn)換的次數(shù)可以保持最低,這是因?yàn)榻Y(jié)果通過(guò)一次系統(tǒng)調(diào)用就可以返回給用戶。它不需要緩沖區(qū)〔內(nèi)核或用戶〕,因此當(dāng)監(jiān)聽(tīng)開(kāi)始時(shí)不用為它分配內(nèi)存??梢?jiàn),統(tǒng)計(jì)模式是一種很有效的網(wǎng)絡(luò)監(jiān)聽(tīng)方式,在高速網(wǎng)絡(luò)中利用libpcap來(lái)工作也沒(méi)任何問(wèn)題。WinPcap為程序員提供了一套系統(tǒng)調(diào)用和高層函數(shù)來(lái)進(jìn)行網(wǎng)絡(luò)監(jiān)聽(tīng),這使得已經(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)用程序可以使用原始套接字來(lái)發(fā)送偽造的數(shù)據(jù)包。在Windows環(huán)境下,只有Windows2000提供了原始套接字,而且非常有限。因此在Windows環(huán)境下,WinPcap就成為首選的構(gòu)造數(shù)據(jù)包的函數(shù)庫(kù),它提供了一套標(biāo)準(zhǔn)穩(wěn)定的函數(shù)。另外,NPF增加了一些新的函數(shù),這些函數(shù)可以使數(shù)據(jù)包通過(guò)一次用戶和內(nèi)核模式之間的轉(zhuǎn)換就發(fā)送幾次。數(shù)據(jù)復(fù)制到內(nèi)核中,然后通過(guò)調(diào)用一次NDIS將包發(fā)送到網(wǎng)絡(luò)中。盡管WinPcap提供了一套新的函數(shù)來(lái)開(kāi)發(fā)這些特性,但它沒(méi)有提供那些強(qiáng)大的創(chuàng)立數(shù)據(jù)包的抽象函數(shù),這需要通過(guò)其它現(xiàn)有的工具來(lái)實(shí)現(xiàn)。程序員可以利用著名的LibnetPacketAssemblyLibrary的Windows版本實(shí)現(xiàn),這個(gè)函數(shù)庫(kù)增加了數(shù)據(jù)包結(jié)構(gòu)層并在WinPcap上構(gòu)造數(shù)據(jù)包。二、基于Winpcap的數(shù)據(jù)包捕獲與分析程序開(kāi)發(fā)流程程序分析本課程設(shè)計(jì)采用VC++,基于應(yīng)用程序Winpcap來(lái)實(shí)現(xiàn)數(shù)據(jù)包的捕獲與分析。界面采用MFC實(shí)現(xiàn)一個(gè)單文檔的程序,用戶區(qū)分為左右兩個(gè)視圖,左邊視圖是一個(gè)列表,顯示捕獲數(shù)據(jù)包的簡(jiǎn)要信息,右邊視圖是一個(gè)樹(shù)形圖,顯示選中數(shù)據(jù)包的詳細(xì)信息。由菜單項(xiàng)中的按鈕觸發(fā)操作,同時(shí)改良了程序自帶的保存、另存為等圖標(biāo),成功加上了自己的圖標(biāo),并與按鈕ID相匹配。這個(gè)程序根本實(shí)現(xiàn)了預(yù)期功能,下面是程序開(kāi)發(fā)的過(guò)程。建立工程在VC++6.0下創(chuàng)立一個(gè)單文檔的MFC應(yīng)用程序,工程名:Sniffer,如圖2.1->圖2.2->圖2.3。圖2.1建立工程圖2.2選中單文檔圖2.3自動(dòng)生成的類(lèi)列表到下載.zip,然后解壓,解壓縮就可以看見(jiàn)Include和lib;在"Project->Settings"標(biāo)簽欄中選擇"C/C++",在"Preprocessordefinitions"的輸入框里添加"WPCAP";再選擇"Link",在"Object/librarymodules"的輸入框里添加"wpcap.lib"。然后再設(shè)置VC++環(huán)境變量:選擇Tools->options->Directories的include里面參加下載的winpcap開(kāi)發(fā)包解壓以后的include文件夾。選擇Tools->options->Directories的lib里面參加下載的winpcap開(kāi)發(fā)包解壓以后的lib文件夾。界面設(shè)計(jì)工程建好了,下面進(jìn)行界面的設(shè)計(jì):首先,對(duì)菜單欄進(jìn)行修改,去掉原來(lái)單文檔所自帶的“文件〞、“編輯〞菜單項(xiàng)選擇項(xiàng),保存“查看〞和“幫助〞,新建“文件〞,下面有“開(kāi)始抓包〔ID_FILE_START〕〞、“停止抓包〔ID_FILE_STOP〕〞、“退出〔ID_APP_EXIT〕〞三個(gè)菜單項(xiàng)選擇項(xiàng)。再建“適配器〞菜單,下面有“選擇適配器〔ID_ADP_CHOOSE〕〞選項(xiàng),并對(duì)每個(gè)新建的選項(xiàng)進(jìn)行注釋說(shuō)明。如圖2.4:圖2.4菜單欄然后,翻開(kāi)Sniffer.rc文件,對(duì)工具欄進(jìn)行修改。自做了一個(gè)工具欄圖片Toolbar1.bmp來(lái)代替原來(lái)工程的Toolbar.bmp,然后將多余的復(fù)制粘貼等工具按鈕信息刪除掉,回到界面處,再對(duì)每個(gè)按鈕圖標(biāo)進(jìn)行ID設(shè)置。如圖:,從左向右依次是:開(kāi)始抓包、停止抓包、選擇適配器、幫助圖標(biāo)按鈕。最后,新建一個(gè)選擇適配器的根本對(duì)話框,ID標(biāo)識(shí)為IDD_ADP_DIALOG,雙擊此對(duì)話框新建一個(gè)類(lèi):CAdpterDlg。在此根本對(duì)話框上拖入一個(gè)TreeContrl控件和ListContrl控件,對(duì)控件屬性界面進(jìn)行調(diào)整,翻開(kāi)類(lèi)向?qū)?,將TreeContrl成員變量設(shè)置為:m_treeCtrl,ListContrl成員變量設(shè)置為m_listCtrl。如圖2.5:圖2.5選擇適配器對(duì)話框圖2.6類(lèi)向?qū)гO(shè)置變量代碼編寫(xiě)對(duì)菜單中的按鈕項(xiàng)分別建立類(lèi)向?qū)А⒃黾雍瘮?shù),如“選擇適配器〞的消息映射關(guān)系為ON_COMMAND(ID_ADP_CHOOSE,OnAdpChoose),“開(kāi)始抓包〞的消息映射關(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類(lèi)里面定義或聲明的,CMainFrame作為一個(gè)主控類(lèi),當(dāng)操作時(shí),其調(diào)用其他的對(duì)話框類(lèi)、視圖類(lèi),然后再調(diào)用報(bào)文類(lèi)。網(wǎng)卡的綁定為ID_ADP_CHOOSE選擇適配器建立類(lèi)向?qū)?,新建函?shù):OnAdpChoose(),翻開(kāi)適配器對(duì)話框,并對(duì)網(wǎng)卡鏈表進(jìn)行傳遞。具體代碼如下:voidCMainFrame::OnAdpChoose(){CAdpterDlgadp;//為適配器對(duì)話框初始化值 adp.mainFrm=this; adp.alldevs=this->alldevs; adp.dev=this->dev; if(adp.DoModal()==IDOK){//將適配器信息返回 this->alldevs=adp.alldevs; this->dev=adp.dev; }}適配器對(duì)話框的數(shù)據(jù)初始化:在類(lèi)向?qū)е袨轭?lèi)CAdpterDlg添加WM_INITDIALOG消息,并添加默認(rèn)函數(shù):OnInitDialog,點(diǎn)擊“EditCode〞對(duì)函數(shù)進(jìn)行編輯。Pcap提供cap_findAlldevs()這個(gè)函數(shù)來(lái)實(shí)現(xiàn)些功能,返回一個(gè)pcap_if結(jié)構(gòu)的鏈表,鏈表的每項(xiàng)內(nèi)容都含有全面的網(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è)目的地址列表。為T(mén)reeContrl建立類(lèi)向?qū)?,增加OnClickAdpTree(),實(shí)現(xiàn)雙擊網(wǎng)卡,在ListContrl中顯示網(wǎng)卡具體信息,要注意的是顯示網(wǎng)卡詳細(xì)信息時(shí),調(diào)用DeleteAllItems()刪除原來(lái)內(nèi)容。捕獲包并顯示數(shù)據(jù)包的簡(jiǎn)要信息=1\*GB3①規(guī)劃捕獲包和分析數(shù)據(jù)包的界面,我準(zhǔn)備將視圖分為左右兩局部,左邊為一個(gè)ListView,右邊為一個(gè)TreeView。所以新建兩個(gè)類(lèi)CapPackView(繼承CListView)、ProTreeView〔繼承CTreeView〕。CapPackView負(fù)責(zé)顯示所有抓到的包的簡(jiǎn)要信息,ProTreeView負(fù)責(zé)顯示選中的包的具體信息。=2\*GB3②在主窗口按下開(kāi)始抓包按鈕時(shí),啟動(dòng)捕獲包線程ReceivePacket,調(diào)用pcap_open_live(dev->name,65536,1,1000,errbuf))翻開(kāi)網(wǎng)卡,在這里第三個(gè)參數(shù)設(shè)置為1代表將適配器設(shè)置為混雜模式,捕獲所有流經(jīng)此適配器的數(shù)據(jù)包。網(wǎng)卡一旦翻開(kāi),就可以調(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處理收到的包。在這里,使用的是自定義消息來(lái)實(shí)現(xiàn)的,即首先自定義消息#defineWM_MESSAGE_PACKET_RECEIVEWM_USER+1,類(lèi)CCapPackView頭文件中聲明消息的數(shù)據(jù)包處理函數(shù):afx_msgvoidOnPacketReceive(conststructpcap_pkthdr*pkt_header,constu_char*pkt_data)。=3\*GB3③CapPackView收到消息,調(diào)用OnPacketReceive〔〕將將所捕獲包的內(nèi)容復(fù)制下來(lái),并保存到CArray數(shù)組中,然后對(duì)包的類(lèi)型進(jìn)行判斷,當(dāng)為IP數(shù)據(jù)包時(shí),調(diào)用類(lèi)IPGram中的函數(shù)GetSrcAddr()〔獲取IP數(shù)據(jù)包的源IP地址〕,GetDestAddr()〔獲取IP數(shù)據(jù)包的目的IP地址〕,ip.GetService()〔得到IP數(shù)據(jù)包的協(xié)議類(lèi)型〕,將這些信息及數(shù)據(jù)包的長(zhǎng)度等顯示到界面。類(lèi)似的,如果數(shù)據(jù)包為ARP或RARP類(lèi)型,那么相應(yīng)的調(diào)用類(lèi)ARPGram、RARPGram中的GetSrcPrtAddr()、GetDestPrtAddr(),GetSrcPrtAddr()、GetDestPrtAddr()等函數(shù),并將信息逐行顯示于界面。選中CapPackView中的某條信息,將數(shù)據(jù)包的具體信息顯示于ProTreeView中。=1\*GB3①定義響應(yīng)操作的消息#defineWM_MESSAGE_PACKET_SELECTWM_USER+2,在類(lèi)CProTreeView頭文件中聲明消息的處理函數(shù):afx_msgvoidOnPacketSelect(conststructpcap_pkthdr*pkt_header,constu_char*pkt_data);在類(lèi)CCpPackView中,調(diào)用PostMessage〔〕通知ProTreeView刷新為新選中的報(bào)文內(nèi)容。=2\*GB3②類(lèi)CProTreeView接收到消息后,調(diào)用OnPacketSelect(),對(duì)數(shù)據(jù)包進(jìn)行分析,首先解析以太幀,調(diào)用類(lèi)EtherHead中的函數(shù)GetMacDestAddr()〔獲取目的MAC地址〕、GetMacSrcAddr()〔獲取源MAC地址〕。然后根據(jù)數(shù)據(jù)包類(lèi)型的不同,調(diào)用IP數(shù)據(jù)包、ARP數(shù)據(jù)包、RARP數(shù)據(jù)包處理類(lèi)IPGram、ARPGram、RARPGram中的函數(shù),逐行插入數(shù)據(jù)包的具體信息。需要停止抓包時(shí),點(diǎn)擊菜單項(xiàng)或圖標(biāo)按鈕停止抓包。只需要添加消息處理函數(shù)OnFileStop(),設(shè)置一下開(kāi)始抓包或停止抓包狀態(tài)。完善程序。對(duì)一些可能出現(xiàn)的情況進(jìn)行錯(cuò)誤處理,如選擇網(wǎng)卡時(shí),抓包是時(shí)按鈕狀態(tài)是否禁用等等。到此,根本上完成了程序所需要的所有功能。三、主要建立的類(lèi)及調(diào)用流程本程序中,主要有四種類(lèi)型的類(lèi),主控類(lèi):CMainFrame,視圖類(lèi):CCapPackView、CProTreeView,對(duì)話框類(lèi):CAdpterDlg以及報(bào)文類(lèi)。圖3.1為整體的類(lèi)之間的調(diào)用流程圖。圖3.1總體類(lèi)調(diào)用流程圖CMainFrame類(lèi)CMainFrame,是用于主控的類(lèi),它起到分區(qū)、處理消息、傳遞消息的功能。將用戶區(qū)分為兩個(gè)視圖,點(diǎn)擊菜單里的按鈕,觸發(fā)翻開(kāi)適配器對(duì)話框或者開(kāi)始抓包、停止抓包的動(dòng)作。表3.1CMainFrame類(lèi)說(shuō)明CMainFrame類(lèi)父類(lèi)CFrameWnd類(lèi)成員函數(shù)參數(shù)功能OnCreateClient()LPCREATESTRUCTlpcs,CCreateContext*pContext將用戶區(qū)分為左右兩個(gè)視圖ProTreeView、CapPackViewOnAdpChoose()消息處理函數(shù)無(wú)為適配器對(duì)話框初始化值,即點(diǎn)擊選中適配器按鈕彈出適配器對(duì)話框OnFileStart()消息處理函數(shù)無(wú)設(shè)置抓包狀態(tài),釋放所有包,清空內(nèi)容,啟動(dòng)收包線程,開(kāi)始捕獲包。OnFileStop()消息處理函數(shù)無(wú)停止抓包OnUpdateFileStart()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)在捕獲包時(shí),禁用“抓包〞按鈕OnUpdateFileStop()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)停止捕獲包時(shí),禁用“停止〞按鈕成員變量類(lèi)型含義*PackViewCCapPackView顯示所有抓到的包的簡(jiǎn)要信息*ProTreeViewCProTreeView顯示選中的包的具體信息,用解析樹(shù)表達(dá)*alldevspcap_if_t適配器鏈表*devpcap_if_t適配器鏈表isStartbool是否開(kāi)始抓包isStopbool是否停止抓包圖3.2為CMainFrame類(lèi)中方法調(diào)用流程圖。圖3.2CMainFrame類(lèi)中方法調(diào)用流程圖CAdpterDlg類(lèi)CAdpterDlg:對(duì)話框類(lèi),此對(duì)話框分為兩局部:樹(shù)形控件和list控件。當(dāng)對(duì)話框被觸發(fā)后,樹(shù)形控件顯示了本機(jī)所有的適配器列表,雙擊選中網(wǎng)卡,list控件顯示其名稱、描述、子網(wǎng)掩碼、IP地址等信息。點(diǎn)擊確定按鈕即綁定了此網(wǎng)卡,注意虛擬網(wǎng)卡是不能被綁定的。表3.2為類(lèi)CAdpterDlg的成員函數(shù)及成員變量的說(shuō)明。表3.2CAdpterDlg類(lèi)說(shuō)明CAdpterDlg類(lèi)父類(lèi)CDialog類(lèi)成員函數(shù)參數(shù)功能OnInitDialog()公有無(wú)初始化樹(shù)形控件,設(shè)置list控件,讀取適配器并將適配器列表顯示在樹(shù)形控件中。當(dāng)網(wǎng)卡綁定以后再次翻開(kāi)此對(duì)話框,直接顯示其信息。OnClickAdpTree()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResult當(dāng)雙擊選中網(wǎng)卡時(shí),找到選中的網(wǎng)卡,設(shè)置list控件,并顯示網(wǎng)卡名稱、描述等信息。OnOK()消息處理函數(shù)無(wú)對(duì)選中的網(wǎng)卡進(jìn)行判斷,不可以選虛擬網(wǎng)卡也不可不選。OnCancel()消息處理函數(shù)無(wú)關(guān)閉對(duì)話框成員變量類(lèi)型含義*devpcap_if_t適配器鏈表*alldevspcap_if_t適配器鏈表errbuf[PCAP_ERRBUF_SIZE]char存儲(chǔ)錯(cuò)誤信息的字符串CAdpterDlg類(lèi)中函數(shù)調(diào)用流程圖如圖3.3所示。圖3.3CAdpterDlg類(lèi)中函數(shù)調(diào)用流程圖CCapPackView類(lèi)CCapPackView,視圖類(lèi),主要功能是實(shí)現(xiàn)接收從類(lèi)MainFrm傳遞過(guò)來(lái)的消息和報(bào)文,將數(shù)據(jù)包的頭部及數(shù)據(jù)包的數(shù)據(jù)內(nèi)容分別保存在CArray數(shù)組中,然后調(diào)用報(bào)文類(lèi)IPGram、ARPGram、RARPGram中的函數(shù),將數(shù)據(jù)包簡(jiǎn)要信息顯示于界面。表3.3為CCapPackView的成員函數(shù)及成員變量的說(shuō)明。圖3.4為其類(lèi)中方法調(diào)用流程圖。表3.3CCapPackView類(lèi)說(shuō)明CCapPackView類(lèi)父類(lèi)CListView類(lèi)成員函數(shù)參數(shù)功能OnInitialUpdate()公有無(wú)設(shè)置CapPackView視圖的視圖風(fēng)格,設(shè)置其列信息。OnPacketReceive()消息處理函數(shù)pcap_pkthdr*pkt_header,constu_char*pkt_data顯示所有抓到的包的簡(jiǎn)要信息OnItemchanged()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResult當(dāng)點(diǎn)擊列表中某行信息,將向ProTreeView發(fā)送消息,并傳遞報(bào)文信息。成員變量類(lèi)型含義indexint序號(hào)totalmemint收到的報(bào)文占用總字節(jié)數(shù)timeint流逝的秒數(shù)deltaint一秒內(nèi)收到的字節(jié)數(shù)圖3.4CCapPackView類(lèi)中函數(shù)調(diào)用流程圖CProTreeView類(lèi)CProTreeView,視圖類(lèi),主要功能是接收來(lái)自于CapPackView的消息,調(diào)用消息處理函數(shù)OnPacketSelect(),在顯示數(shù)據(jù)前清空列表及捕獲的數(shù)據(jù)包。對(duì)傳遞過(guò)來(lái)的報(bào)文頭部和內(nèi)容進(jìn)行分析,調(diào)用報(bào)文類(lèi)IPGram、ARPGram、RARPGram中的函數(shù)將具體信息顯示于樹(shù)形列表中。表3.4為CProTreeView的成員函數(shù)及成員變量的說(shuō)明。表3.4CProTreeView類(lèi)說(shuō)明CProTreeView類(lèi)父類(lèi)CTreeView類(lèi)成員函數(shù)參數(shù)功能OnInitialUpdate()無(wú)設(shè)置ProTreeView視圖的視圖風(fēng)格,解析樹(shù)。OnPacketSelect()消息處理函數(shù)pcap_pkthdr*pkt_header,constu_char*pkt_data〔報(bào)文頭部和內(nèi)容指針〕以樹(shù)形結(jié)構(gòu)顯示選中的包的具體信息。OnClick()NMHDR*pNMHDR,LRESULT*pResult無(wú)成員變量類(lèi)型含義*ipIPGram指向IP報(bào)文的指針*etherEtherHead指向以太幀的指針*arpint指向ARP報(bào)文的指針*rarpint指向RARP報(bào)文的指針報(bào)文類(lèi)IPGram:IP報(bào)文classIPGram {int version; //IP版本intIHL; //IP報(bào)文頭長(zhǎng),包含多少個(gè)32位intservicetype; //效勞類(lèi)型intprecedence; //優(yōu)先級(jí)booldelay; //延遲boolthroughtput; //吞吐量boolreliability; //可靠性u(píng)nsignedinttotallen; //IP報(bào)文總長(zhǎng)boolDF; //是否分段,為1表示沒(méi)有分段boolMF; //是否有進(jìn)一步分段,為1表示有intfragoffset; //偏移量intTTL; //生命期timetoliveintprotocol; /協(xié)議:TCP,UDP,ICMPunsignedintchecksum; //校驗(yàn)和longsrcaddr; //源IP地址longdestaddr; //目的IP地址intdatalen; //數(shù)據(jù)長(zhǎng)度unsignedchar*data; //數(shù)據(jù)內(nèi)容IPGram();//構(gòu)造函數(shù)IPGram(constunsignedchar*buf,intbuflen);//重構(gòu)函數(shù)virtual~IPGram();//析構(gòu)函數(shù)CStringGetService();//獲取IP數(shù)據(jù)包的協(xié)議類(lèi)型voidGetDestAddr(char*str);//獲取目的IP地址CStringGetDestAddr();//獲取目的IP地址voidGetSrcAddr(char*str);//獲取源IP地址CStringGetSrcAddr();//獲取源IP地址 };ARPGram:ARP報(bào)文RARPGram:RARP報(bào)文classARPGram&classRARPGram{inthdwaddrtype;//硬件地址類(lèi)型intprtaddrtype;//協(xié)議地址類(lèi)型inthdwaddrlen;//硬件地址長(zhǎng)度intprtaddrlen;//協(xié)議地址長(zhǎng)度intoperation;//操作類(lèi)型BYTEsrchdwaddr[6];//源硬件地址intsrcprtaddr;//源協(xié)議地址BYTEdesthdwaddr[6];//目的硬件地址intdestprtaddr;//目的協(xié)議地址ARPGram();//構(gòu)造函數(shù)ARPGram(constunsignedchar*buf,unsignedintbuflen);//重構(gòu)函數(shù)virtual
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同范本價(jià)稅分離
- 鄉(xiāng)村兒童之家合同范本
- 教育教學(xué)改革課題申報(bào)書(shū)
- 合作開(kāi)洗車(chē)店合同范本
- 農(nóng)村購(gòu)買(mǎi)門(mén)面合同范本
- 廠房建筑加固工程合同范本
- 書(shū)法育人課題申報(bào)書(shū)
- 廠房建設(shè)各類(lèi)合同范本
- 中價(jià)出租合同范例
- 雙向投資合同范本
- 2022年鄭州澍青醫(yī)學(xué)高等專(zhuān)科學(xué)校單招職業(yè)適應(yīng)性測(cè)試筆試試題及答案解析
- 2023年江蘇信息職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試筆試題庫(kù)及答案解析
- 四川大學(xué)華西醫(yī)院進(jìn)修申請(qǐng)表
- 硬筆書(shū)法:幼小銜接識(shí)字寫(xiě)字教學(xué)課件
- 林木育種學(xué):第二講 林木選育技術(shù)基礎(chǔ)課件
- 《海底兩萬(wàn)里》課件(完美版)
- 承插型盤(pán)扣式鋼管進(jìn)場(chǎng)驗(yàn)收記錄表
- 新粵教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 地基注漿加固記錄表
- 三防漆外觀檢驗(yàn)重點(diǎn)標(biāo)準(zhǔn)
- 2023對(duì)口高考電子類(lèi)基礎(chǔ)課試題卷含答案
評(píng)論
0/150
提交評(píng)論