




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)學(xué)院:信息科學(xué)與工程學(xué)院專業(yè)__指導(dǎo)張士庚____目錄一、實(shí)驗(yàn)要求2二、實(shí)驗(yàn)?zāi)康?三、相關(guān)知識(shí)33.1、IP包格式:33.2、TCP包格式73.3、UDP數(shù)據(jù)包103.4、IP、TCP、UDP的關(guān)系113.5、套接字12四、課程設(shè)計(jì)分析134.1網(wǎng)卡設(shè)置134.2使用套接字134.3接收數(shù)據(jù)包144.4定義IP頭部的數(shù)據(jù)結(jié)構(gòu)144.5IP包的解析164.6協(xié)議的定義164.7捕獲處理16五、實(shí)驗(yàn)截圖17六、源程序代碼及分析17七、總結(jié)24八、課程設(shè)計(jì)參考資料25實(shí)驗(yàn)要求網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn):基本要求捕獲本網(wǎng)段的數(shù)據(jù)包,將報(bào)文結(jié)構(gòu)顯示出來(lái).進(jìn)一步要求進(jìn)行數(shù)據(jù)包協(xié)議分析,可以按報(bào)頭進(jìn)行統(tǒng)計(jì),提取部分關(guān)鍵信息,如捕獲登陸信息,破解登陸密碼等.實(shí)驗(yàn)?zāi)康牧私夂驼莆詹东@網(wǎng)絡(luò)中ip包的方法,了解ip、tcp、udp等包的結(jié)構(gòu)??捎脀insock或winpcap來(lái)完成嗅探器的設(shè)計(jì)。本次實(shí)驗(yàn)用socket〔套接字在vc6.0上進(jìn)行編程。相關(guān)知識(shí)3.1、IP包格式:互聯(lián)網(wǎng)絡(luò)層是TCP/IP協(xié)議參考模型中的關(guān)鍵部分.IP協(xié)議把傳輸層送來(lái)的消息組裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳送給數(shù)據(jù)鏈層.IP協(xié)議在TCP/IP協(xié)議族中處于核心地位,IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)包格式,以消除個(gè)通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對(duì)IP包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.IP數(shù)據(jù)包的第一個(gè)字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對(duì)版本是IPV4的數(shù)據(jù)包的解析.報(bào)頭標(biāo)長(zhǎng)字段為4位,它定義了以4B為一個(gè)單位的IP包的報(bào)文長(zhǎng)度.報(bào)頭中除了選項(xiàng)字段和填充域字段外,其他各字段是定長(zhǎng)的.因此,IP數(shù)據(jù)包的頭長(zhǎng)度在20—40B之間,是可變的.04816192431版本首部長(zhǎng)度區(qū)分服務(wù)總長(zhǎng)度標(biāo)識(shí)標(biāo)志片偏移生存時(shí)間協(xié)議頭校驗(yàn)和源IP地址目的地址選項(xiàng)填充域數(shù)據(jù)部分圖1IP數(shù)據(jù)包的格式服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長(zhǎng)度由4位服務(wù)類型<TOS>子域和3位優(yōu)先級(jí)子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示.B7b6b5b4b3b2b1b0優(yōu)先級(jí)DTRC0圖2服務(wù)類型字段結(jié)構(gòu)優(yōu)先級(jí)共有8種,優(yōu)先級(jí)越高表明數(shù)據(jù)包越重要.表1中列出了各種優(yōu)先級(jí)所代表的意義.表一優(yōu)先子域的說(shuō)明位數(shù)<b7b6b5>意義111網(wǎng)絡(luò)控制110網(wǎng)絡(luò)間控制重要<CRITIC/ECP>100即時(shí),優(yōu)先011即時(shí)010立刻001優(yōu)先000普通在4位服務(wù)類型子域中b4,b3,b2,b1分別表示D<延遲>,T<吞吐量>,R<可靠性>與C<成本>.表2列出了服務(wù)器類型自域的構(gòu)成.位數(shù)<b4b3b2b1>意義1111安全級(jí)最高1000延遲最小0100吞吐量最大0001金錢成本最小0000普通服務(wù)總長(zhǎng)度字段為2B,它定義了以字節(jié)為單位的數(shù)據(jù)包的總長(zhǎng)度.IP數(shù)據(jù)包的最大長(zhǎng)度為65535B.標(biāo)識(shí)字段的長(zhǎng)度為16位,用于識(shí)別IP數(shù)據(jù)包的編號(hào).每批數(shù)據(jù)都要有一個(gè)標(biāo)識(shí)值,用于讓目的主機(jī)判斷新來(lái)的數(shù)據(jù)屬于哪個(gè)分組.報(bào)頭中的標(biāo)志字段如圖7-3所示.標(biāo)志字段共3位,最高位是0.禁止分片標(biāo)志DF<donotfragment>字段的值若為1,表示不能對(duì)數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片標(biāo)志MF< morefragment>的值為1,表示接收到的不是最后一個(gè)分片;若MF值為0,表示接收到的是最后一個(gè)分片.片偏移字段共13位,說(shuō)明分片在整個(gè)數(shù)據(jù)包中的相對(duì)位置.片偏移值是以8B為單位來(lái)記數(shù)的,因此選擇的分片長(zhǎng)度應(yīng)該是8B的整數(shù)倍.生存時(shí)間<TTL>字段為8位,用來(lái)設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過(guò)程的壽命,通常是用一個(gè)數(shù)據(jù)包可以經(jīng)過(guò)的最多的路由器跳步數(shù)來(lái)限定的.協(xié)議字段為8位,表示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號(hào)如表3所示.序號(hào)協(xié)議名稱序號(hào)協(xié)議名稱12468ICMPIGMPIPinIPTCPEGP17414689UDPIPV6RSVPOSPFA表3典型的協(xié)議號(hào)頭校驗(yàn)和字段為16位,用于存放檢查報(bào)頭錯(cuò)誤的校驗(yàn)碼。檢驗(yàn)的范圍是整個(gè)IP包的報(bào)頭。校驗(yàn)和按如下方法計(jì)算:1將頭校驗(yàn)和的字段置為0。2將報(bào)頭部分的所有數(shù)據(jù)以16位為單位進(jìn)行累加,累加方式是求異或。3將累加的結(jié)果取反碼,就是頭校驗(yàn)和。當(dāng)收到一個(gè)IP包時(shí),要檢查報(bào)頭是否出錯(cuò),就把報(bào)頭中的所有數(shù)據(jù)以16位為單位進(jìn)行累加,若累加的結(jié)果為0,則報(bào)文沒(méi)有出錯(cuò)。地址字段包括源地址和目的地址。源地址和目的地址的長(zhǎng)度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機(jī)和目的主機(jī)的IP地址。選項(xiàng)字段的長(zhǎng)度范圍為0~40B,主要用于控制和測(cè)試。在使用選項(xiàng)字段的過(guò)程中,有可能出現(xiàn)報(bào)頭部分的長(zhǎng)度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過(guò)填充位來(lái)湊齊。3.2、TCP包格式TCP<TransportControlProtocol>傳輸控制協(xié)議:TCP數(shù)據(jù)包的分組格式:源端口:標(biāo)識(shí)源端應(yīng)用進(jìn)程。目的端口:標(biāo)識(shí)目的端應(yīng)用進(jìn)程。序號(hào):在SYN標(biāo)志未置位時(shí),該字段指示了用戶數(shù)據(jù)區(qū)中第一個(gè)字節(jié)的序號(hào);在SYN標(biāo)志置位時(shí),該字段指示的是初始發(fā)送的序列號(hào)。確認(rèn)號(hào):用來(lái)確認(rèn)本端TCP實(shí)體已經(jīng)接收到的數(shù)據(jù),其值表示期待對(duì)端發(fā)送的下一個(gè)字節(jié)的序號(hào),實(shí)際上告訴對(duì)方,在這個(gè)序號(hào)減1以前的字節(jié)已正確接收。數(shù)據(jù)偏移:表示以32位字為單位的TCP分組頭的總長(zhǎng)度,用于確定用戶數(shù)據(jù)區(qū)的起始位置。URG:緊急指針字段有效。ACK:確認(rèn)好有效。PSH:Push操作。TCP分組長(zhǎng)度不定,為提高傳輸速率,往往要收集到足夠的數(shù)據(jù)后才發(fā)送。這種方式不適合實(shí)時(shí)性要求很高的應(yīng)用,因此,TCP提供"Push"操作,以強(qiáng)迫傳輸當(dāng)前的數(shù)據(jù),不必等待緩沖區(qū)滿才傳輸。RST:連接復(fù)位,重新連接。SYN:同步序號(hào),該比特置位表示連接建立分組。FIN:字符串發(fā)送完畢,沒(méi)有其它數(shù)據(jù)需要發(fā)送,該比特置位表示連接確認(rèn)分組。窗口:?jiǎn)挝皇亲止?jié),指明該分組的發(fā)送端愿意接收的從確認(rèn)字段中的值開始的字節(jié)數(shù)量。校驗(yàn)和:對(duì)TCP分組的頭部和數(shù)據(jù)進(jìn)行校驗(yàn)。緊急指針:指出窗口中緊急數(shù)據(jù)的位置〔從分組序號(hào)開始的正向位移,指向緊急數(shù)據(jù)的最后一個(gè)字節(jié),這些緊急數(shù)據(jù)應(yīng)優(yōu)先于其它的數(shù)據(jù)進(jìn)行傳輸。任選項(xiàng):用于處理一些特殊情況。目前被正式使用的選項(xiàng)字段可用于定義通信過(guò)程中的最大分組長(zhǎng)度,只能在連接建立時(shí)使用。填充:用于保證任選項(xiàng)為32bit的整數(shù)倍。
TCP三次握手機(jī)制:第一次握手:客戶端發(fā)送一個(gè)SYN〔包含有同步序列號(hào)的標(biāo)志位的數(shù)據(jù)段和通信請(qǐng)求給服務(wù)器,然后等待服務(wù)器的回發(fā)確認(rèn)信息第二次握手:服務(wù)器發(fā)送一個(gè)SYN-ACK給客戶端,確認(rèn)已經(jīng)收到客戶端發(fā)來(lái)的信息第三次握手:客戶端接收到服務(wù)器發(fā)來(lái)的確認(rèn)信息后,再回饋一個(gè)ACK給服務(wù)器,此時(shí)就可與服務(wù)器建立可靠的連接ACK:TCP數(shù)據(jù)包首部中的確認(rèn)標(biāo)志,對(duì)已接收到的TCP報(bào)文進(jìn)行確認(rèn)。SYN:SYN是TCP/IP建立連接時(shí)使用的握手信號(hào)。3.3、UDP數(shù)據(jù)包UDP<UserDatagramProtocol>用戶數(shù)據(jù)報(bào)協(xié)議:UDP首部字段由4個(gè)部分組成,其中兩個(gè)是可選的。各16bit的來(lái)源端口和目的端口用來(lái)標(biāo)記發(fā)送和接受的應(yīng)用進(jìn)程。因?yàn)閁DP不需要應(yīng)答,所以來(lái)源端口是可選的,如果來(lái)源端口不用,那么置為零。在目的端口后面是長(zhǎng)度固定的以字節(jié)為單位的長(zhǎng)度域,用來(lái)指定UDP數(shù)據(jù)報(bào)包括數(shù)據(jù)部分的長(zhǎng)度,長(zhǎng)度最小值為8byte。首部剩下地16bit是用來(lái)對(duì)首部和數(shù)據(jù)部分一起做校驗(yàn)和〔Checksum的,這部分是可選的,但在實(shí)際應(yīng)用中一般都使用這一功能。UDP數(shù)據(jù)報(bào)格式有首部和數(shù)據(jù)兩個(gè)部分。首部很簡(jiǎn)單,共8字節(jié)。包括:源端口〔SourcePort:2字節(jié),源端口號(hào)。目的端口〔DestinationPort:2字節(jié),目的端口號(hào)。長(zhǎng)度〔Length:2字節(jié),UDP用戶數(shù)據(jù)報(bào)的總長(zhǎng)度,以字節(jié)為單位。檢驗(yàn)和〔Checksum:2字節(jié),用于校驗(yàn)UDP數(shù)據(jù)報(bào)的數(shù)字段和包含UDP數(shù)據(jù)報(bào)首部的"偽首部"。其校驗(yàn)方法同IP分組首部中的首部校驗(yàn)和。與TCP包的不同之處:
無(wú)需三次握手四次斷開,傳輸速度相對(duì)于TCP極快,不確定性,甚至可以不需要應(yīng)答,沒(méi)有TCP數(shù)據(jù)包的安全性,有丟包現(xiàn)象。3.4、IP、TCP、UDP的關(guān)系TCP/IP協(xié)議棧主要分為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層,每層都有相應(yīng)的協(xié)議,如下圖所謂的協(xié)議就是雙方進(jìn)行數(shù)據(jù)傳輸?shù)囊环N格式。整個(gè)網(wǎng)絡(luò)中使用的協(xié)議有很多,所幸的是每一種協(xié)議都有RFC文檔。在這里只對(duì)IP、TCP、UDP協(xié)議頭做一個(gè)分析。
IP協(xié)議是TCP/IP協(xié)議族中最為核心的協(xié)議。它提供不可靠、無(wú)連接的服務(wù),也即依賴其他層的協(xié)議進(jìn)行差錯(cuò)控制。在局域網(wǎng)環(huán)境,IP協(xié)議往往被封裝在以太網(wǎng)幀〔見(jiàn)本章1.3節(jié)中傳送。而所有的TCP、UDP、ICMP、IGMP數(shù)據(jù)都被封裝在IP數(shù)據(jù)報(bào)中傳送。如圖2-3所示:TCP/IP報(bào)文封裝3.5、套接字在每個(gè)TCP、UDP數(shù)據(jù)段中都包含源端口和目標(biāo)端口字段。有時(shí),我們把一個(gè)IP地址和一個(gè)端口號(hào)合稱為一個(gè)套接字〔Socket,而一個(gè)套接字對(duì)〔Socketpair可以唯一地確定互連網(wǎng)絡(luò)中每個(gè)TCP連接的雙方〔客戶IP地址、客戶端口號(hào)、服務(wù)器IP地址、服務(wù)器端口號(hào)。常見(jiàn)協(xié)議和對(duì)應(yīng)的端口號(hào)需要注意的是,不同的應(yīng)用層協(xié)議可能基于不同的傳輸層協(xié)議,如FTP、TELNET、SMTP協(xié)議基于可靠的TCP協(xié)議。TFTP、SNMP、RIP基于不可靠的UDP協(xié)議。同時(shí),有些應(yīng)用層協(xié)議占用了兩個(gè)不同的端口號(hào),如FTP的20、21端口,SNMP的161、162端口。這些應(yīng)用層協(xié)議在不同的端口提供不同的功能。如FTP的21端口用來(lái)偵聽用戶的連接請(qǐng)求,而20端口用來(lái)傳送用戶的文件數(shù)據(jù)。再如,SNMP的161端口用于SNMP管理進(jìn)程獲取SNMP代理的數(shù)據(jù),而162端口用于SNMP代理主動(dòng)向SNMP管理進(jìn)程發(fā)送數(shù)據(jù)。還有一些協(xié)議使用了傳輸層的不同協(xié)議提供的服務(wù)。如DNS協(xié)議同時(shí)使用了TCP53端口和UDP53端口。DNS協(xié)議在UDP的53端口提供域名解析服務(wù),在TCP的53端口提供DNS區(qū)域文件傳輸服務(wù)。課程設(shè)計(jì)分析4.1網(wǎng)卡設(shè)置為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里使用套接字<socket>進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對(duì)于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取與自己無(wú)關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。4.2使用套接字套接字分為三種,即流套接字<Streamsocket>、數(shù)據(jù)報(bào)套接字<DatagramSocket>和原始套接字<RawSocket>。要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:
Socketsock;
sock=socket<AF_INET,SOCK_RAW,IPPROTO_IP>;本設(shè)計(jì)不用考慮超時(shí)情況。創(chuàng)建套接后,IP頭就會(huì)包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項(xiàng),調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP-HDRINCL選項(xiàng),表明用戶可以親自對(duì)IP頭進(jìn)行處理。最后使用bind<>函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl<>函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡(luò)數(shù)據(jù)。如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過(guò)的IP包。4.3接收數(shù)據(jù)包在程序中可使用recv<>函數(shù)接收經(jīng)過(guò)的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收操作所用的套接字描述符;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對(duì)所發(fā)送的數(shù)據(jù)沒(méi)特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長(zhǎng)度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來(lái)反復(fù)監(jiān)聽接收IP包,用recv<>函數(shù)實(shí)現(xiàn)接收功能。4.4定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下:/*定義IP頭部數(shù)據(jù)結(jié)構(gòu)*/typedefstruct_IP_HEADER{ union{ BYTEVersion;//版本〔前4位 BYTEHdrLen;//報(bào)頭標(biāo)長(zhǎng)〔后四位,IP頭長(zhǎng)度 }; BYTEServiceType;//服務(wù)類型 WORDTotalLen;//總長(zhǎng)度 WORDID;//標(biāo)識(shí) union{ WORDFlags; WORDFragOff; }; BYTETimeToLive; BYTEProtocol; WORDHdrChksum; DWORDSrcAddr; DWORDDstAddr; BYTEOptions;}IP_HEADER;4.5IP包的解析解析IP包的字段有兩種策略。針對(duì)長(zhǎng)度為8位、16位和32位的字段<或子字段>時(shí),可以利用IP-HEADER的成員直接獲取。要解析長(zhǎng)度不是8位倍數(shù)的字段<或子字段>時(shí),可以利用C語(yǔ)言中的移位以人、及與、或操作完成。4.6協(xié)議的定義<包含相應(yīng)的頭文件#include#include:
DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/
dwProtocol=IPPROTO_IP;/*協(xié)議類型為IP*/4.7捕獲處理1.加載Winsock;2.創(chuàng)建一個(gè)接收原始IP包的socket連接;
3.綁定到一個(gè)接口;
4.進(jìn)行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:
if<WSAIoctl<s,dwIoControlCode,&optval,sizeof<optval>,
NULL,0,&dwBytesRet,NULL,NULL>==SOCKET_ERROR>
5.接著設(shè)定一個(gè)線程進(jìn)行捕獲:
〔1創(chuàng)建一個(gè)接收IP包的鏈表頭;
〔2設(shè)置一個(gè)標(biāo)識(shí),為真,則不斷進(jìn)行IP包的捕獲;
〔3建立一個(gè)新的結(jié)點(diǎn),將捕獲的數(shù)據(jù)包加入到該結(jié)點(diǎn);
〔4如果鏈表的長(zhǎng)度達(dá)到指定的長(zhǎng)度,創(chuàng)建一個(gè)線程對(duì)該鏈表的IP包進(jìn)行解析;再設(shè)置一個(gè)在IP數(shù)據(jù)包鏈表不足給定的長(zhǎng)度,而又中止IP捕獲時(shí),對(duì)鏈表的處理;
〔5為下一個(gè)IP包鏈表創(chuàng)建一個(gè)鏈表頭。
實(shí)驗(yàn)截圖源程序代碼及分析#include"winsock2.h"#include"ws2tcpip.h"#include"iostream.h"#include"stdio.h"#include"fstream.h"#pragmacomment<lib,"ws2_32.lib">//TCP數(shù)據(jù)包解析函數(shù)intDecodeTcpPack<char*>;//UDP數(shù)據(jù)包解析函數(shù)intDecodeUdpPack<char*>;//ICMP數(shù)據(jù)包解析函數(shù)intDecodeIcmpPack<char*>;//顯示數(shù)據(jù)包信息voidShowSubPackInfo<char*buf,BYTEProtocol>;/*定義IP頭部數(shù)據(jù)結(jié)構(gòu)*/typedefstructIP_HEADER{//union//{//BYTEVersion;//版本〔前四位//BYTEHdrLen;//報(bào)頭標(biāo)長(zhǎng)〔后四位,IP頭長(zhǎng)度//};unsignedcharh_verlen;//版本和報(bào)頭標(biāo)長(zhǎng)BYTEServiceType;//服務(wù)類型WORDTotalLen;//總長(zhǎng)度WORDID;//標(biāo)識(shí)union{WORDFlags;//標(biāo)志W(wǎng)ORDFragOff;//片偏移};BYTETimeToLive;//生存時(shí)間BYTEProtocol;//協(xié)議WORDHdrChksum;//首部檢驗(yàn)和DWORDSrcAddr;//源地址DWORDDstAddr;//目的地址BYTEOptions;//選項(xiàng)}IP_HEADER;//定義TCP首部格式typedefstruct_TCPHeader{unsignedshortth_sport;//源端口號(hào)unsignedshortth_dport;//目的端口號(hào)unsignedintth_seq;//SEQ序號(hào)unsignedintth_ack;//ACK序號(hào)unsignedcharth_lenres;//首部長(zhǎng)度unsignedcharth_flag;//控制位unsignedshortth_win;//窗口大小unsignedshortth_sum;//校驗(yàn)和unsignedshortth_urp;//緊急指針}TCPHEADER;//定義UDP首部格式typedefstruct_UDPHeader{ unsignedshortuh_sport;//16位源端口 unsignedshortuh_dport;//16位目的端口 unsignedshortuh_len;//16位長(zhǎng)度 unsignedshortuh_sum;//16位校驗(yàn)和}UDPHEADER;//定義ICMP首部格式typedefstruct_ICMPHeader{ BYTEi_type;//8位類型 BYTEi_code;//8位代碼 unsignedshorti_cksum;//16位校驗(yàn)和 unsignedshorti_id;//識(shí)別號(hào) unsignedshorti_seq;//報(bào)文序列號(hào) unsignedlongtimestamp;//時(shí)間戳}ICMPHEADER;//根據(jù)協(xié)議號(hào)獲取協(xié)議類型char*getProtocol<BYTEProtocol>{ switch<Protocol> { case1: return"ICMP"; case2: return"IGMP"; case4: return"IPinIP"; case6: return"TCP"; case8: return"EGP"; case17: return"UDP"; case41: return"IPv6"; case46: return"RSVP"; case89: return"OSPF"; default: return"UNKNOW"; }}/*解析IP數(shù)據(jù)包*/voidipparse<FILE*file,char*buffer>{IP_HEADERip=*<IP_HEADER*>buffer;//fseek<file,0,SEEK_END>;//ShowSubPackInfo<char*buf,intiProtocol>;cout<<"生存期協(xié)議源IP地址目的IP地址總長(zhǎng)度"<<endl;cout<<<int>ip.TimeToLive<<""<<getProtocol<ip.Protocol><<""<<inet_ntoa<*<in_addr*>&ip.SrcAddr><<">"<<inet_ntoa<*<in_addr*>&ip.DstAddr><<""<<ip.TotalLen<<endl;intiIpLen=sizeof<unsignedlong>*<ip.h_verlen&0xf>;ShowSubPackInfo<buffer+iIpLen,ip.Protocol>;cout<<"***************************************************************************"<<endl;}//顯示子協(xié)議數(shù)據(jù)包信息voidShowSubPackInfo<char*buf,BYTEProtocol>{//charProtocol=getProtocol<BYTEProtocol>; switch<Protocol> { case6://TCP數(shù)據(jù)包 DecodeTcpPack<buf>; break; case17://UDP數(shù)據(jù)包 DecodeUdpPack<buf>; break; case1://ICMP數(shù)據(jù)包 DecodeIcmpPack<buf>; break; default: cout<<"unknown"<<endl; break; }}下面程序是實(shí)現(xiàn)解析TCP數(shù)據(jù)包函數(shù)的部分代碼。參數(shù)TcpBuf是輸入的TCP首部和數(shù)據(jù)段的頭指針。程序流程是:首先將TcpBuf轉(zhuǎn)換成TCP首部格式。然后輸出TCP首部中的源端口號(hào)th_sport和目的端口號(hào)th_dport。最后采用循環(huán)與位的方法輸出TCP首部中的標(biāo)志位。//TCP解包函數(shù)intDecodeTcpPack<char*TcpBuf>{ TCPHEADER*pTcpHeader;// chardata[MAX_PACK_LEN];// inti; //轉(zhuǎn)換成TCP首部格式 pTcpHeader=<TCPHEADER*>TcpBuf; //輸出源端口和目的端口 cout<<""<<"源端口目的端口"<<endl<<""<<ntohs<pTcpHeader->th_sport><<">"<<ntohs<pTcpHeader->th_dport><<endl;returntrue;}下面程序是實(shí)現(xiàn)了解析UDP數(shù)據(jù)包的功能函數(shù)。參數(shù)UdpBuf表示輸入的UDP數(shù)據(jù)首部和數(shù)據(jù)段。程序流程是:首先將輸入?yún)?shù)UdpBuf轉(zhuǎn)換成UDP首部格式,然后輸出UDP首部格式中的源端口號(hào)uh_sport,目的端口號(hào)uh_dport和數(shù)據(jù)長(zhǎng)度uh_len。最后和TCP解析函數(shù)一樣對(duì)關(guān)鍵字進(jìn)行查找和輸出。//UDP解包函數(shù)intDecodeUdpPack<char*UdpBuf>{ UDPHEADER*pUdpHeader; //chardata[MAX_PACK_LEN]; pUdpHeader=<UDPHEADER*>UdpBuf; //輸出端口 cout<<""<<"源端口目的端口"<<endl<<""<<ntohs<pUdpHeader->uh_sport><<">"<<ntohs<pUdpHeader->uh_dport><<endl;returntrue;}下面程序是實(shí)現(xiàn)了解析ICMP數(shù)據(jù)包的功能函數(shù)。參數(shù)IcmpBuf表示輸入的ICMP首部和數(shù)據(jù)段。程序流程是:首先將輸入?yún)?shù)IcmpBuf轉(zhuǎn)換成ICMP首部格式。然后輸出ICMP首部中的類型碼Type。最后輸出首部格式中的識(shí)別號(hào)ID和報(bào)文序列號(hào)SEQ。//ICMP解包函數(shù)intDecodeIcmpPack<char*IcmpBuf>{ ICMPHEADER*pIcmpHeader; pIcmpHeader=<ICMPHEADER*>IcmpBuf; //輸出ICMP數(shù)據(jù)包類型、ID和SEQ printf<"Type:%d,%d",pIcmpHeader->i_type,pIcmpHeader->i_code>; printf<"ID=%dSEQ=%d\n",pIcmpHeader->i_id,pIcmpHeader->i_seq>; returntrue;}下面程序是實(shí)現(xiàn)嗅探功能的主函數(shù)部分代碼。程序流程是:調(diào)用WSAStartup函數(shù)初始化Winsock庫(kù)。然后調(diào)用socket函數(shù)創(chuàng)建原始套接字,并且調(diào)用gethostname函數(shù)和gethostname函數(shù)獲得本機(jī)上IP地址,同時(shí)設(shè)置本地監(jiān)聽端口號(hào)為6000.最后調(diào)用bind函數(shù)將本地地址結(jié)構(gòu)綁定在套接字上。然后調(diào)用WSAIoctl函數(shù)設(shè)置原始套接字接受所有的數(shù)據(jù)包,主要是將函數(shù)的第二個(gè)參數(shù)設(shè)置為SIO_RCVALL。開始無(wú)限循環(huán)調(diào)用recv函數(shù)接收Hub上所有的數(shù)據(jù)包。最后對(duì)接收到的數(shù)據(jù)包調(diào)用ipparse函數(shù)進(jìn)行解析。//主程序開始main<>{ intnRetCode=0; { WSADATAwsData;/*啟動(dòng)2.2版本的Socket,并將Socket版本信息保存到wsDat
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年能見(jiàn)度測(cè)試儀項(xiàng)目可行性研究報(bào)告
- 減壓件行業(yè)深度研究分析報(bào)告(2024-2030版)
- 中國(guó)畜禽養(yǎng)殖業(yè)污染現(xiàn)狀及防治對(duì)策
- 智能交通商業(yè)計(jì)劃書模板
- 兼職平臺(tái)創(chuàng)業(yè)計(jì)劃書
- 奶牛血吸蟲病的防控
- 2025年膠粘帶生產(chǎn)制造項(xiàng)目可行性研究報(bào)告
- 2025年汽車尾氣凈化項(xiàng)目投資分析及可行性報(bào)告
- 家政商業(yè)模式教案
- 美團(tuán)代運(yùn)營(yíng)合同協(xié)議書
- 認(rèn)知知覺(jué)障礙的作業(yè)治療概述(作業(yè)治療技術(shù)課件)
- 畢業(yè)論文與畢業(yè)設(shè)計(jì)指導(dǎo)課件
- 上海市長(zhǎng)寧區(qū)西延安中學(xué)2022-2023學(xué)年八年級(jí)數(shù)學(xué)第二學(xué)期期末檢測(cè)試題含解析
- 采購(gòu)合同一般采購(gòu)合同
- 形象管理(南開大學(xué))【超星爾雅學(xué)習(xí)通】章節(jié)答案
- 《鮮衣怒馬少年時(shí) 唐宋詩(shī)詞篇 全集 》讀書筆記PPT模板思維導(dǎo)圖下載
- 密度計(jì)法顆粒分析試驗(yàn)記錄(自動(dòng)和計(jì)算)
- 施工方案設(shè)計(jì)(宿舍樓裝修改造)
- 園林工程園林給水排水工程
- GB/T 29517-2013散裝鉻礦石手工制樣方法
- GB 5009.76-2014食品安全國(guó)家標(biāo)準(zhǔn)食品添加劑中砷的測(cè)定
評(píng)論
0/150
提交評(píng)論