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

下載本文檔

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

文檔簡介

1、基于WinPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析一、WinPcap介紹WinPcap簡介WinPcap是一個在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)軟件會處理底層細(xì)節(jié)(協(xié)議操作、流程重組等等)并提供一個類似于讀寫文件的函數(shù)接口。然而,有時候“簡便方法”并不能滿足實(shí)際需要。有些程序希望繞過TCP/IP協(xié)議棧,直接處理底層網(wǎng)絡(luò)中的通信數(shù)據(jù),它們需要對網(wǎng)絡(luò)進(jìn)行底層進(jìn)行直接訪問,即

2、在沒有類似協(xié)議棧(TCP/IP協(xié)議棧)的實(shí)體介入條件下對網(wǎng)絡(luò)進(jìn)行原始訪問。基于WinsockAPI編程,應(yīng)用程序是通過調(diào)用操作系統(tǒng)提供的編程接口訪問TCP/IP協(xié)議棧實(shí)現(xiàn)網(wǎng)絡(luò)通信的。基于WinPcap編程,網(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)如圖,WinPcap由一個數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序(NPF)、一個底層的動態(tài)連接庫()和一個高層的不依賴于操作系統(tǒng)的靜態(tài)庫()共三個部分構(gòu)成。這里,NPF在操作系統(tǒng)的內(nèi)核級,、在用戶級。圖WinPcap的組成和結(jié)構(gòu)1)數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序技術(shù)實(shí)現(xiàn)

3、上,為了實(shí)現(xiàn)抓包,系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包(rawpacket)。這就要求WinPcap的一部分運(yùn)行在操作系統(tǒng)核心內(nèi)部,直接與網(wǎng)絡(luò)接口驅(qū)動交互。由于這個部分是系統(tǒng)依賴(systemdependent)的,在Winpcap的解決方案中它被視為是一個設(shè)備驅(qū)動,稱作NPF(NetgroupPacketFilter)。2)底層的動態(tài)連接庫()和高層靜態(tài)庫()為了方便編程,WinPcap必須提供一個編程接口(API),這就是WinPcap的底層的動態(tài)連接庫()和高層靜態(tài)庫()。這里,提供了一個底層API,伴隨著一個獨(dú)立于Microsoft操作系統(tǒng)的編程接口,這些API可

4、以直接用來訪問驅(qū)動的函數(shù);導(dǎo)出了一組更強(qiáng)大的與libpcap一致的高層抓包函數(shù)庫(captureprimitives),這些函數(shù)使得數(shù)據(jù)包的捕獲以一種與網(wǎng)絡(luò)硬件和操作系統(tǒng)無關(guān)的方式進(jìn)行。底層動態(tài)鏈接庫運(yùn)行在用戶層,它將應(yīng)用程序和數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序隔離開來,使得應(yīng)用程序可以不加修改地在不同的WINDOWS系統(tǒng)上運(yùn)行。高級的靜態(tài)鏈接庫和應(yīng)用程序編譯在一起,它使用低級動態(tài)鏈接庫提供的服務(wù),向應(yīng)用程序提供完善的監(jiān)聽接口。WinPcap的基本原理抓包是WinPcap的基本功能,也是NPF最重要的操作。在抓包的時候,驅(qū)動(例如NICDriver)使用一個網(wǎng)絡(luò)接口監(jiān)視著數(shù)據(jù)包,并將這些數(shù)據(jù)包完整無缺地投

5、遞給用戶級應(yīng)用程序。如圖,WinPcap的NPF抓包主要依靠兩個組件。1)數(shù)據(jù)包過濾器(filter)。數(shù)據(jù)包過濾器決定是否接收進(jìn)來的數(shù)據(jù)包并把數(shù)據(jù)包拷貝給監(jiān)聽程序。數(shù)據(jù)包過濾器是一個有布爾輸出的函數(shù)。如果函數(shù)值是true,抓包驅(qū)動拷貝數(shù)據(jù)包給應(yīng)用程序;如果是false,數(shù)據(jù)包將被丟棄。NPF數(shù)據(jù)包過濾器更復(fù)雜一些,因?yàn)樗粌H決定數(shù)據(jù)包是否應(yīng)該被保存,而且還決定要保存的字節(jié)數(shù)。被NPF驅(qū)動采用的過濾系統(tǒng)來源于BSDPacketFilter(BPF),個虛擬處理器可以執(zhí)行偽匯編書寫的用戶級過濾程序。應(yīng)用程序采用用戶自定義的過濾器并使用將它們編譯進(jìn)BPF程序。然后,應(yīng)用程序使用BIOCSETFIO

6、CTL寫入核心態(tài)的過濾器。這樣,對于每一個到來的數(shù)據(jù)包該程序都將被執(zhí)行,而滿足條件的數(shù)據(jù)包將被接收。與傳統(tǒng)解決方案不同,NPF不解釋(interpret)過濾器,而是執(zhí)行(execute)它。由于性能的原因,在使用過濾器前,NPF提供一個JIT編譯器將它轉(zhuǎn)化成本地的80 x86函數(shù)。當(dāng)一個數(shù)據(jù)包被捕獲,NPF調(diào)用這個本地函數(shù)而不是調(diào)用過濾器解釋器,這使得處理過程相當(dāng)快。2)循環(huán)緩沖區(qū)(Buffer)。NPF的循環(huán)緩沖區(qū)用來保存數(shù)據(jù)包以免丟失(如果一個包符合過濾器的要求,就被復(fù)制到循環(huán)緩沖區(qū))。一個保存在緩沖區(qū)中的數(shù)據(jù)包有一個頭,它包含了一些主要的信息,例如時間戳和數(shù)據(jù)包的大小,注意:它不是協(xié)議

7、頭。另外,循環(huán)緩沖區(qū)以隊(duì)列插入的方式來保存數(shù)據(jù)包,提高數(shù)據(jù)的存儲效率。程序員可以以組的方式將數(shù)據(jù)包從NPF緩沖區(qū)拷貝到應(yīng)用程序,這樣就提高了性能,因?yàn)樗档土俗x的次數(shù)。如果一個數(shù)據(jù)包到來的時候緩沖區(qū)已經(jīng)滿了,那么該數(shù)據(jù)包將被丟棄,這時就發(fā)生了丟包現(xiàn)象。3)NetworkTap是一個用于探聽網(wǎng)絡(luò)中所有數(shù)據(jù)流的函數(shù)。4)數(shù)據(jù)統(tǒng)計如圖,為了提高數(shù)據(jù)處理的速度,WinPcap將統(tǒng)計和監(jiān)聽功能移到內(nèi)核中,這樣避免了將任何數(shù)據(jù)都傳遞給用戶oWinPcap通過使用從NPF中得到的過濾器來執(zhí)行一個內(nèi)核級的可編統(tǒng)計模塊,這使其變成一個強(qiáng)大的分級引擎,而不只是個簡單的包過濾器。應(yīng)用程序可以構(gòu)造這個模塊來監(jiān)聽網(wǎng)絡(luò)活

8、動的任意方面(例如:網(wǎng)絡(luò)負(fù)荷、兩臺主機(jī)間的流量、每秒web請求的次數(shù)等等),并在預(yù)定的時間間隔內(nèi)接收內(nèi)核傳來的數(shù)據(jù)。圖Wincap的內(nèi)部結(jié)構(gòu)和原理統(tǒng)計模式避免了復(fù)制數(shù)據(jù)包并且執(zhí)行0-copy機(jī)制(當(dāng)包仍存放在NIC(網(wǎng)絡(luò)接口卡)驅(qū)動的內(nèi)存中時開始進(jìn)行統(tǒng)計,隨后丟棄這個包)而且,環(huán)境轉(zhuǎn)換的次數(shù)可以保持最低,這是因?yàn)榻Y(jié)果通過一次系統(tǒng)調(diào)用就可以返回給用戶。它不需要緩沖區(qū)(內(nèi)核或用戶),因此當(dāng)監(jiān)聽開始時不用為它分配內(nèi)存。可見,統(tǒng)計模式是一種很有效的網(wǎng)絡(luò)監(jiān)聽方式,在高速網(wǎng)絡(luò)中利用libpcap來工作也沒任何問題。WinPcap為程序員提供了一套系統(tǒng)調(diào)用和高層函數(shù)來進(jìn)行網(wǎng)絡(luò)監(jiān)聽,這使得已經(jīng)知道libpca

9、pAPI的程序員能很容易使用。5)構(gòu)造數(shù)據(jù)包BPF和NPF都提供了構(gòu)造包的函數(shù),使用戶可以將原始數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中。然而,Unix程序員一般不用libpcap提供的這些函數(shù),因?yàn)樵赨nix平臺上,應(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ù)包通過一次用戶和內(nèi)核模式之間的轉(zhuǎn)換就發(fā)送幾次。數(shù)據(jù)復(fù)制到內(nèi)核中,然后通過調(diào)用一次NDIS將包發(fā)送到網(wǎng)絡(luò)中。盡管WinPcap

10、提供了一套新的函數(shù)來開發(fā)這些特性,但它沒有提供那些強(qiáng)大的創(chuàng)建數(shù)據(jù)包的抽象函數(shù),這需要通過其它現(xiàn)有的工具來實(shí)現(xiàn)。程序員可以利用著名的LibnetPacketAssemblyLibrary的Windows版本實(shí)現(xiàn),這個函數(shù)庫增加了數(shù)據(jù)包結(jié)構(gòu)層并在WinPcap上構(gòu)造數(shù)據(jù)包。二、基于Winpcap的數(shù)據(jù)包捕獲與分析程序開發(fā)流程程序分析本課程設(shè)計采用VC+,基于應(yīng)用程序Winpcap來實(shí)現(xiàn)數(shù)據(jù)包的捕獲與分析。界面采用MFC實(shí)現(xiàn)一個單文檔的程序,用戶區(qū)分為左右兩個視圖,左邊視圖是一個列表,顯示捕獲數(shù)據(jù)包的簡要信息,右邊視圖是一個樹形圖,顯示選中數(shù)據(jù)包的詳細(xì)信息。由菜單項(xiàng)中的按鈕觸發(fā)操作,同時改進(jìn)了程序自

11、帶的保存、另存為等圖標(biāo),成功加上了自己的圖標(biāo),并與按鈕ID相匹配。這個程序基本實(shí)現(xiàn)了預(yù)期功能,下面是程序開發(fā)的過程。建立工程在VC+下創(chuàng)建一個單文檔的MFC應(yīng)用程序,工程名:Sniffer,如圖圖圖。圖建立工程圖選中單文檔圖自動生成的類列表到下載WinPcap,然后解壓,解壓縮就可以看見Include和lib;在Project-Settings標(biāo)簽欄中選擇C/C+,在Preprocessordefinitions的輸入框里添加WPCAP;再選擇Link,在Object/librarymodules的輸入框里添加。然后再設(shè)置VC+環(huán)境變量:選擇Tools-options-Directories的

12、include里面加入下載的winpcap開發(fā)包解壓以后的include文件夾。選擇Tools-options-Directories的lib里面加入下載的winpcap開發(fā)包解壓以后的lib文件夾。界面設(shè)計工程建好了,下面進(jìn)行界面的設(shè)計:首先,對菜單欄進(jìn)行修改,去掉原來單文檔所自帶的“文件”、“編輯”菜單選項(xiàng),保留“查看”和“幫助”,新建“文件”,下面有“開始抓包(ID_FILE_START)”、“停止抓包(ID_FILE_STOP)”、“退出(ID_APP_EXIT)”三個菜單選項(xiàng)。再建“適配器”菜單,下面有“選擇適配器(ID_ADP_CH00SE)”選項(xiàng),并對每個新建的選項(xiàng)進(jìn)行注釋說明。

13、如圖:圖菜單欄然后,打開文件,對工具欄進(jìn)行修改。自做了一個工具欄圖片來代替原來工程的,然后將多余的復(fù)制粘貼等工具按鈕信息刪除掉,回到界面處,再對每個按鈕圖標(biāo)進(jìn)行ID設(shè)置。如圖::從左向右依次是:開始抓包、停止抓包、選擇適配器、幫助圖標(biāo)按鈕。最后,新建一個選擇適配器的基本對話框,ID標(biāo)識為IDD_ADP_DIALOG,雙擊此對話框新建一個類:CAdpterDlg。在此基本對話框上拖入一個TreeContrl控件和ListContrl控件,對控件屬性界面進(jìn)行調(diào)整,打開類向?qū)В瑢reeContrl成員變量設(shè)置為:m_treeCtrl,ListContrl成員變量設(shè)置為m_listCtrl。如圖:圖

14、選擇適配器對話框圖類向?qū)гO(shè)置變量代碼編寫1)對菜單中的按鈕項(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作為一個主控類,當(dāng)操作時,其調(diào)用其他的對話框類、視圖類,然后再調(diào)用報文類。網(wǎng)卡的綁

15、定為ID_ADP_CHOOSE選擇適配器建立類向?qū)В陆ê瘮?shù):OnAdpChoose(),打開適配器對話框,并對網(wǎng)卡鏈表進(jìn)行傳遞。具體代碼如下:voidCMainFrame:OnAdpChoose()CAdpterDlgadp;/為適配器對話框初始化值=this;=this-alldevs;=this-dev;if()=IDOK)/將適配器信息返回this-alldevs=;this-dev=;適配器對話框的數(shù)據(jù)初始化:在類向?qū)е袨轭怌AdpterDlg添加WM_INITDIALOG消息,并添加默認(rèn)函數(shù):OnInitDialog,點(diǎn)擊“EditCode”對函數(shù)進(jìn)行編輯。Pcap提供cap_fi

16、ndAlldevs()這個函數(shù)來實(shí)現(xiàn)些功能,返回一個pcap_if結(jié)構(gòu)的鏈表,鏈表的每項(xiàng)內(nèi)容都含有全面的網(wǎng)卡信息,網(wǎng)卡名稱和網(wǎng)卡描述,特別是pcap_findalldevs()這個函數(shù)返回的每個pcap_if結(jié)構(gòu)體都同包含一個pcap_addr結(jié)構(gòu)的列表,它包含:一個地址列表,一個掩碼列表,一個廣播地址列表和一個目的地址列表。為TreeContrl建立類向?qū)В黾覱nClickAdpTree(),實(shí)現(xiàn)雙擊網(wǎng)卡,在ListContrl中顯示網(wǎng)卡具體信息,要注意的是顯示網(wǎng)卡詳細(xì)信息時,調(diào)用DeleteAllItems()刪除原來內(nèi)容。捕獲包并顯示數(shù)據(jù)包的簡要信息規(guī)劃捕獲包和分析數(shù)據(jù)包的界面,我準(zhǔn)備

17、將視圖分為左右兩部分,左邊為一個ListView,右邊為一個TreeView。所以新建兩個類CapPackView(繼承CListView)、ProTreeView(繼承CTreeView)。CapPackView負(fù)責(zé)顯示所有抓到的包的簡要信息,ProTreeView負(fù)責(zé)顯示選中的包的具體信息。在主窗口按下開始抓包按鈕時,啟動捕獲包線程ReceivePacket,調(diào)用pcap_open_live(dev-name,65536,l,1000,errbuf)打開網(wǎng)卡,在這里第三個參數(shù)設(shè)置為1代表將適配器設(shè)置為混雜模式,捕獲所有流經(jīng)此適配器的數(shù)據(jù)包。網(wǎng)卡一旦打開,就可以調(diào)用pcap_loop()進(jìn)行

18、數(shù)據(jù)的捕獲。每次捕獲到數(shù)據(jù)包時,libpcap都會自動調(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)。CapPackView收到消息

19、,調(diào)用OnPacketReceive()將將所捕獲包的內(nèi)容復(fù)制下來,并保存到CArray數(shù)組中,然后對包的類型進(jìn)行判斷,當(dāng)為IP數(shù)據(jù)包時,調(diào)用類IPGram中的函數(shù)GetSrcAddr()(獲取IP數(shù)據(jù)包的源IP地址),GetDestAddr()(獲取IP數(shù)據(jù)包的目的IP地址),()(得到IP數(shù)據(jù)包的協(xié)議類型),將這些信息及數(shù)據(jù)包的長度等顯示到界面。類似的,如果數(shù)據(jù)包為ARP或RARP類型,則相應(yīng)的調(diào)用類ARPGram、RARPGram中的GetSrcPrtAddr()、GetDestPrtAddr(),GetSrcPrtAddr()、GetDestPrtAddr()等函數(shù),并將信息逐行顯示于

20、界面。選中CapPackView中的某條信息,將數(shù)據(jù)包的具體信息顯示于ProTreeView中。定義響應(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刷新為新選中的報文內(nèi)容。類CProTreeView接收到消息后,調(diào)用OnPacketSelect(

21、),對數(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ù)包的具體信息。需要停止抓包時,點(diǎn)擊菜單項(xiàng)或圖標(biāo)按鈕停止抓包。只需要添加消息處理函數(shù)OnFileStop(),設(shè)置一下開始抓包或停止抓包狀態(tài)。完善程序。對一些可能出現(xiàn)的情況進(jìn)行錯誤處理,如選擇網(wǎng)卡時,抓包是時按鈕狀態(tài)是否禁用等等。到此,基本上完成了程序所需要的所有功能。三、主要建

22、立的類及調(diào)用流程本程序中,主要有四種類型的類,主控類:CMainFrame,視圖類:CCapPackView、CProTreeView,對話框類:CAdpterDlg以及報文類。圖為整體的類之間的調(diào)用流程圖。IPGram類:CMainFrame類:CAdpterDlg類:CProTreeViewEtherHeadARPGramRARPGram點(diǎn)擊:文件-開始抓包GetMacDestAddr()包目的MAC地址GetDestAddr()獲取目的IPGetDestAddr()獲取目的IPGetMacSrcAddr()包源MAC地址GetService()獲取協(xié)議類型GetSrcHdwAddr()包

23、發(fā)送方MACGetSrcPrtAddr()包發(fā)送方IPGetDestHdwAddr()包接收方MACGetDestPrtAddr()包接收方IP點(diǎn)擊:適配器-選擇適配器GetType()獲取數(shù)據(jù)包類型OnInitDialog()OnClickAdpTree()選中適配器OnInitialUpdate()界面設(shè)置OnPacketSelect()以樹形結(jié)構(gòu)顯示選中的包的具體信息通知ProTreeView刷新為新選中的報文內(nèi)容OnOK()點(diǎn)擊按鈕,綁定網(wǎng)卡啟動收包線程點(diǎn)擊:退出類:CCapPackViewOnInitialUpdate()界面設(shè)置鐘顯示所有抓到的包存的簡要信息圖總體類調(diào)用流程圖CMa

24、inFrame類CMainFrame,是用于主控的類,它起到分區(qū)、處理消息、傳遞消息的功能。將用戶區(qū)分為兩個視圖,點(diǎn)擊菜單里的按鈕,觸發(fā)打開適配器對話框或者開始抓包、停止抓包的動作。表CMainFrame類說明CMainFrame類父類CFrameWnd類成員函數(shù)參數(shù)功能OnCreateClient()LPCREATESTRUCTlpcs,CCreateContext*pContext將用戶區(qū)分為左右兩個視圖ProTreeView、CapPackViewOnAdpChoose()消息處理函數(shù)無為適配器對話框初始化值,即點(diǎn)擊選中適配器按鈕彈出適配器對話框OnFileStart()消息處理函數(shù)無設(shè)

25、置抓包狀態(tài),釋放所有包,清空內(nèi)容,啟動收包線程,開始捕獲包。OnFileStop()消息處理函數(shù)無停止抓包OnUpdateFileStart()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)在捕獲包時,禁用“抓包”按鈕OnUpdateFileStop()消息處理函數(shù)CCmdUI*pCmdUI當(dāng)停止捕獲包時,禁用“停止”按鈕成員變量類型含義*PackViewCCapPackView顯示所有抓到的包的簡要信息*ProTreeViewCProTreeView顯示選中的包的具體信息,用解析樹表達(dá)*alldevspcapift適配器鏈表*devpcapift適配器鏈表isStartbool是否開始抓包isSt

26、opbool是否停止抓包圖為CMainFrame類中方法調(diào)用流程圖。類:CMainFrame成員變量初始化OnFileStop()停止捕獲包點(diǎn)擊:適配器-選擇適配器調(diào)用Pcap_handle()回調(diào)函數(shù)示、OnAdpChoose()選擇適配器調(diào)用Pcap_loop()捕獲包IOnFileStart()當(dāng)網(wǎng)卡綁定后,啟動抓包線程ReceivePacket:、pcap_open_live()打開網(wǎng)卡y圖CMainFrame類中方法調(diào)用流程圖CAdpterDlg類CAdpterDig:對話框類,此對話框分為兩部分:樹形控件和list控件。當(dāng)對話框被觸發(fā)后,樹形控件顯示了本機(jī)所有的適配器列表,雙擊選中

27、網(wǎng)卡,list控件顯示其名稱、描述、子網(wǎng)掩碼、IP地址等信息。點(diǎn)擊確定按鈕即綁定了此網(wǎng)卡,注意虛擬網(wǎng)卡是不能被綁定的。表為類CAdpterDig的成員函數(shù)及成員變量的說明。表CAdpterDig類說明CAdpterDig類父類CDiaiog類成員函數(shù)參數(shù)功能OnlnitDiaiogO公有無初始化樹形控件,設(shè)置iist控件,讀取適配器并將適配器列表顯示在樹形控件中。當(dāng)網(wǎng)卡綁定以后再次打開此對話框,直接顯示其信息。OnCiickAdpTree()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResuit當(dāng)雙擊選中網(wǎng)卡時,找到選中的網(wǎng)卡,設(shè)置iist控件,并顯示網(wǎng)卡名稱、描述等信息。OnO

28、K()消息處理函數(shù)無對選中的網(wǎng)卡進(jìn)行判斷,不可以選虛擬網(wǎng)卡也不可不選。OnCancei()消息處理函數(shù)無關(guān)閉對話框成員變量類型含義*devpcapift適配器鏈表*alldevspcapift適配器鏈表errbufPCAPERRBUFSIZEchar存儲錯誤信息的字符串CAdpterDlg類中函數(shù)調(diào)用流程圖如圖所示。類:CAdpterDlgalldevs=NULL;dev=NULL;OnAdpChoose()選擇適配器點(diǎn)擊:適配器-選擇適配器OnOK()點(diǎn)擊按鈕,綁定網(wǎng)卡OnInitDialog()對話框設(shè)置,并顯示適配器列表aLldevs=adp.alldevs、dev=adpdev類:CM

29、ainFrameOnChckAdpTree()雙擊適配器,List列表顯示詳細(xì)信息圖CAdpterDlg類中函數(shù)調(diào)用流程圖CCapPackView類CCapPackView,視圖類,主要功能是實(shí)現(xiàn)接收從類MainFrm傳遞過來的消息和報文,將數(shù)據(jù)包的頭部及數(shù)據(jù)包的數(shù)據(jù)內(nèi)容分別保存在CArray數(shù)組中,然后調(diào)用報文類IPGram、ARPGram、RARPGram中的函數(shù),將數(shù)據(jù)包簡要信息顯示于界面。表為CCapPackView的成員函數(shù)及成員變量的說明。圖為其類中方法調(diào)用流程圖。表CCapPackView類說明CCapPackView類父類CListView類成員函數(shù)參數(shù)功能OnlnitialU

30、pdate()公有無設(shè)置CapPackView視圖的視圖風(fēng)格,設(shè)置其列信息。OnPacketReceive()消息處理函數(shù)pcap_pkthdr*pkt_header,constuchar*pktdata顯示所有抓到的包的簡要信息Onltemchanged()消息處理函數(shù)NMHDR*pNMHDR,LRESULT*pResult當(dāng)點(diǎn)擊列表中某行信息,將向ProTreeView發(fā)送消息,并傳遞報文信息。成員變量類型含義indexint序號totalmemint收到的報文占用總字節(jié)數(shù)timeint流逝的秒數(shù)deltaint一秒內(nèi)收到的字節(jié)數(shù)丿(類:CCapPackView圖CCapPackView類

31、中函數(shù)調(diào)用流程圖CProTreeView類CProTreeView,視圖類,主要功能是接收來自于CapPackView的消息,調(diào)用消息處理函數(shù)OnPacketSelect(),在顯示數(shù)據(jù)前清空列表及捕獲的數(shù)據(jù)包。對傳遞過來的報文頭部和內(nèi)容進(jìn)行分析,調(diào)用報文類IPGram、ARPGram、RARPGram中的函數(shù)將具體信息顯示于樹形列表中。表為CProTreeView的成員函數(shù)及成員變量的說明。表CProTreeView類說明CProTreeView類父類CTreeView類成員函數(shù)參數(shù)功能OnlnitialUpdate()無設(shè)置ProTreeView視圖的視圖風(fēng)格,解析樹。OnPacketSe

32、lect()消息處理函數(shù)pcap_pkthdr*pkt_header,constu_char*pkt_data(報文頭部和內(nèi)容指針)以樹形結(jié)構(gòu)顯示選中的包的具體信息。OnClick()NMHDR*pNMHDR,LRESULT*pResult無成員變量類型含義*ipIPGram指向IP報文的指針*etherEtherHead指向以太幀的指針*arpint指向ARP報文的指針*rarpint指向RARP報文的指針報文類IPGram:IP報文classIPGramintversion;/IP版本intIHL;/IP報文頭長,包含多少個32位intservicetype;/服務(wù)類型intprecede

33、nce;/優(yōu)先級booldelay;/延遲boolthroughtput;/吞吐量boolreliability;/可靠性unsignedinttotallen;/IP扌報文總長boolDF;/是否分段,為1表示沒有分段boolMF;/是否有進(jìn)一步分段,為1表示有intfragoffset;/偏移量intTTL;/生命期timetoliveintprotocol;/協(xié)議:TCP,UDP,ICMPunsignedintchecksum;/校驗(yàn)和longsrcaddr;/源IP地址longdestaddr;/目的IP地址intdatalen;/數(shù)據(jù)長度unsignedchar*data;/數(shù)據(jù)內(nèi)容

34、IPGram();/構(gòu)造函數(shù)IPGram(constunsignedchar*buf,intbuflen);/重構(gòu)函數(shù)virtualIPGram();/析構(gòu)函數(shù)CStringGetService。;/獲取IP數(shù)據(jù)包的協(xié)議類型voidGetDestAddr(char*str);/獲取目的IP地址CStringGetDestAddr();/獲取目的IP地址voidGetSrcAddr(char*str);/獲取源IP地址CStringGetSrcAddr();/獲取源IP地址;ARPGram:ARP報文RARPGram:RARP報文classARPGram&classRARPGraminthdwaddrtype;/硬件地址類型intprtaddrtype;/協(xié)議地址類型inthdwaddrlen;/硬件地址長度intprtaddrlen;/協(xié)議地址長度intoperation;/操作類型BYTEsrchdwaddr6;/源硬件地址intsrcprtaddr;/源協(xié)議地址BYTEdesthdwaddr6;/目的硬件地址intdestprtaddr;/目的協(xié)議地址ARP

溫馨提示

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

評論

0/150

提交評論