版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計題 目:基于WinPcap的網(wǎng)絡嗅探器設計與實現(xiàn)專業(yè)班級:網(wǎng)絡工程完成時間:2015年1月目錄目錄2一 引言11.1 編寫目的11.2 問題背景1二 需求分析32.1 需求規(guī)定32.1.1 用戶需求32.1.2 功能需求32.1.3 性能需求42.2 開發(fā)平臺4三 概要設計53.1 TCP/IP協(xié)議族和WinPcap簡介53.1.1 TCP協(xié)議族53.1.2 WinPcap簡介83.2 系統(tǒng)總體分析與設計93.2.1系統(tǒng)總體結構分析與設計93.2.2 系統(tǒng)總體流程93.2.3系統(tǒng)數(shù)據(jù)結構分析與設計10四 系統(tǒng)詳細設計與實現(xiàn)144.1數(shù)據(jù)捕獲模塊的設計與實現(xiàn)144.2協(xié)議解析模塊的設計與
2、實現(xiàn)154.3用戶界面模塊的設計與實現(xiàn)174.3.1控件寫數(shù)據(jù)的基本操作184.3.2 根據(jù)不同協(xié)議顯示不同顏色194.3.3對數(shù)據(jù)格式化顯示20五 結語22六 附錄236.1 參考文獻236.2主要函數(shù)代碼23一 引言1.1 編寫目的本需求的編寫是為了研究基于WinpCap網(wǎng)絡嗅探(網(wǎng)絡抓包)程序的開發(fā)途徑和應用方法。同時它也是進行項目策劃、概要設計和詳細設計的基礎,是維護人員進行內部維護,信息更新,驗收和測試的依據(jù),是用戶操作說明的指導文檔,是開發(fā)人員和用戶交互的良好界面。1.2 問題背景隨著網(wǎng)絡技術的飛速發(fā)展,加速了全球信息化的進程,各種重要數(shù)據(jù)在網(wǎng)上的傳播日益普遍,使得網(wǎng)絡安全問題越來
3、越為人們所關注。網(wǎng)絡嗅探(網(wǎng)絡抓包)工具作為一種網(wǎng)絡數(shù)據(jù)監(jiān)聽程序,在網(wǎng)絡安全攻防方面扮演了很重要的角色,目前已經(jīng)有不少網(wǎng)絡嗅探(網(wǎng)絡抓包)工具,譬如在Windows環(huán)境下,最富盛名的工具是Netxray、WireShark(原Ethereal)。網(wǎng)絡嗅探(網(wǎng)絡抓包)工具實際上是一把雙刃劍,通過使用網(wǎng)絡嗅探(網(wǎng)絡抓包)工具,可以把網(wǎng)卡設置于混雜模式,并可實現(xiàn)對網(wǎng)絡上傳輸?shù)臄?shù)據(jù)包的捕獲與分析,此分析結果可供網(wǎng)絡安全分析之用,也可為黑客發(fā)動進一步的攻擊提供有價值的信息。而在網(wǎng)絡安全方面,目前使用最廣泛的TCP/IP協(xié)議存在許多安全缺陷,網(wǎng)絡嗅探(網(wǎng)絡抓包)工具可以有效地探測在網(wǎng)絡上傳輸?shù)臄?shù)據(jù)包信息,
4、通過對這些信息的分析是有助于網(wǎng)絡安全維護的。根據(jù)網(wǎng)絡安全技術發(fā)展分析一文中的數(shù)據(jù),2007年以來網(wǎng)絡監(jiān)聽技術出現(xiàn)了新額重要特征,傳統(tǒng)的Sniffer技術是被動地監(jiān)聽網(wǎng)絡通信、用戶名和口令,而新的Sniffer技術則主動地控制通信數(shù)據(jù)。我們通過對網(wǎng)絡嗅探(網(wǎng)絡抓包)工具的數(shù)據(jù)包的捕獲與分析功能的進一步了解,才能做到知己知彼,有針對性地獲取所需要的信息,利用這些信息進行網(wǎng)絡安全分析的網(wǎng)絡威脅應對。因此對網(wǎng)絡嗅探(網(wǎng)絡抓包)技術的研究具有重要的意義。計算機網(wǎng)絡的設計為嗅探器的使用創(chuàng)造了最基本的條件。在目前的網(wǎng)絡環(huán)境中,所有計算機節(jié)點都是共享傳輸介質,任意節(jié)點發(fā)出或發(fā)往任意節(jié)點的數(shù)據(jù)幀必將經(jīng)過網(wǎng)內每一
5、個節(jié)點的網(wǎng)絡接口,此時只需對嗅探節(jié)點的網(wǎng)絡接口( 網(wǎng)卡) 進行適當?shù)脑O置便可為實現(xiàn)嗅探的做好準備工作。在計算機網(wǎng)絡系統(tǒng)中,網(wǎng)卡是用來接收網(wǎng)絡上其他節(jié)點發(fā)來的數(shù)據(jù)幀,其內嵌的單片處理程序會檢測數(shù)據(jù)幀來源的MAC 地址,并根據(jù)網(wǎng)卡所設置的接收方式來是否接收處理數(shù)據(jù),如果認為應該處理,則網(wǎng)卡就會產(chǎn)生中斷信號通知中央處理器,接收該數(shù)據(jù)幀并傳輸給操作系統(tǒng)處理。否則就簡單丟棄,所對應節(jié)點的網(wǎng)卡就截斷,計算機的中央處理器并不參與。網(wǎng)卡是網(wǎng)絡中節(jié)點主機的關鍵硬件設備。對數(shù)據(jù)的接收一般有四種設置模式: 廣播模式: 接收在網(wǎng)絡中進行廣播數(shù)據(jù)信息。組播模式: 接收組播數(shù)據(jù)信息。單播模式: 只有匹配的目的網(wǎng)卡才能接收
6、數(shù)據(jù)信息。混雜模式: 網(wǎng)卡能夠可以接收一切通過它的數(shù)據(jù)信息。二 需求分析2.1 需求規(guī)定2.1.1 用戶需求網(wǎng)絡嗅探(網(wǎng)絡抓包)是一種利用計算機的網(wǎng)絡接口截獲其它計算機數(shù)據(jù)報文的工具。使用網(wǎng)絡嗅探(網(wǎng)絡抓包)工具的主要人群是黑客或網(wǎng)絡安全技術人員,從攻擊的角度,黑客可以使用網(wǎng)絡嗅探(網(wǎng)絡抓包)程序非法獲取網(wǎng)絡中傳輸?shù)拇罅棵舾行畔?,如賬號和口令等,對網(wǎng)路安全極具威脅;從防守的角度,網(wǎng)絡嗅探(網(wǎng)絡抓包)技術是居于網(wǎng)絡的入侵檢測系統(tǒng)的最底層環(huán)節(jié),是整個系統(tǒng)的數(shù)據(jù)來源,為技術人員提供重要的依據(jù)。無論是黑客還是安全人員,他們對抓包技術的利用途徑都是一樣的,即對網(wǎng)絡上傳輸?shù)臄?shù)據(jù)包進行捕獲與分析,獲取不要的
7、信息,但是他們的目的是不一樣的,前者是專門利用計算機網(wǎng)絡搞破壞或惡作劇,而后者是通過對這些信息的分析利用。維護網(wǎng)絡安全與穩(wěn)定。因此用戶提出了以下要求:(1)能夠捕獲網(wǎng)絡數(shù)據(jù)包,并能對數(shù)據(jù)包進行簡單的分析。(2)精確的設置捕捉規(guī)則和靈活的過濾策略,能使用戶方便、準確地捕獲所需要的信息。(3)界面友好,操作簡單。2.1.2 功能需求盡管網(wǎng)絡嗅探(網(wǎng)絡抓包)工具作為網(wǎng)絡安全方面最常見的工具被廣泛使用,但是它的基本原理其實很簡單,就是先把同卡設備設為混雜模式,然后直接接收鏈路層的數(shù)據(jù)。為了實現(xiàn)用戶所提出的各種需求,抓包工具必需達到以下功能:(1)運行于數(shù)據(jù)鏈路層,監(jiān)視網(wǎng)絡狀態(tài),對數(shù)據(jù)幀進行捕捉和統(tǒng)計,
8、為優(yōu)化網(wǎng)絡性能、增強系統(tǒng)安全性提供充分有效的依據(jù)。此時的工作網(wǎng)卡處于混雜模式。(2)能夠對網(wǎng)絡中捕捉的數(shù)據(jù)包解碼,用于故障分析。如數(shù)據(jù)包的編號、長度、硬件地址類型、協(xié)議地址類型、MAC地址長度、IP地址長度、操作代碼、發(fā)送者硬件地址、目標硬件地址、源IP、目的IP等相關信息。(3)友好的圖形化界面,不需要復雜的命令,大部分功能通過鼠標點擊就可達到,操作簡單、方便。(4)用戶能夠自定義過濾規(guī)則,使數(shù)據(jù)包的捕獲更加精準和具有靈活性,增強了軟件功能以及與用戶的交互能力。2.1.3 性能需求一個程序除了能正常運行并且達到相應的功能外,對程序性能也有嚴格的要求,性能需求決定了整個系統(tǒng)的性能檔次、所采用的
9、技術和設備檔次,本程序除了達到常用軟件對響應時間以及差錯控制的要求外,還提出以下要求:(1)數(shù)據(jù)精確性:捕獲到的數(shù)據(jù)包并不僅僅是單純的數(shù)據(jù)信息,而是包含有IP頭、TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡傳輸時的原貌,為分析網(wǎng)絡信息提供了重要資料。(2)適應范圍:優(yōu)秀的抓包工具能夠分析幾百種協(xié)議。一般情況下,大多數(shù)的抓包工具至少能夠分析下面的協(xié)議:IP、TCP、UDP、ICMP、ARP等。2.2 開發(fā)平臺開發(fā)平臺:Windows 7開發(fā)語言:C+集成開發(fā)環(huán)境:Visual Studio 2010輔助開發(fā)工具:WinPcap開發(fā)包(WinPcap 4.0.2)三 概要設計3.1
10、TCP/IP協(xié)議族和WinPcap簡介本系統(tǒng)使用的開發(fā)包WinPcap是Windows平臺下的專業(yè)網(wǎng)絡數(shù)據(jù)包捕獲開發(fā)包。3.1.1 TCP協(xié)議族TCP協(xié)議和IP協(xié)議指兩個用在Internet上的網(wǎng)絡協(xié)議(或數(shù)據(jù)傳輸?shù)姆椒ǎK鼈兎謩e是傳輸控制協(xié)議和互聯(lián)網(wǎng)協(xié)議。這兩個協(xié)議屬于眾多的TCP/IP協(xié)議族的一部分。在TCP/IP協(xié)議族中,有很多種協(xié)議。圖2-1給出了TCP/IP協(xié)議族中不同層次的協(xié)議。圖2-1 TCP/IP協(xié)議族中不同層次的協(xié)議(1) TCP數(shù)據(jù)報格式傳輸控制協(xié)議TCP(transmission control protocol)是專門用于在不可靠的因特網(wǎng)上提供可靠的、端到端的字節(jié)流通
11、信協(xié)議。TCP雖然是面向字節(jié)流的,但TCP傳送的數(shù)據(jù)單元卻是報文段。一個TCP報文段分為首部和數(shù)據(jù)兩部分,而TCP的全部功能都體現(xiàn)在它首部中各字段的作用。圖2-2給出了TCP報文段的首部格式。圖2-2 TCP報文段的首部格式(2)UDP數(shù)據(jù)報格式用戶數(shù)據(jù)報UDP有兩個字段:數(shù)據(jù)字段和首部字段。首部字段很簡單,只有8個字節(jié)(圖2-3),由四個字段組成,每個字段的長度都是兩個字節(jié)。圖2-3 UDP用戶數(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-4 IP數(shù)據(jù)
12、報格式(4)ICMP數(shù)據(jù)報格式ICMP報文是在IP數(shù)據(jù)報內部被傳輸?shù)摹CMP報文的格式如圖2-5所示。所有的報文的前4個字節(jié)都是一樣的,但是剩下的其他字節(jié)則互不相同。類型字段可以有15個不同的值,以描述特定類型的ICMP報文。某些ICMP報文還使用代碼字段的值來進一步描述不同的條件。檢驗和字段覆蓋整個ICMP報文。圖2-5 ICMP報文格式(5)ARP數(shù)據(jù)報格式在以太網(wǎng)上解析IP地址時,ARP請求和應答分組的格式如圖2-6所示(ARP可以用于其他類型的網(wǎng)絡,可以解析IP地址以外的地址。緊跟著幀類型字段的前四個字段指定了最后四個字段的類型和長度)。圖2-6 用于以太網(wǎng)的ARP請求或應答分組格式
13、3.1.2 WinPcap簡介WinPcap(Windows Packet Capture)是Windows平臺下一個免費,公共的網(wǎng)絡訪問系統(tǒng)。是Libpcap在Windows平臺下的版本,針對Windows進行了優(yōu)化處理和擴展。WinPcap驅動有如下功能:1、捕獲原始數(shù)據(jù)包,包括在共享網(wǎng)絡上各主機發(fā)送/接收的以及相互之間交換的數(shù)據(jù)WinPcap結構包。2、在數(shù)據(jù)包發(fā)往應用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)包過濾掉。3、在網(wǎng)絡上發(fā)送原始的數(shù)據(jù)包。4、收集網(wǎng)絡通信工程中的統(tǒng)計信息。WinPcap的主要功能在于獨立于主機協(xié)議(如TCP/IP)而發(fā)送和接收原始數(shù)據(jù)包。也就是說,WinPca
14、p不能阻塞、過濾或控制其他應用程序數(shù)據(jù)包的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡上傳送的數(shù)據(jù)包。WinPcap提供給用戶兩個不同級別的編程接口:一個基于Libpcap的wpcap.dll,另一個是較底層的packet.dll。WinPcap的配置過程如下(以Microsoft Visual C+ 6.0為例):1、添加頭文件目錄:工具à選項à目錄àInclude filesà添加WpdPackInclude目錄。2、添加庫文件目錄:工具à選項à目錄àLibrary filesà添加WpdPackLib目錄。3、添加預處理定義
15、WPCAP和HAVE_REMOTE:工程à設置àC/C+à預處理程序定義à添加WPCAP和HAVE_REMOTE。4、添加wpcap.lib庫函數(shù):工程à設置à連接à對象/庫模塊à添加wpcap.lib。5、添加pcap.h頭文件在每個使用了WinPcap函數(shù)的源文件中添加pcap.h。3.2 系統(tǒng)總體分析與設計在以太網(wǎng)中,信息是以明文的形式在網(wǎng)絡上傳輸?shù)?,當將網(wǎng)絡適配器設置為混雜模式時,由于采用以太網(wǎng)廣播信道爭用的方式,使得監(jiān)聽系統(tǒng)與正常通信的網(wǎng)絡能夠并聯(lián)連接,并可以捕獲任何一個在同一沖突域上傳輸?shù)臄?shù)據(jù)包。運用這
16、一原理使信息捕獲系統(tǒng)能夠攔截我們所要的信息,這是捕獲數(shù)據(jù)包的物理基礎。首先抓包系統(tǒng)必須繞過操作系統(tǒng)的協(xié)議棧來訪問在網(wǎng)絡上傳輸?shù)脑紨?shù)據(jù)包。WinPcap提供了兩個不同的庫:packet.dll和wpcap.dll。wpcap.dll提供了更加友好、功能更加強大的函數(shù)調用。 3.2.1系統(tǒng)總體結構分析與設計本系統(tǒng)基于WinPcap捕獲和分析網(wǎng)絡數(shù)據(jù)包的思想和方法進行設計,整體結構按功能分為3個部分,分別是數(shù)據(jù)捕獲模塊、協(xié)議解析模塊和用戶顯示模塊。系統(tǒng)的總體結構如圖2-7所示。網(wǎng)絡嗅探器用戶界面協(xié)議解析模塊數(shù)據(jù)捕獲模塊圖2-7 系統(tǒng)的總體結構3.2.2 系統(tǒng)總體流程用戶可以根據(jù)需要選擇指定的檢測網(wǎng)
17、卡,對要偵聽的報文類型、IP地址和傳輸方向進行設置(即過濾設置)。捕獲后系統(tǒng)簡要顯示每個報文的標識,源、目的地址,長度和類型信息。當選中一報文時,系統(tǒng)顯示該報文的結構解析樹和完整十六進制信息。系統(tǒng)總體流程如圖2-8所示。開始得到網(wǎng)卡句柄選擇監(jiān)聽的網(wǎng)卡設置過濾器選擇數(shù)據(jù)包定位、初始化打開網(wǎng)卡接受并顯示數(shù)據(jù)分析數(shù)據(jù)包釋放設備、緩沖區(qū) 結束 圖2-8 系統(tǒng)總體流程3.2.3系統(tǒng)數(shù)據(jù)結構分析與設計系統(tǒng)每捕獲到一個數(shù)據(jù)包,就要對數(shù)據(jù)包進行協(xié)議解析。解析過程需要構造相應類型的報文對象。系統(tǒng)基于對TCP/IP協(xié)議族數(shù)據(jù)報格式的分析,對各個報文類都有詳細的描述。(1)pcap抓到都是數(shù)據(jù)鏈路層的數(shù)據(jù)包(即以太
18、幀),要對數(shù)據(jù)包進行協(xié)議分析,首先要構造以太幀頭部對象。以太幀頭部的類描述如下:/Mac幀頭 占14個字節(jié)struct ethhdru_char dest6;/6個字節(jié) 目標地址u_char src6;/6個字節(jié) 源地址u_short type;/2個字節(jié) 類型;(2)以太幀的數(shù)據(jù)部分可能是ARP數(shù)據(jù)報或者是IP數(shù)據(jù)報等等。系統(tǒng)在對其進行進一步的協(xié)議解析的過程中,就要根據(jù)以太幀頭部的類型字段進行構造相應類型的數(shù)據(jù)報對象。IP數(shù)據(jù)報的描述如下:/定義IP頭 struct iphdr#if defined(LITTLE_ENDIAN)u_char ihl:4; u_char version:4;#
19、elif defined(BIG_ENDIAN)u_char version:4;u_char ihl:4;#endifu_char tos;/TOS 服務類型u_short tlen;/包總長 u_short占兩個字節(jié)u_short id;/標識u_short frag_off;/片位移u_char ttl;/生存時間u_char proto;/協(xié)議u_short check;/校驗和u_int saddr;/源地址u_int daddr;/目的地址u_intop_pad;/選項等;ARP數(shù)據(jù)報的描述如下:/ARP頭struct arphdru_short ar_hrd;/硬件類型u_sho
20、rt ar_pro;/協(xié)議類型u_char ar_hln;/硬件地址長度u_char ar_pln;/協(xié)議地址長度u_short ar_op;/操作碼,1為請求 2為回復u_char ar_srcmac6;/發(fā)送方MACu_char ar_srcip4;/發(fā)送方IPu_char ar_destmac6;/接收方MACu_char ar_destip4;/接收方IP;(3)對IP數(shù)據(jù)報的數(shù)據(jù)部分分析可能的情況:TCP數(shù)據(jù)報、UDP數(shù)據(jù)報和ICMP數(shù)據(jù)報等。系統(tǒng)在進行協(xié)議解析時要根據(jù)IP數(shù)據(jù)報的協(xié)議字段進行構造對應類型的數(shù)據(jù)報對象。TCP數(shù)據(jù)報的描述如下:/定義TCP頭struct tcphdru
21、_short sport;/源端口地址 16位u_short dport;/目的端口地址 16位u_int seq;/序列號 32位u_int ack_seq;/確認序列號 #if defined(LITTLE_ENDIAN)u_short res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;#elif defined(BIG_ENDIAN)u_short doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;#endifu_short window;/
22、窗口大小 16位u_short check;/校驗和 16位u_short urg_ptr;/緊急指針 16位u_int opt;/選項;UDP數(shù)據(jù)報的描述如下:/定義UDP頭struct udphdru_short sport;/源端口 16位u_short dport;/目的端口 16位u_short len;/數(shù)據(jù)報長度 16位u_short check;/校驗和 16位;ICMP數(shù)據(jù)報的描述如下:/定義ICMPstruct icmphdru_char type;/8位 類型u_char code;/8位 代碼u_char seq;/序列號 8位u_char chksum;/8位校驗和;
23、四 系統(tǒng)詳細設計與實現(xiàn)4.1數(shù)據(jù)捕獲模塊的設計與實現(xiàn)數(shù)據(jù)捕獲模塊的主要功能是進行數(shù)據(jù)采集,這是整個系統(tǒng)的基礎和數(shù)據(jù)來源。系統(tǒng)使用WinPcap來捕獲網(wǎng)絡中的原始數(shù)據(jù)包。系統(tǒng)首先調用pcap_findalldevs()函數(shù),初始化網(wǎng)卡選擇界面,用戶選擇要檢測的網(wǎng)卡、設置好過濾條件并單擊”開始”菜單項(或工具欄項)后,系統(tǒng)調用pcap_open_live()函數(shù)將網(wǎng)卡設置為混雜模式。接下來,系統(tǒng)調用pcap_loop()函數(shù),循環(huán)捕獲網(wǎng)絡數(shù)據(jù)包。每捕獲一個數(shù)據(jù)包就調用設計好的回調函數(shù)來檢測數(shù)據(jù)包是否符合過濾條件,符合就給顯示界面發(fā)送信息,通知其顯示數(shù)據(jù)包信息。一旦用戶單擊”停止”菜單項(或工具欄項
24、),系統(tǒng)就調用pcap_close()函數(shù),關閉Winpcap操作,并銷毀相應資源。數(shù)據(jù)捕獲主要代碼如下:/開始捕獲int CMy44174413snifferDlg:My44174413sniffer_startCap()int if_index,filter_index,count;u_int netmask;struct bpf_program fcode;My44174413sniffer_initCap();/獲得接口和過濾器索引if_index = this->m_comboBox.GetCurSel();filter_index = this->m_comboBoxR
25、ule.GetCurSel();if(0=if_index | CB_ERR = if_index)MessageBox(_T("請選擇一個合適的網(wǎng)卡接口");return -1;if(CB_ERR = filter_index)MessageBox(_T("過濾器選擇錯誤");return -1;/*獲得選中的網(wǎng)卡接口*/dev=alldev;for(count=0;count<if_index-1;count+)dev=dev->next; if (adhandle= pcap_open_live(dev->name,/ 設備名 6
26、5536,/捕獲數(shù)據(jù)包長度 1,/ 混雜模式 (非0意味著是混雜模式) 1000,/ 讀超時設置 errbuf/ 錯誤信息 ) = NULL)MessageBox(_T("無法打開接口:"+CString(dev->description);pcap_freealldevs(alldev);return -1; 4.2協(xié)議解析模塊的設計與實現(xiàn)由于pcap每次抓到一個數(shù)據(jù)包,都會提交其信息,方式為以unsigned char* 指向的一段緩沖區(qū)?,F(xiàn)將緩沖區(qū)前14個字節(jié)讀入,按以太幀格式構造以太幀頭部的對象。然后根據(jù)以太幀頭部中的Type字段,決定接下來應該構造IP、AR
27、P或者RARP。假設是IP,那么把緩沖區(qū)中第15個字節(jié)開始直到這塊緩沖區(qū)最后的所以字節(jié)讀入,按IP報文格式構造IP的對象,根據(jù)IP的Protocol字段,決定接下來構造TCP,UDP還是ICMP。假設是TCP,則將IP的數(shù)據(jù)內容讀入,按TCP格式構造TCP的對象。系統(tǒng)首先顯示捕獲的數(shù)據(jù)包的簡要信息,若用戶對該數(shù)據(jù)包感興趣,只要單擊選中該數(shù)據(jù)包,系統(tǒng)就會顯示該數(shù)據(jù)包的詳細信息。若數(shù)據(jù)包中是IP數(shù)據(jù)報,則簡要顯示該數(shù)據(jù)包的主要代碼如下:if(0x0800 = local_data->ethh->type)/IPHTREEITEM ip = this->m_treeCtrl.Ins
28、ertItem(_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("服務類型:%d"),local_data->iph->
29、tos);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("總長度:%d"),local_data->iph->tlen);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("標識:0x%02x"),local_data->iph->id);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("段偏移:%d"),local_data->ip
30、h->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("頭部校驗和:0x%02x"),lo
31、cal_data->iph->check);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("源IP:");struct in_addr in;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_dat
32、a->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)絡中的字節(jié)順序跟主機中的字節(jié)順序是完全不一樣的,所以特別是要獲
33、得數(shù)字的值的時候,一定要先調用ntohs()函數(shù)(network to host short)或ntohl()函數(shù)(network to host long)將數(shù)據(jù)包的網(wǎng)絡字節(jié)順轉換為主機字節(jié)序,這樣在做一些判斷的時候才是準確的。由協(xié)議棧工作流程可知,數(shù)據(jù)是由應用層把數(shù)據(jù)加上應用層協(xié)議頭后給傳輸層,傳輸層在最外面加上它的頭部后給網(wǎng)絡層,網(wǎng)絡層在外面加上它的頭部后再給鏈路層所以當數(shù)據(jù)包被捕獲到之后最外面的就是鏈路層的協(xié)議頭,因此首先要解析的就是鏈路層協(xié)議,這也就是為什么首先要調用analyze_frame()這個函數(shù)了,然后再一層一層把它“剝開”,最終獲得里面的數(shù)據(jù)。每一層的上層可能有多種協(xié)議在
34、工作,比如IP上層就有TCP和UDP等之分,所以在解析數(shù)據(jù)包的時候需要根據(jù)不同的特征來判斷上層協(xié)議到底是什么,然后再來調用相關的函數(shù)對其進行解析,下面將列出一些主要的判斷特征:(1) 鏈路層-網(wǎng)絡層網(wǎng)絡層可能會有arp、ipv4、ipv6這三種不同的情況,在鏈路層定義了一個type字段,專門用于指示網(wǎng)絡層數(shù)據(jù)包是什么類型。type = 0x0806 表示這是一個arp包type = 0x0800 表示這是一個ipv4包type = 0x86dd 表示這是一個ipv6包(2) 網(wǎng)絡層(IP層)-傳輸層IP層之上可能會有tcp、udp、icmp等IPv4協(xié)議定義了proto字段來指示傳輸層協(xié)議是什
35、么。還記得上一章的Protocol.h文件中的這段定義不?proto什么值對應什么協(xié)議很明白了吧?#definePROTO_ICMP 1#define PROTO_TCP 6 #define PROTO_UDP 17 IPv6使用nh字段來標明傳輸層協(xié)議,如下:nh= 0x3a 表示上層是icmpv6nh= 0x06 表示上層是tcpnh= 0x11 表示上層是udp(3) 傳輸層之上就是應用層了,這里我們的應用層只支持http協(xié)議,判斷方法很簡單,就是看目的或源端口是不是80。余下的工作就是一個字段一個字段地獲取數(shù)據(jù)包的值了。4.3用戶界面模塊的設計與實現(xiàn)用戶設計界面如圖4-1所示:圖4-1
36、 設計界面要寫在GUI上的數(shù)據(jù)主要有五個部分:(1) 參數(shù)設置:網(wǎng)卡接口、過濾項(2) 數(shù)據(jù)包捕獲列表,顯示數(shù)據(jù)包簡要信息(3) 樹形目錄,顯示被選中的數(shù)據(jù)包頭詳細信息(4) 文本框,顯示被選中的數(shù)據(jù)包十六進制信息(5) 統(tǒng)計信息:各類包的數(shù)量4.3.1控件寫數(shù)據(jù)的基本操作由于我們選擇的是對話框的形式的界面,所以主界面只有一個,放置在主界面上的各個控件都可以通過主界面的this指針調用,并設置控件的值,例如: this->m_listCtrl.SetItemText(nItem,2,buf);其中m_listCtrl是放置于主界面上的一個列表控件,各種控件上的數(shù)據(jù)也就基本通過這樣的方式調
37、用。程序中我們新開了一個線程來處理數(shù)據(jù),線程中每收到一個數(shù)據(jù)包都需要更新一下界面,這樣就可以實時看到捕獲的數(shù)據(jù)及統(tǒng)計信息了,這需要我們把主界面的this指針傳遞給線程,如下: m_ThreadHandle=CreateThread(NULL,0,sinffer_CapThread,this,0,threadCap);線程處理函數(shù)原型如下: DWORD WINAPI sinffer_CapThread(LPVOID lpParameter);這里的lpParameter就是剛剛傳遞進來的this指針了,在函數(shù)中使用如下: Cmcf6Dlg*pthis = (Cmcf6Dlg*) lpParame
38、ter;4.3.2 根據(jù)不同協(xié)議顯示不同顏色從圖4-2可以看到,List控件有一個事件是NM_CUSTOMDRAW,每次有新的一行加入的時候,都觸發(fā)該事件,然后調用相關的處理函數(shù)進行自定義繪制,可以注冊一個該事件。圖4-2首先通過下面這段代碼獲得新加入到List列表中的數(shù)據(jù)位置POSITION pos = this->m_localDataList.FindIndex(pNMCD->nmcd.dwItemSpec);然后通過下面代碼獲得新加入行中存儲的數(shù)據(jù)structdatapkt * local_data = (struct datapkt *)this->m_localD
39、ataList.GetAt(pos);最后根據(jù)數(shù)據(jù)中對應的協(xié)議設置不同的顯示顏色。這樣,一個界面友好的列表就設置好了。4.3.3對數(shù)據(jù)格式化顯示主要通過下面這個函數(shù)實現(xiàn),下面這個函數(shù)主要做了兩件事:(1)將數(shù)據(jù)是16進制的形式顯示;(2)將數(shù)據(jù)以字符形式顯示。void print_packet_hex(const u_char* pkt,int size_pkt,CString *buf)int i=0,j = 0,rowcount; u_char ch; char tempbuf256; memset(tempbuf,0,256);for(i = 0;i<size_pkt;i+=16)
40、buf->AppendFormat(_T("%04x: "),(u_int)i);rowcount = (size_pkt-i) > 16 ? 16 : (size_pkt-i);for (j = 0; j < rowcount; j+)buf->AppendFormat(_T("%02x "),(u_int)pkti+j);/不足16,用空格補足if(rowcount <16)for(j=rowcount;j<16;j+)buf->AppendFormat(_T(" ");for (j =
41、0; j < rowcount; j+) ch = pkti+j; ch = isprint(ch) ? ch : '.' buf->AppendFormat(_T("%c"),ch);buf->Append(_T("rn");if(rowcount<16)return;選中報文時運行效果如圖4-3所示。圖4-3 運行界面五 結語本次程序是在WinPcap庫的基礎上對網(wǎng)絡數(shù)據(jù)進行捕獲,不需要編寫復雜的設備驅動程序和代碼就可以實現(xiàn)抓包,使得其編寫過程比較簡便、有效率。從選擇抓包程序,到查閱資料,思考課題的解決的方案,
42、再到程序的實現(xiàn),是一個集中學習的過程,是一個靈活運用知識的過程,是一個由量變到質變的過程。感覺到自己進步了,感覺到自己學到一些東西了,感覺到自己求知的態(tài)度了。在編寫程序的過程中,我每每為自己的一些新的感悟而欣喜,為排除每一個錯誤而興奮。編程序需要功夫,調試程序更需要有耐心和技巧。期間,我不斷地拓展自己的思路,盡可能地為程序添加新的功能,當然,這中間是少不了錯誤的發(fā)生的。也正是在編寫一調試一再編寫的過程中,我理解了MFC框架機制,知道了如何在程序中添加自己的代碼,如何自定義自己的消息,如何實現(xiàn)多線程的運行。就最終的成果而言,程序實現(xiàn)了抓包的基本功能,通過對過濾條件的設置,實現(xiàn)了對特定源和目的IP
43、地址、端口的數(shù)據(jù)包的捕獲,并顯示數(shù)據(jù)包的內容,諸如協(xié)議類型、長度、時間戳等信息等。隨著網(wǎng)絡技術的迅猛發(fā)展,網(wǎng)絡安全將被人們越來越重視,抓包技術作為網(wǎng)絡安全攻防中最基礎的技術,抓包工具的發(fā)展將向著集成化和易用型發(fā)展這兩個方向發(fā)展,我相信這也是絕大部分軟件的發(fā)展趨勢。網(wǎng)絡安全是我們絕大部分人必須警惕關注的一個問題,當今社會信息流通量越來越大,高科技人才也越來越多,高頻率的網(wǎng)絡犯罪讓人們防不勝防。我們不但要正確使用抓包工具.還要合理防范抓包工具的危害。抓包工具能夠造成很大的安全危害,主要是因為它們不容易被發(fā)現(xiàn)。鑒于目前的網(wǎng)絡安全現(xiàn)狀,我們應該進一步挖掘網(wǎng)絡監(jiān)聽技術的細節(jié),從技術基礎上掌握先機,才能在
44、與入侵者的斗爭中取得勝利。六 附錄6.1 參考文獻1謝小特,王勇軍.基于WinPcap的捕包程序設計J.軟件導刊2007,(21)2The WinPcap Team.WinPcap 中文技術文檔J/OL.2007. 3趙輝,葉子青VisualC+系統(tǒng)開發(fā)實例精粹M北京:人民郵電出版社,20054吳功宜,董大凡,王珺等.計算機網(wǎng)絡高級軟件編程技術M北京:清華大學出版社,20086.2主要函數(shù)代碼/初始化winpcapint CMy44174413snifferDlg:My44174413sniffer_initCap()devCount = 0;if(pcap_findalldevs(&
45、alldev, errbuf) =-1)return -1;for(dev=alldev;dev;dev=dev->next)devCount+;return 0;DWORD WINAPI sniffer_CapThread(LPVOID lpParameter)int res,nItem ;struct tm *ltime;CString timestr,buf,srcMac,destMac;time_t local_tv_sec;struct pcap_pkthdr *header; /數(shù)據(jù)包頭const u_char *pkt_data=NULL,*pData=NULL; /網(wǎng)絡中
46、收到的字節(jié)流數(shù)據(jù)u_char *ppkt_data;CMy44174413snifferDlg *pthis = (CMy44174413snifferDlg*) lpParameter;if(NULL = pthis->m_ThreadHandle)MessageBox(NULL,_T("線程句柄錯誤"),_T("提示"),MB_OK);return -1;while(res = pcap_next_ex( pthis->adhandle, &header, &pkt_data) >= 0)if(res = 0)/超時
47、continue;struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt);memset(data,0,sizeof(struct datapkt);if(NULL = data)MessageBox(NULL,_T("空間已滿,無法接收新的數(shù)據(jù)包"),_T("Error"),MB_OK);return -1; /分析出錯或所接收數(shù)據(jù)包不在處理范圍內if(analyze_frame(pkt_data,data,&(pthis->npacket)<0)co
48、ntinue; /將數(shù)據(jù)包保存到打開的文件中if(pthis->dumpfile!=NULL)pcap_dump(unsigned char*)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.
49、AddTail(data);pthis->m_netDataList.AddTail(ppkt_data);/*預處理,獲得時間、長度*/data->len = header->len;/鏈路中收到的數(shù)據(jù)長度local_tv_sec = header->ts.tv_sec;ltime = localtime(&local_tv_sec);data->time0 = ltime->tm_year+1900;data->time1 = ltime->tm_mon+1;data->time2 = ltime->tm_mday;dat
50、a->time3 = ltime->tm_hour;data->time4 = ltime->tm_min;data->time5 = 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"),da
51、ta->time0,data->time1,data->time2,data->time3,data->time4,data->time5);pthis->m_listCtrl.SetItemText(nItem,1,timestr);/pthis->m_listCtrl.setitem/*顯示長度*/buf.Empty();buf.Format(_T("%d"),data->len);pthis->m_listCtrl.SetItemText(nItem,2,buf);/*顯示源MAC*/buf.Empty();
52、buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src0,data->ethh->src1,data->ethh->src2,data->ethh->src3,data->ethh->src4,data->ethh->src5);pthis->m_listCtrl.SetItemText(nItem,3,buf);/*顯示目的MAC*/buf.Empty();buf.Format(_T("%02X-%02X-%02X-
53、%02X-%02X-%02X"),data->ethh->dest0,data->ethh->dest1,data->ethh->dest2,data->ethh->dest3,data->ethh->dest4,data->ethh->dest5);pthis->m_listCtrl.SetItemText(nItem,4,buf);/*獲得協(xié)議*/pthis->m_listCtrl.SetItemText(nItem,5,CString(data->pktType);/*獲得源IP*/buf
54、.Empty();if(0x0806= data->ethh->type)buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip0,data->arph->ar_srcip1,data->arph->ar_srcip2,data->arph->ar_srcip3);else if(0x0800 = data->ethh->type) struct in_addr in;in.S_un.S_addr = data->iph->saddr;buf = CString(inet_ntoa(in);else if(0x86dd =data->ethh->type )int n;for(n=0;n<8;n+)if(n<=6)buf.AppendFormat(_T("%02
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特效教學課程設計
- 2024年智慧農業(yè)示范園農產(chǎn)品種植技術服務及推廣協(xié)議3篇
- 2024年度新能源項目第三方抵押擔保合同3篇
- 2024年度文化傳承師徒合作協(xié)議范本3篇
- 2024年度高端住宅項目全過程工程咨詢合同范本3篇
- 簡易plc課程設計
- 2024年汽車維修行業(yè)維修工勞動合同范本含安全責任書3篇
- 2024年度擔保銷售合同模板參考:家居裝修3篇
- 水文鉆探課程設計
- 環(huán)境管理課程設計
- 米諾環(huán)素治療痤瘡進展課件
- 三相異步交流電動機的直接啟動試驗報告(五篇)
- 電子商務概論題庫(250道)
- 一年級數(shù)學認識鐘表-空白表盤圖(每張20圖)
- 移動互聯(lián)網(wǎng)的實訓報告優(yōu)秀三篇
- 父愛深深 閱讀附答案
- 讀書分享 《被討厭的勇氣》
- 急性呼吸衰竭的診斷和處理
- GB/T 9846.4-2004膠合板第4部分:普通膠合板外觀分等技術條件
- 2021屆虹口區(qū)高三英語一模
- GB/T 337.1-2014工業(yè)硝酸濃硝酸
評論
0/150
提交評論