winpcap網(wǎng)絡(luò)嗅探器課程設(shè)計報告_第1頁
winpcap網(wǎng)絡(luò)嗅探器課程設(shè)計報告_第2頁
winpcap網(wǎng)絡(luò)嗅探器課程設(shè)計報告_第3頁
winpcap網(wǎng)絡(luò)嗅探器課程設(shè)計報告_第4頁
winpcap網(wǎng)絡(luò)嗅探器課程設(shè)計報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-.z.課程設(shè)計題目:基于WinPcap的網(wǎng)絡(luò)嗅探器設(shè)計與實現(xiàn)專業(yè)班級:網(wǎng)絡(luò)工程完成時間:2015年1月目錄目錄2一引言11.1編寫目的11.2問題背景1二需求分析12.1需求規(guī)定12.1.1用戶需求12.1.2功能需求12.1.3性能需求12.2開發(fā)平臺1三概要設(shè)計13.1TCP/IP協(xié)議族和WinPcap簡介13.1.1TCP協(xié)議族13.1.2WinPcap簡介13.2系統(tǒng)總體分析與設(shè)計1系統(tǒng)總體結(jié)構(gòu)分析與設(shè)計13.2.2系統(tǒng)總體流程1系統(tǒng)數(shù)據(jù)結(jié)構(gòu)分析與設(shè)計1四系統(tǒng)詳細(xì)設(shè)計與實現(xiàn)14.1數(shù)據(jù)捕獲模塊的設(shè)計與實現(xiàn)14.2協(xié)議解析模塊的設(shè)計與實現(xiàn)14.3用戶界面模塊的設(shè)計與實現(xiàn)1控件寫數(shù)據(jù)的基本操作14.3.2根據(jù)不同協(xié)議顯示不同顏色1對數(shù)據(jù)格式化顯示1五結(jié)語1六附錄16.1參考文獻(xiàn)16.2主要函數(shù)代碼1-.z.一引言1.1編寫目的本需求的編寫是為了研究基于WinpCap網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)程序的開發(fā)途徑和應(yīng)用方法。同時它也是進(jìn)行項目策劃、概要設(shè)計和詳細(xì)設(shè)計的基礎(chǔ),是維護(hù)人員進(jìn)行部維護(hù),信息更新,驗收和測試的依據(jù),是用戶操作說明的指導(dǎo)文檔,是開發(fā)人員和用戶交互的良好界面。1.2問題背景隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,加速了全球信息化的進(jìn)程,各種重要數(shù)據(jù)在網(wǎng)上的傳播日益普遍,使得網(wǎng)絡(luò)安全問題越來越為人們所關(guān)注。網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具作為一種網(wǎng)絡(luò)數(shù)據(jù)監(jiān)聽程序,在網(wǎng)絡(luò)安全攻防方面扮演了很重要的角色,目前已經(jīng)有不少網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具,譬如在Windows環(huán)境下,最富盛名的工具是Net*ray、WireShark(原Ethereal)。網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具實際上是一把雙刃劍,通過使用網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具,可以把網(wǎng)卡設(shè)置于混雜模式,并可實現(xiàn)對網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包的捕獲與分析,此分析結(jié)果可供網(wǎng)絡(luò)安全分析之用,也可為黑客發(fā)動進(jìn)一步的攻擊提供有價值的信息。而在網(wǎng)絡(luò)安全方面,目前使用最廣泛的TCP/IP協(xié)議存在許多安全缺陷,網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具可以有效地探測在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包信息,通過對這些信息的分析是有助于網(wǎng)絡(luò)安全維護(hù)的。根據(jù)《網(wǎng)絡(luò)安全技術(shù)發(fā)展分析》一文中的數(shù)據(jù),2007年以來網(wǎng)絡(luò)監(jiān)聽技術(shù)出現(xiàn)了新額重要特征,傳統(tǒng)的Sniffer技術(shù)是被動地監(jiān)聽網(wǎng)絡(luò)通信、用戶名和口令,而新的Sniffer技術(shù)則主動地控制通信數(shù)據(jù)。我們通過對網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具的數(shù)據(jù)包的捕獲與分析功能的進(jìn)一步了解,才能做到知己知彼,有針對性地獲取所需要的信息,利用這些信息進(jìn)行網(wǎng)絡(luò)安全分析的網(wǎng)絡(luò)威脅應(yīng)對。因此對網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)技術(shù)的研究具有重要的意義。計算機(jī)網(wǎng)絡(luò)的設(shè)計為嗅探器的使用創(chuàng)造了最基本的條件。在目前的網(wǎng)絡(luò)環(huán)境中,所有計算機(jī)節(jié)點都是共享傳輸介質(zhì),任意節(jié)點發(fā)出或發(fā)往任意節(jié)點的數(shù)據(jù)幀必將經(jīng)過網(wǎng)每一個節(jié)點的網(wǎng)絡(luò)接口,此時只需對嗅探節(jié)點的網(wǎng)絡(luò)接口(網(wǎng)卡)進(jìn)行適當(dāng)?shù)脑O(shè)置便可為實現(xiàn)嗅探的做好準(zhǔn)備工作。在計算機(jī)網(wǎng)絡(luò)系統(tǒng)中,網(wǎng)卡是用來接收網(wǎng)絡(luò)上其他節(jié)點發(fā)來的數(shù)據(jù)幀,其嵌的單片處理程序會檢測數(shù)據(jù)幀來源的MAC地址,并根據(jù)網(wǎng)卡所設(shè)置的接收方式來是否接收處理數(shù)據(jù),如果認(rèn)為應(yīng)該處理,則網(wǎng)卡就會產(chǎn)生中斷信號通知中央處理器,接收該數(shù)據(jù)幀并傳輸給操作系統(tǒng)處理。否則就簡單丟棄,所對應(yīng)節(jié)點的網(wǎng)卡就截斷,計算機(jī)的中央處理器并不參與。網(wǎng)卡是網(wǎng)絡(luò)中節(jié)點主機(jī)的關(guān)鍵硬件設(shè)備。對數(shù)據(jù)的接收一般有四種設(shè)置模式:廣播模式:接收在網(wǎng)絡(luò)中進(jìn)行廣播數(shù)據(jù)信息。組播模式:接收組播數(shù)據(jù)信息。單播模式:只有匹配的目的網(wǎng)卡才能接收數(shù)據(jù)信息?;祀s模式:網(wǎng)卡能夠可以接收一切通過它的數(shù)據(jù)信息。二需求分析2.1需求規(guī)定2.1.1用戶需求網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)是一種利用計算機(jī)的網(wǎng)絡(luò)接口截獲其它計算機(jī)數(shù)據(jù)報文的工具。使用網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具的主要人群是黑客或網(wǎng)絡(luò)安全技術(shù)人員,從攻擊的角度,黑客可以使用網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)程序非法獲取網(wǎng)絡(luò)中傳輸?shù)拇罅棵舾行畔?,如賬號和口令等,對網(wǎng)路安全極具威脅;從防守的角度,網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)技術(shù)是居于網(wǎng)絡(luò)的入侵檢測系統(tǒng)的最底層環(huán)節(jié),是整個系統(tǒng)的數(shù)據(jù)來源,為技術(shù)人員提供重要的依據(jù)。無論是黑客還是安全人員,他們對抓包技術(shù)的利用途徑都是一樣的,即對網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包進(jìn)行捕獲與分析,獲取不要的信息,但是他們的目的是不一樣的,前者是專門利用計算機(jī)網(wǎng)絡(luò)搞破壞或惡作劇,而后者是通過對這些信息的分析利用。維護(hù)網(wǎng)絡(luò)安全與穩(wěn)定。因此用戶提出了以下要求:(1)能夠捕獲網(wǎng)絡(luò)數(shù)據(jù)包,并能對數(shù)據(jù)包進(jìn)行簡單的分析。(2)精確的設(shè)置捕捉規(guī)則和靈活的過濾策略,能使用戶方便、準(zhǔn)確地捕獲所需要的信息。(3)界面友好,操作簡單。2.1.2功能需求盡管網(wǎng)絡(luò)嗅探(網(wǎng)絡(luò)抓包)工具作為網(wǎng)絡(luò)安全方面最常見的工具被廣泛使用,但是它的基本原理其實很簡單,就是先把同卡設(shè)備設(shè)為混雜模式,然后直接接收鏈路層的數(shù)據(jù)。為了實現(xiàn)用戶所提出的各種需求,抓包工具必需達(dá)到以下功能:(1)運行于數(shù)據(jù)鏈路層,監(jiān)視網(wǎng)絡(luò)狀態(tài),對數(shù)據(jù)幀進(jìn)行捕捉和統(tǒng)計,為優(yōu)化網(wǎng)絡(luò)性能、增強(qiáng)系統(tǒng)安全性提供充分有效的依據(jù)。此時的工作網(wǎng)卡處于混雜模式。(2)能夠?qū)W(wǎng)絡(luò)中捕捉的數(shù)據(jù)包解碼,用于故障分析。如數(shù)據(jù)包的編號、長度、硬件地址類型、協(xié)議地址類型、MAC地址長度、IP地址長度、操作代碼、發(fā)送者硬件地址、目標(biāo)硬件地址、源IP、目的IP等相關(guān)信息。(3)友好的圖形化界面,不需要復(fù)雜的命令,大部分功能通過鼠標(biāo)點擊就可達(dá)到,操作簡單、方便。(4)用戶能夠自定義過濾規(guī)則,使數(shù)據(jù)包的捕獲更加精準(zhǔn)和具有靈活性,增強(qiáng)了軟件功能以及與用戶的交互能力。2.1.3性能需求一個程序除了能正常運行并且達(dá)到相應(yīng)的功能外,對程序性能也有嚴(yán)格的要求,性能需求決定了整個系統(tǒng)的性能檔次、所采用的技術(shù)和設(shè)備檔次,本程序除了達(dá)到常用軟件對響應(yīng)時間以及差錯控制的要求外,還提出以下要求:(1)數(shù)據(jù)精確性:捕獲到的數(shù)據(jù)包并不僅僅是單純的數(shù)據(jù)信息,而是包含有IP頭、TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡(luò)傳輸時的原貌,為分析網(wǎng)絡(luò)信息提供了重要資料。(2)適應(yīng)圍:優(yōu)秀的抓包工具能夠分析幾百種協(xié)議。一般情況下,大多數(shù)的抓包工具至少能夠分析下面的協(xié)議:IP、TCP、UDP、ICMP、ARP等。2.2開發(fā)平臺開發(fā)平臺:Windows7開發(fā)語言:C++集成開發(fā)環(huán)境:VisualStudio2010輔助開發(fā)工具:WinPcap開發(fā)包()三概要設(shè)計3.1TCP/IP協(xié)議族和WinPcap簡介本系統(tǒng)使用的開發(fā)包WinPcap是Windows平臺下的專業(yè)網(wǎng)絡(luò)數(shù)據(jù)包捕獲開發(fā)包。3.1.1TCP協(xié)議族TCP協(xié)議和IP協(xié)議指兩個用在Internet上的網(wǎng)絡(luò)協(xié)議(或數(shù)據(jù)傳輸?shù)姆椒ǎ?。它們分別是傳輸控制協(xié)議和互聯(lián)網(wǎng)協(xié)議。這兩個協(xié)議屬于眾多的TCP/IP協(xié)議族的一部分。在TCP/IP協(xié)議族中,有很多種協(xié)議。圖2-1給出了TCP/IP協(xié)議族中不同層次的協(xié)議。圖2-1TCP/IP協(xié)議族中不同層次的協(xié)議TCP數(shù)據(jù)報格式傳輸控制協(xié)議TCP(transmissioncontrolprotocol)是專門用于在不可靠的因特網(wǎng)上提供可靠的、端到端的字節(jié)流通信協(xié)議。TCP雖然是面向字節(jié)流的,但TCP傳送的數(shù)據(jù)單元卻是報文段。一個TCP報文段分為首部和數(shù)據(jù)兩部分,而TCP的全部功能都體現(xiàn)在它首部中各字段的作用。圖2-2給出了TCP報文段的首部格式。圖2-2TCP報文段的首部格式(2)UDP數(shù)據(jù)報格式用戶數(shù)據(jù)報UDP有兩個字段:數(shù)據(jù)字段和首部字段。首部字段很簡單,只有8個字節(jié)(圖2-3),由四個字段組成,每個字段的長度都是兩個字節(jié)。圖2-3UDP用戶數(shù)據(jù)報的首部和偽首部(3)IP數(shù)據(jù)報格式IP是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳輸。圖2-4是IP數(shù)據(jù)報的完整格式。圖2-4IP數(shù)據(jù)報格式(4)ICMP數(shù)據(jù)報格式ICMP報文是在IP數(shù)據(jù)報部被傳輸?shù)?。ICMP報文的格式如圖2-5所示。所有的報文的前4個字節(jié)都是一樣的,但是剩下的其他字節(jié)則互不相同。類型字段可以有15個不同的值,以描述特定類型的ICMP報文。*些ICMP報文還使用代碼字段的值來進(jìn)一步描述不同的條件。檢驗和字段覆蓋整個ICMP報文。圖2-5ICMP報文格式(5)ARP數(shù)據(jù)報格式在以太網(wǎng)上解析IP地址時,ARP請求和應(yīng)答分組的格式如圖2-6所示(ARP可以用于其他類型的網(wǎng)絡(luò),可以解析IP地址以外的地址。緊跟著幀類型字段的前四個字段指定了最后四個字段的類型和長度)。圖2-6用于以太網(wǎng)的ARP請求或應(yīng)答分組格式3.1.2WinPcap簡介WinPcap(WindowsPacketCapture)是Windows平臺下一個免費,公共的網(wǎng)絡(luò)訪問系統(tǒng)。是Libpcap在Windows平臺下的版本,針對Windows進(jìn)行了優(yōu)化處理和擴(kuò)展。WinPcap驅(qū)動有如下功能:1、捕獲原始數(shù)據(jù)包,包括在共享網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交換的數(shù)據(jù)WinPcap結(jié)構(gòu)包。2、在數(shù)據(jù)包發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將*些特殊的數(shù)據(jù)包過濾掉。3、在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)包。4、收集網(wǎng)絡(luò)通信工程中的統(tǒng)計信息。WinPcap的主要功能在于獨立于主機(jī)協(xié)議(如TCP/IP)而發(fā)送和接收原始數(shù)據(jù)包。也就是說,WinPcap不能阻塞、過濾或控制其他應(yīng)用程序數(shù)據(jù)包的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。WinPcap提供給用戶兩個不同級別的編程接口:一個基于Libpcap的wpcap.dll,另一個是較底層的packet.dll。WinPcap的配置過程如下(以MicrosoftVisualC++6.0為例):1、添加頭文件目錄:工具選項目錄Includefiles添加…\WpdPack\Include目錄。2、添加庫文件目錄:工具選項目錄Libraryfiles添加…\WpdPack\Lib目錄。3、添加預(yù)處理定義WPCAP和HAVE_REMOTE:工程設(shè)置C/C++預(yù)處理程序定義添加WPCAP和HAVE_REMOTE。4、添加wpcap.lib庫函數(shù):工程設(shè)置連接對象/庫模塊添加wpcap.lib。5、添加pcap.h頭文件在每個使用了WinPcap函數(shù)的源文件中添加pcap.h。3.2系統(tǒng)總體分析與設(shè)計在以太網(wǎng)中,信息是以明文的形式在網(wǎng)絡(luò)上傳輸?shù)?,?dāng)將網(wǎng)絡(luò)適配器設(shè)置為混雜模式時,由于采用以太網(wǎng)廣播信道爭用的方式,使得監(jiān)聽系統(tǒng)與正常通信的網(wǎng)絡(luò)能夠并聯(lián)連接,并可以捕獲任何一個在同一沖突域上傳輸?shù)臄?shù)據(jù)包。運用這一原理使信息捕獲系統(tǒng)能夠攔截我們所要的信息,這是捕獲數(shù)據(jù)包的物理基礎(chǔ)。首先抓包系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡(luò)上傳輸?shù)脑紨?shù)據(jù)包。WinPcap提供了兩個不同的庫:packet.dll和wpcap.dll。wpcap.dll提供了更加友好、功能更加強(qiáng)大的函數(shù)調(diào)用。系統(tǒng)總體結(jié)構(gòu)分析與設(shè)計本系統(tǒng)基于WinPcap捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包的思想和方法進(jìn)行設(shè)計,整體結(jié)構(gòu)按功能分為3個部分,分別是數(shù)據(jù)捕獲模塊、協(xié)議解析模塊和用戶顯示模塊。系統(tǒng)的總體結(jié)構(gòu)如圖2-7所示。網(wǎng)絡(luò)嗅探器網(wǎng)絡(luò)嗅探器用戶界面協(xié)議解析模塊數(shù)據(jù)捕獲模塊用戶界面協(xié)議解析模塊數(shù)據(jù)捕獲模塊圖2-7系統(tǒng)的總體結(jié)構(gòu)3.2.2系統(tǒng)總體流程用戶可以根據(jù)需要選擇指定的檢測網(wǎng)卡,對要偵聽的報文類型、IP地址和傳輸方向進(jìn)行設(shè)置(即過濾設(shè)置)。捕獲后系統(tǒng)簡要顯示每個報文的標(biāo)識,源、目的地址,長度和類型信息。當(dāng)選中一報文時,系統(tǒng)顯示該報文的結(jié)構(gòu)解析樹和完整十六進(jìn)制信息。系統(tǒng)總體流程如圖2-8所示。開始開始得到網(wǎng)卡句柄得到網(wǎng)卡句柄選擇監(jiān)聽的網(wǎng)卡選擇監(jiān)聽的網(wǎng)卡設(shè)置過濾器設(shè)置過濾器選擇數(shù)據(jù)包選擇數(shù)據(jù)包定位、初始化定位、初始化打開網(wǎng)卡打開網(wǎng)卡接受并顯示數(shù)據(jù)接受并顯示數(shù)據(jù)分析數(shù)據(jù)包分析數(shù)據(jù)包釋放設(shè)備、緩沖區(qū)釋放設(shè)備、緩沖區(qū)結(jié)束結(jié)束圖2-8系統(tǒng)總體流程系統(tǒng)數(shù)據(jù)結(jié)構(gòu)分析與設(shè)計系統(tǒng)每捕獲到一個數(shù)據(jù)包,就要對數(shù)據(jù)包進(jìn)行協(xié)議解析。解析過程需要構(gòu)造相應(yīng)類型的報文對象。系統(tǒng)基于對TCP/IP協(xié)議族數(shù)據(jù)報格式的分析,對各個報文類都有詳細(xì)的描述。(1)pcap抓到都是數(shù)據(jù)鏈路層的數(shù)據(jù)包(即以太幀),要對數(shù)據(jù)包進(jìn)行協(xié)議分析,首先要構(gòu)造以太幀頭部對象。以太幀頭部的類描述如下://Mac幀頭占14個字節(jié)structethhdr{ u_chardest[6]; //6個字節(jié)目標(biāo)地址u_charsrc[6]; //6個字節(jié)源地址u_shorttype; //2個字節(jié)類型};(2)以太幀的數(shù)據(jù)部分可能是ARP數(shù)據(jù)報或者是IP數(shù)據(jù)報等等。系統(tǒng)在對其進(jìn)行進(jìn)一步的協(xié)議解析的過程中,就要根據(jù)以太幀頭部的類型字段進(jìn)行構(gòu)造相應(yīng)類型的數(shù)據(jù)報對象。IP數(shù)據(jù)報的描述如下://定義IP頭structiphdr{*ifdefined(LITTLE_ENDIAN) u_charihl:4;u_charversion:4;*elifdefined(BIG_ENDIAN) u_charversion:4; u_charihl:4;*endif u_chartos; //TOS服務(wù)類型u_shorttlen; //包總長u_short占兩個字節(jié)u_shortid; //標(biāo)識u_shortfrag_off; //片位移u_charttl; //生存時間u_charproto; //協(xié)議u_shortcheck; //校驗和u_intsaddr; //源地址u_intdaddr; //目的地址u_int op_pad; //選項等};ARP數(shù)據(jù)報的描述如下://ARP頭structarphdr{ u_shortar_hrd; //硬件類型u_shortar_pro; //協(xié)議類型u_charar_hln; //硬件地址長度u_charar_pln; //協(xié)議地址長度u_shortar_op; //操作碼,1為請求2為回復(fù)u_charar_srcmac[6]; //發(fā)送方MAC u_charar_srcip[4]; //發(fā)送方IP u_charar_destmac[6]; //接收方MAC u_charar_destip[4]; //接收方IP};(3)對IP數(shù)據(jù)報的數(shù)據(jù)部分分析可能的情況:TCP數(shù)據(jù)報、UDP數(shù)據(jù)報和ICMP數(shù)據(jù)報等。系統(tǒng)在進(jìn)行協(xié)議解析時要根據(jù)IP數(shù)據(jù)報的協(xié)議字段進(jìn)行構(gòu)造對應(yīng)類型的數(shù)據(jù)報對象。TCP數(shù)據(jù)報的描述如下://定義TCP頭structtcphdr{ u_shortsport; //源端口地址16位u_shortdport; //目的端口地址16位u_intseq; //序列號32位u_intack_seq; //確認(rèn)序列號*ifdefined(LITTLE_ENDIAN) u_shortres1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;*elifdefined(BIG_ENDIAN) u_shortdoff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;*endif u_shortwindow; //窗口大小16位u_shortcheck; //校驗和16位u_shorturg_ptr; //緊急指針16位u_intopt; //選項};UDP數(shù)據(jù)報的描述如下://定義UDP頭structudphdr{ u_shortsport; //源端口16位u_shortdport; //目的端口16位u_shortlen; //數(shù)據(jù)報長度16位u_shortcheck; //校驗和16位};ICMP數(shù)據(jù)報的描述如下://定義ICMPstructicmphdr{ u_chartype; //8位類型u_charcode; //8位代碼u_charseq; //序列號8位u_charchksum; //8位校驗和};四系統(tǒng)詳細(xì)設(shè)計與實現(xiàn)4.1數(shù)據(jù)捕獲模塊的設(shè)計與實現(xiàn)數(shù)據(jù)捕獲模塊的主要功能是進(jìn)行數(shù)據(jù)采集,這是整個系統(tǒng)的基礎(chǔ)和數(shù)據(jù)來源。系統(tǒng)使用WinPcap來捕獲網(wǎng)絡(luò)中的原始數(shù)據(jù)包。系統(tǒng)首先調(diào)用pcap_findalldevs()函數(shù),初始化網(wǎng)卡選擇界面,用戶選擇要檢測的網(wǎng)卡、設(shè)置好過濾條件并單擊”開始”菜單項(或工具欄項)后,系統(tǒng)調(diào)用pcap_open_live()函數(shù)將網(wǎng)卡設(shè)置為混雜模式。接下來,系統(tǒng)調(diào)用pcap_loop()函數(shù),循環(huán)捕獲網(wǎng)絡(luò)數(shù)據(jù)包。每捕獲一個數(shù)據(jù)包就調(diào)用設(shè)計好的回調(diào)函數(shù)來檢測數(shù)據(jù)包是否符合過濾條件,符合就給顯示界面發(fā)送信息,通知其顯示數(shù)據(jù)包信息。一旦用戶單擊”停止”菜單項(或工具欄項),系統(tǒng)就調(diào)用pcap_close()函數(shù),關(guān)閉Winpcap操作,并銷毀相應(yīng)資源。數(shù)據(jù)捕獲主要代碼如下://開始捕獲intCMy44174413snifferDlg::My44174413sniffer_startCap(){ intif_inde*,filter_inde*,count; u_intnetmask; structbpf_programfcode; My44174413sniffer_initCap(); //獲得接口和過濾器索引if_inde*=this->m_boBo*.GetCurSel(); filter_inde*=this->m_boBo*Rule.GetCurSel();if(0==if_inde*||CB_ERR==if_inde*) { MessageBo*(_T("請選擇一個合適的網(wǎng)卡接口")); return-1; } if(CB_ERR==filter_inde*) { MessageBo*(_T("過濾器選擇錯誤")); return-1; } /*獲得選中的網(wǎng)卡接口*/ dev=alldev; for(count=0;count<if_inde*-1;count++) dev=dev->ne*t; if((adhandle=pcap_open_live(dev->name, //設(shè)備名65536, //捕獲數(shù)據(jù)包長度1, //混雜模式(非0意味著是混雜模式) 1000, //讀超時設(shè)置errbuf //錯誤信息))==NULL) { MessageBo*(_T("無法打開接口:"+CString(dev->description))); pcap_freealldevs(alldev); return-1; }4.2協(xié)議解析模塊的設(shè)計與實現(xiàn)由于pcap每次抓到一個數(shù)據(jù)包,都會提交其信息,方式為以unsignedchar*指向的一段緩沖區(qū)?,F(xiàn)將緩沖區(qū)前14個字節(jié)讀入,按以太幀格式構(gòu)造以太幀頭部的對象。然后根據(jù)以太幀頭部中的Type字段,決定接下來應(yīng)該構(gòu)造IP、ARP或者RARP。假設(shè)是IP,則把緩沖區(qū)中第15個字節(jié)開始直到這塊緩沖區(qū)最后的所以字節(jié)讀入,按IP報文格式構(gòu)造IP的對象,根據(jù)IP的Protocol字段,決定接下來構(gòu)造TCP,UDP還是ICMP。假設(shè)是TCP,則將IP的數(shù)據(jù)容讀入,按TCP格式構(gòu)造TCP的對象。系統(tǒng)首先顯示捕獲的數(shù)據(jù)包的簡要信息,若用戶對該數(shù)據(jù)包感興趣,只要單擊選中該數(shù)據(jù)包,系統(tǒng)就會顯示該數(shù)據(jù)包的詳細(xì)信息。若數(shù)據(jù)包中是IP數(shù)據(jù)報,則簡要顯示該數(shù)據(jù)包的主要代碼如下:if(0*0800==local_data->ethh->type){ //IP HTREEITEMip=this->m_treeCtrl.InsertItem(_T("IP協(xié)議頭"),data); str.Format(_T("版本:%d"),local_data->iph->version); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("IP頭長:%d"),local_data->iph->ihl); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("服務(wù)類型:%d"),local_data->iph->tos); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("總長度:%d"),local_data->iph->tlen); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("標(biāo)識:0*%02*"),local_data->iph->id); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("段偏移:%d"),local_data->iph->frag_off); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("生存期:%d"),local_data->iph->ttl); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("協(xié)議:%d"),local_data->iph->proto); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("頭部校驗和:0*%02*"),local_data->iph->check); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("源IP:")); structin_addrin; in.S_un.S_addr=local_data->iph->saddr; str.AppendFormat(CString(inet_ntoa(in))); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("目的IP:")); in.S_un.S_addr=local_data->iph->daddr; str.AppendFormat(CString(inet_ntoa(in))); this->m_treeCtrl.InsertItem(str,ip);解析數(shù)據(jù)包主要通過analyze_frame()這個函數(shù)實現(xiàn)的,實際上并非這個函數(shù)完成了所有的功能,其實從名字就可以看出,它只是完成了對“幀”的解析,也就是鏈路層數(shù)據(jù)的解析,還有analyze_arp()、analyze_ip()、analyze_ip6()、analyze_icmp()……等來完成其他協(xié)議層的解析工作。需要特別說明的一點是,網(wǎng)絡(luò)中的字節(jié)順序跟主機(jī)中的字節(jié)順序是完全不一樣的,所以特別是要獲得數(shù)字的值的時候,一定要先調(diào)用ntohs()函數(shù)(networktohostshort)或ntohl()函數(shù)(networktohostlong)將數(shù)據(jù)包的網(wǎng)絡(luò)字節(jié)順轉(zhuǎn)換為主機(jī)字節(jié)序,這樣在做一些判斷的時候才是準(zhǔn)確的。由協(xié)議棧工作流程可知,數(shù)據(jù)是由應(yīng)用層把數(shù)據(jù)加上應(yīng)用層協(xié)議頭后給傳輸層,傳輸層在最外面加上它的頭部后給網(wǎng)絡(luò)層,網(wǎng)絡(luò)層在外面加上它的頭部后再給鏈路層……所以當(dāng)數(shù)據(jù)包被捕獲到之后最外面的就是鏈路層的協(xié)議頭,因此首先要解析的就是鏈路層協(xié)議,這也就是為什么首先要調(diào)用analyze_frame()這個函數(shù)了,然后再一層一層把它“剝開”,最終獲得里面的數(shù)據(jù)。每一層的上層可能有多種協(xié)議在工作,比如IP上層就有TCP和UDP等之分,所以在解析數(shù)據(jù)包的時候需要根據(jù)不同的特征來判斷上層協(xié)議到底是什么,然后再來調(diào)用相關(guān)的函數(shù)對其進(jìn)行解析,下面將列出一些主要的判斷特征:(1)鏈路層--網(wǎng)絡(luò)層網(wǎng)絡(luò)層可能會有arp、ipv4、ipv6這三種不同的情況,在鏈路層定義了一個type字段,專門用于指示網(wǎng)絡(luò)層數(shù)據(jù)包是什么類型。type==0*0806表示這是一個arp包type==0*0800表示這是一個ipv4包type==0*86dd表示這是一個ipv6包(2)網(wǎng)絡(luò)層(IP層)--傳輸層IP層之上可能會有tcp、udp、icmp等IPv4協(xié)議定義了proto字段來指示傳輸層協(xié)議是什么。還記得上一章的Protocol.h文件中的這段定義不?proto什么值對應(yīng)什么協(xié)議很明白了吧?*definePROTO_ICMP1*definePROTO_TCP6*definePROTO_UDP17IPv6使用nh字段來標(biāo)明傳輸層協(xié)議,如下:nh==0*3a表示上層是icmpv6nh==0*06表示上層是tcpnh==0*11表示上層是udp(3)傳輸層之上就是應(yīng)用層了,這里我們的應(yīng)用層只支持http協(xié)議,判斷方法很簡單,就是看目的或源端口是不是80。余下的工作就是一個字段一個字段地獲取數(shù)據(jù)包的值了。4.3用戶界面模塊的設(shè)計與實現(xiàn)用戶設(shè)計界面如圖4-1所示:圖4-1設(shè)計界面要寫在GUI上的數(shù)據(jù)主要有五個部分:(1)參數(shù)設(shè)置:網(wǎng)卡接口、過濾項(2)數(shù)據(jù)包捕獲列表,顯示數(shù)據(jù)包簡要信息(3)樹形目錄,顯示被選中的數(shù)據(jù)詳細(xì)信息(4)文本框,顯示被選中的數(shù)據(jù)包十六進(jìn)制信息(5)統(tǒng)計信息:各類包的數(shù)量控件寫數(shù)據(jù)的基本操作由于我們選擇的是對話框的形式的界面,所以主界面只有一個,放置在主界面上的各個控件都可以通過主界面的this指針調(diào)用,并設(shè)置控件的值,例如:this->m_listCtrl.SetItemTe*t(nItem,2,buf);其中m_listCtrl是放置于主界面上的一個列表控件,各種控件上的數(shù)據(jù)也就基本通過這樣的方式調(diào)用。程序中我們新開了一個線程來處理數(shù)據(jù),線程中每收到一個數(shù)據(jù)包都需要更新一下界面,這樣就可以實時看到捕獲的數(shù)據(jù)及統(tǒng)計信息了,這需要我們把主界面的this指針傳遞給線程,如下:m_ThreadHandle=CreateThread(NULL,0,sinffer_CapThread,this,0,threadCap);線程處理函數(shù)原型如下:DWORDWINAPIsinffer_CapThread(LPVOIDlpParameter);這里的lpParameter就是剛剛傳遞進(jìn)來的this指針了,在函數(shù)中使用如下:Cmcf6Dlg*pthis=(Cmcf6Dlg*)lpParameter;4.3.2根據(jù)不同協(xié)議顯示不同顏色從圖4-2可以看到,List控件有一個事件是NM_CUSTOMDRAW,每次有新的一行加入的時候,都觸發(fā)該事件,然后調(diào)用相關(guān)的處理函數(shù)進(jìn)行自定義繪制,可以注冊一個該事件。圖4-2首先通過下面這段代碼獲得新加入到List列表中的數(shù)據(jù)位置POSITIONpos=this->m_localDataList.FindInde*(pNMCD->nmcd.dwItemSpec);然后通過下面代碼獲得新加入行中存儲的數(shù)據(jù)structdatapkt*local_data=(structdatapkt*)this->m_localDataList.GetAt(pos);最后根據(jù)數(shù)據(jù)中對應(yīng)的協(xié)議設(shè)置不同的顯示顏色。這樣,一個界面友好的列表就設(shè)置好了。對數(shù)據(jù)格式化顯示主要通過下面這個函數(shù)實現(xiàn),下面這個函數(shù)主要做了兩件事:(1)將數(shù)據(jù)是16進(jìn)制的形式顯示;(2)將數(shù)據(jù)以字符形式顯示。voidprint_packet_he*(constu_char*pkt,intsize_pkt,CString*buf){ inti=0,j=0,rowcount; u_charch; chartempbuf[256]; memset(tempbuf,0,256); for(i=0;i<size_pkt;i+=16) { buf->AppendFormat(_T("%04*:"),(u_int)i); rowcount=(size_pkt-i)>16"16:(size_pkt-i); for(j=0;j<rowcount;j++) buf->AppendFormat(_T("%02*"),(u_int)pkt[i+j]); //不足16,用空格補足if(rowcount<16) for(j=rowcount;j<16;j++) buf->AppendFormat(_T("")); for(j=0;j<rowcount;j++) {ch=pkt[i+j];ch=isprint(ch)"ch:'.'; buf->AppendFormat(_T("%c"),ch); } buf->Append(_T("\r\n")); if(rowcount<16) return; }}選中報文時運行效果如圖4-3所示。圖4-3運行界面五結(jié)語本次程序是在WinPcap庫的基礎(chǔ)上對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行捕獲,不需要編寫復(fù)雜的設(shè)備驅(qū)動程序和代碼就可以實現(xiàn)抓包,使得其編寫過程比較簡便、有效率。從選擇抓包程序,到查閱資料,思考課題的解決的方案,再到程序的實現(xiàn),是一個集中學(xué)習(xí)的過程,是一個靈活運用知識的過程,是一個由量變到質(zhì)變的過程。感覺到自己進(jìn)步了,感覺到自己學(xué)到一些東西了,感覺到自己求知的態(tài)度了。在編寫程序的過程中,我每每為自己的一些新的感悟而欣喜,為排除每一個錯誤而興奮。編程序需要功夫,調(diào)試程序更需要有耐心和技巧。期間,我不斷地拓展自己的思路,盡可能地為程序添加新的功能,當(dāng)然,這中間是少不了錯誤的發(fā)生的。也正是在編寫一調(diào)試一再編寫的過程中,我理解了MFC框架機(jī)制,知道了如何在程序中添加自己的代碼,如何自定義自己的消息,如何實現(xiàn)多線程的運行。就最終的成果而言,程序?qū)崿F(xiàn)了抓包的基本功能,通過對過濾條件的設(shè)置,實現(xiàn)了對特定源和目的IP地址、端口的數(shù)據(jù)包的捕獲,并顯示數(shù)據(jù)包的容,諸如協(xié)議類型、長度、時間戳等信息等。隨著網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,網(wǎng)絡(luò)安全將被人們越來越重視,抓包技術(shù)作為網(wǎng)絡(luò)安全攻防中最基礎(chǔ)的技術(shù),抓包工具的發(fā)展將向著集成化和易用型發(fā)展這兩個方向發(fā)展,我相信這也是絕大部分軟件的發(fā)展趨勢。網(wǎng)絡(luò)安全是我們絕大部分人必須警惕關(guān)注的一個問題,當(dāng)今社會信息流通量越來越大,高科技人才也越來越多,高頻率的網(wǎng)絡(luò)犯罪讓人們防不勝防。我們不但要正確使用抓包工具.還要合理防抓包工具的危害。抓包工具能夠造成很大的安全危害,主要是因為它們不容易被發(fā)現(xiàn)。鑒于目前的網(wǎng)絡(luò)安全現(xiàn)狀,我們應(yīng)該進(jìn)一步挖掘網(wǎng)絡(luò)監(jiān)聽技術(shù)的細(xì)節(jié),從技術(shù)基礎(chǔ)上掌握先機(jī),才能在與入侵者的斗爭中取得勝利。六附錄6.1參考文獻(xiàn)[1]小特,王勇軍.基于WinPcap的捕包程序設(shè)計[J].軟件導(dǎo)刊.2007,(21)[2]TheWinPcapTeam.WinPcap中文技術(shù)文檔[J/OL].2007. .ferris*u./WinPcap/html/inde*.html[3]輝,葉子青?VisualC++系統(tǒng)開發(fā)實例精粹[M]?:人民郵電,2005[4]吳功宜,董大凡,王珺等.計算機(jī)網(wǎng)絡(luò)高級軟件編程技術(shù)[M]?:清華大學(xué),20086.2主要函數(shù)代碼//初始化winpcapintCMy44174413snifferDlg::My44174413sniffer_initCap(){ devCount=0; if(pcap_findalldevs(&alldev,errbuf)==-1) return-1; for(dev=alldev;dev;dev=dev->ne*t) devCount++; return0;}DWORDWINAPIsniffer_CapThread(LPVOIDlpParameter){ intres,nItem; structtm*ltime; CStringtimestr,buf,srcMac,destMac; time_tlocal_tv_sec; structpcap_pkthdr*header; //數(shù)據(jù)constu_char*pkt_data=NULL,*pData=NULL;//網(wǎng)絡(luò)中收到的字節(jié)流數(shù)據(jù)u_char*ppkt_data; CMy44174413snifferDlg*pthis=(CMy44174413snifferDlg*)lpParameter; if(NULL==pthis->m_ThreadHandle) { MessageBo*(NULL,_T("線程句柄錯誤"),_T("提示"),MB_OK); return-1; } while((res=pcap_ne*t_e*(pthis->adhandle,&header,&pkt_data))>=0) { if(res==0) //超時continue; structdatapkt*data=(structdatapkt*)malloc(sizeof(structdatapkt)); memset(data,0,sizeof(structdatapkt)); if(NULL==data) { MessageBo*(NULL,_T("空間已滿,無法接收新的數(shù)據(jù)包"),_T("Error"),MB_OK); return-1; } //分析出錯或所接收數(shù)據(jù)包不在處理圍if(analyze_frame(pkt_data,data,&(pthis->npacket))<0) continue; //將數(shù)據(jù)包保存到打開的文件中if(pthis->dumpfile!=NULL) { pcap_dump((unsignedchar*)pthis->dumpfile,header,pkt_data); } //更新各類數(shù)據(jù)包計數(shù)pthis->My44174413sniffer_updateNPacket(); //將本地化后的數(shù)據(jù)裝入一個鏈表中,以便后來使用ppkt_data=(u_char*)malloc(header->len); memcpy(ppkt_data,pkt_data,header->len); pthis->m_localDataList.AddTail(data); pthis->m_netDataList.AddTail(ppkt_data); /*預(yù)處理,獲得時間、長度*/ data->len=header->len; //鏈路中收到的數(shù)據(jù)長度local_tv_sec=header->ts.tv_sec; ltime=localtime(&local_tv_sec); data->time[0]=ltime->tm_year+1900; data->time[1]=ltime->tm_mon+1; data->time[2]=ltime->tm_mday; data->time[3]=ltime->tm_hour; data->time[4]=ltime->tm_min; data->time[5]=ltime->tm_sec; /*為新接收到的數(shù)據(jù)包在listControl中新建一個item*/ buf.Format(_T("%d"),pthis->npkt); nItem=pthis->m_listCtrl.InsertItem(pthis->npkt,buf); /*顯示時間戳*/ timestr.Format(_T("%d/%d/%d%d:%d:%d"),data->time[0], data->time[1],data->time[2],data->time[3],data->time[4],data->time[5]); pthis->m_listCtrl.SetItemTe*t(nItem,1,timestr); //pthis->m_listCtrl.setitem /*顯示長度*/ buf.Empty(); buf.Format(_T("%d"),data->len); pthis->m_listCtrl.SetItemTe*t(nItem,2,buf); /*顯示源MAC*/ buf.Empty(); buf.Format(_T("%02*-%02*-%02*-%02*-%02*-%02*"),data->ethh->src[0],data->ethh->src[1], data->ethh->src[2],data->ethh->src[3],data->ethh->src[4],data->ethh->src[5]); pthis->m_listCtrl.SetItemTe*t(nItem,3,buf); /*顯示目的MAC*/ buf.Empty(); buf.Format(_T("%02*-%02*-%02*-%02*-%02*-%02*"),data->ethh->dest[0],data->ethh->dest[1], data->ethh->dest[2],data->ethh->dest[3],data->ethh->dest[4],data->ethh->dest[5]); pthis->m_listCtrl.SetItemTe*t(nItem,4,buf); /*獲得協(xié)議*/ pthis->m_listCtrl.SetItemTe*t(nItem,5,CString(data->pktType)); /*獲得源IP*/ buf.Empty(); if(0*0806==data->ethh->type) { buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip[0], data->arph->ar_srcip[1],data->arph->ar_srcip[2],data->arph->ar_srcip[3]); }elseif(0*0800==data->ethh->type){ structin_addrin; in.S_un.S_addr=data->iph->saddr; buf=CString(inet_ntoa(in)); }elseif(0*86dd==data->ethh->type){ intn; for(n=0;n<8;n++) { if(n<=6) buf.AppendFormat(_T("%02*:"),data->iph6->saddr[n]); else buf.AppendFormat(_T("%02*"),data->iph6->saddr[n]); } } pthis->m_listCtrl.SetItemTe*t(nItem,6,buf); /*獲得目的IP*/ buf.Empty(); if(0*0806==data->ethh->type) { buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip[0], data->arph->ar_destip[1],data->arph->ar_destip[2],data->arph->ar_destip[3]); }elseif(0*0800==data->ethh->type){ structin_addrin; in.S_un.S_addr=data->iph->daddr; buf=CString(inet_ntoa(in)); }elseif(0*86dd==data->ethh->type){ intn; for(n=0;n<8;n++) { if(n<=6) buf.AppendFormat(_T("%02*:"),data->iph6->daddr[n]); else buf.AppendFormat(_T("%02*"),data->iph6->daddr[n]); } } pthis->m_listCtrl.SetItemTe*t(nItem,7,buf); /*對包計數(shù)*/ pthis->npkt++; } return1;}/*設(shè)置數(shù)據(jù)包存儲路徑*/ CFileFindfile; charthistime[30]; structtm*ltime; memset(filepath,0,512); memset(filename,0,64); if(!file.FindFile(_T("SavedData"))) { CreateDirectory(_T("SavedData"),NULL); } time_tnowtime; time(&nowtime); ltime=localtime(&nowtime); strftime(thistime,sizeof(thistime),"%Y%m%d%H%M%S",ltime); strcpy(fi

溫馨提示

  • 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

提交評論