版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
利用WIPCAP捕捉IP數(shù)據(jù)包分析局域網(wǎng)流量1、背景知識1.1、IP協(xié)議IP(InternetProtocol,互聯(lián)網(wǎng)協(xié)議)協(xié)議是TCP/IP協(xié)議族中最為核心的協(xié)議,所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳輸。IP協(xié)議把傳輸層送來的消息封裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳遞給數(shù)據(jù)鏈路層。IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)報格式,向傳輸層屏蔽了通信子網(wǎng)的差異,從而為消息的收發(fā)雙方提供了一條透明的傳輸通道。IP數(shù)據(jù)包結(jié)構(gòu)如圖1-1:0 4 8 16 19 31版本報頭*度服務(wù)類型總長度標(biāo)識版本報頭*度服務(wù)類型總長度標(biāo)識標(biāo)志 片偏移生存周期協(xié)誼頭部校驗(yàn)和源IP地址SKIP地址選項(xiàng)(若有) 埴充數(shù)據(jù) 圖1-1IP包結(jié)構(gòu)版本IP數(shù)據(jù)報的第一個域是版本域,其長度為4bit,表示所使用的IP協(xié)議的版本。通信雙方使用的IP協(xié)議的版本必須一致。版本域值為4則表示IPv4;版本域值為6則表示IPv6。當(dāng)前的版本為IPv4。報頭長度報頭長度域長度為4bit,它以4個字節(jié)為計算單位表示報頭的長度,該長度不包含數(shù)據(jù)部分。報頭中除了IP選項(xiàng)域與填充域之外,其他各項(xiàng)是定長的。因?yàn)楹苌偈褂肐P選項(xiàng)功能,所以,該域的值一般為5,意味著報頭的長度是5個4字節(jié),也就是20個字節(jié)。協(xié)議規(guī)定:IP數(shù)據(jù)報的報頭長度必須是4字節(jié)的整數(shù)倍。當(dāng)IP報頭長度不是4字節(jié)的整數(shù)倍時,必須利用最后一個填充域“添0”來加以填充。服務(wù)類型如圖1-2所示,該字段占8bit,包括3bit的優(yōu)先級字段,4bit的服務(wù)類型(typeofservice,TOS)字段和1bit的保留位,保留位必須置0。該字段用于指示路由器如何處理該數(shù)據(jù)報。S 耳 fej b-, 迓憂先昌DTRC0圖1-2服務(wù)類型字段結(jié)構(gòu)3bit的優(yōu)先級表示數(shù)據(jù)報的重要性,共分8級,數(shù)值越大等級越高,優(yōu)先級越高則表示數(shù)據(jù)報越重要(該字段值現(xiàn)在已被忽略)。4bit的TOS字段分別表示:最小時延(D)、最大吞吐量(T)、最高可靠性(R)和最小費(fèi)用(C)。每個位都有0或1兩個值,但4bit中最多只能有一個位的值為1。如果所有4bit均為0,那么就意味著是一般服務(wù)。4?總長度總長度域占16bit,它以字節(jié)為單位具體說明包括報頭在內(nèi)的整個IP數(shù)據(jù)包的總長度。利用報頭長度字段和總長度字段,就可以知道IP數(shù)據(jù)報中數(shù)據(jù)內(nèi)容的起始位置和長度。因?yàn)樵撟侄斡?6bit,所以IP數(shù)據(jù)報最長可達(dá)65535字節(jié)。盡管可以傳送一個長達(dá)65535字節(jié)的IP數(shù)據(jù)報,但是大多數(shù)的鏈路層都要求對它進(jìn)行分片,總長度不得超過最大傳輸單元MTU。當(dāng)數(shù)據(jù)報被分片時,該字段的值也隨著變化。標(biāo)識標(biāo)識字段占16bit,用來唯一地標(biāo)識主機(jī)發(fā)送的每一份數(shù)據(jù)報,通常每發(fā)送一份報文它的值就會加1。當(dāng)IP數(shù)據(jù)報必須進(jìn)行分片時,這個標(biāo)識域的值將被復(fù)制到所有數(shù)據(jù)報分片的標(biāo)識域中。相同的標(biāo)識域值使各數(shù)據(jù)報分片最后能正確地重裝為原來的數(shù)據(jù)報。標(biāo)志標(biāo)志字段占3bit,第一bit保留并總設(shè)為0;第二bit是禁止分片標(biāo)志DF,標(biāo)識報文能否被分片,如果該位為0,說明數(shù)據(jù)報可以被分片,如果等于1,表示不允許被分片;第三bit是分片標(biāo)志MF,只有在DF為0時該字段才有意義,用以標(biāo)識此報文是否是這系列分片的最后一個,0表示接收到的是最后一個分片。片偏移片偏移量表示該分片在整個數(shù)據(jù)報中的原來數(shù)據(jù)報中的相對位置。片偏移以8B為偏移單位,因此選擇的分片長度應(yīng)該是8B的整數(shù)倍。生存時間(TTL)生存時間TTL(time-toTive)字段占8bit,它設(shè)置了數(shù)據(jù)報可以經(jīng)過的最多路由器數(shù)。TTL的初始值由源主機(jī)設(shè)置,一旦經(jīng)過一個處理它的路由器,它的值就減去1。當(dāng)該字段的值為0時,數(shù)據(jù)報就被丟棄,并發(fā)送ICMP報文通知源主機(jī)。設(shè)置生存時間是為了避免無法發(fā)送的數(shù)據(jù)報永遠(yuǎn)在互聯(lián)網(wǎng)上流動。協(xié)議類型該字段占8bit,指出此IP數(shù)據(jù)報的高層協(xié)議類型,以便目的主機(jī)的IP層將數(shù)據(jù)部分上交給哪個高層協(xié)議處理。許多高層協(xié)議的數(shù)據(jù)能夠被封裝到IP數(shù)據(jù)報中,如TCP、UDP和ICMP等。常用的協(xié)議號如表1-1所示。該字段是本程序要求輸出的信息之一。表1-1常用的高層協(xié)議與其協(xié)議域值的對應(yīng)關(guān)系高層協(xié)議類型ICMPIGMPTCPEGPUDPIPv6OSPF協(xié)議域數(shù)值126817418910.頭部校驗(yàn)和IP頭部校驗(yàn)和占16bit,它設(shè)置的目的是保證數(shù)據(jù)報頭部的數(shù)據(jù)完整性,而不包括數(shù)據(jù)部分。這樣做的目的有兩個:一是所有將數(shù)據(jù)封裝在IP數(shù)據(jù)報中的高層協(xié)議均含有覆蓋整個數(shù)據(jù)的校驗(yàn)碼,因此IP數(shù)據(jù)報沒有必要再對其所承載的數(shù)據(jù)部分進(jìn)行校驗(yàn);二是因?yàn)槊拷?jīng)過一個路由器,IP數(shù)據(jù)報的頭部都要發(fā)生改變,而數(shù)據(jù)部分并不改變,這樣,校驗(yàn)和只對發(fā)生改變的首部進(jìn)行校驗(yàn)顯然這不需要花費(fèi)太多的處理時間。為了減少計算校驗(yàn)和的開銷,IP數(shù)據(jù)報頭部校驗(yàn)和不采用CRC校驗(yàn)碼,而是采用更簡單的分段計算方法:發(fā)送端先把檢驗(yàn)和字段置為0,然后將頭部劃分為長度為16bit的比特序列,對頭部中每個16bit進(jìn)行二進(jìn)制反碼求和,結(jié)果存在檢驗(yàn)和字段中;當(dāng)收到一份IP數(shù)據(jù)報后,同樣對頭部中每個16bit進(jìn)行二進(jìn)制反碼的求和。由于接收方在計算過程中包含了發(fā)送方存在頭部中的檢驗(yàn)和,因此,如果頭部在傳輸過程中沒有發(fā)生任何差錯,那么接收方計算的結(jié)果應(yīng)該為全1。源IP地址源IP地址是32bit,表示發(fā)送數(shù)據(jù)報的源主機(jī)的IP地址。在IP數(shù)據(jù)報從源主機(jī)發(fā)送到目的主機(jī)的過程中,這個域的值必須保持不變。該字段是本程序要求輸出的信息之一。目的IP地址目的IP地址也是32bit,表示接收數(shù)據(jù)報的目的主機(jī)的IP地址。同樣地,在IP數(shù)據(jù)報從源主機(jī)發(fā)送到目的主機(jī)的過程中,這個域的值也必須保持不變。該字段也是本程序要求輸出的信息之一。選項(xiàng)域選項(xiàng)預(yù)的長度范圍為0?40B,主要用于支持糾錯、測量及安全等措施。在使用選項(xiàng)字段的過程中,有可能出現(xiàn)報頭部分的長度不是4B的整數(shù)倍。如果出現(xiàn)這種情況,就需要通過增加全0的填充域湊齊。1.2、UDP協(xié)議UDP協(xié)議是一種無連接,不可靠的簡單通信協(xié)議,所以其報頭結(jié)構(gòu)也較為簡單。UDP數(shù)據(jù)包報頭結(jié)構(gòu)如圖A?所示。UDP頭部0151631源端口號目的端口號總長度校驗(yàn)和圖1-3UDP數(shù)據(jù)包結(jié)構(gòu)源端口和目的端口分別代表本次UDP通信發(fā)起主機(jī)和目的主機(jī)所使用的端口號,總長度代表整個UDP數(shù)據(jù)包頭和其發(fā)送數(shù)據(jù)的總長度。校驗(yàn)和是針對整個數(shù)據(jù)包內(nèi)容的網(wǎng)際校驗(yàn)值,提供對本數(shù)據(jù)包正確性的檢查功能。1.3、TCP協(xié)議TCP協(xié)議是一種端對端的協(xié)議。使用TCP沒有任何廣播或類似的概念。要用TCP協(xié)議與另一臺計算機(jī)通信,兩臺機(jī)之間必須像打電話一樣連接在一起,每一端都為通話做好準(zhǔn)備。“流傳輸"(Streamdelivery)是TCP—個常用術(shù)語。這個術(shù)語的含義是TCP協(xié)議主要用來處理數(shù)據(jù)流,可以正確處理亂序的數(shù)據(jù)包OTCP協(xié)議甚至還允許存在丟失的或者損壞的數(shù)據(jù)包,最終它可以再次得到這些數(shù)據(jù)包。程序員也可以在TCP流中發(fā)送非結(jié)構(gòu)化數(shù)據(jù)°TCP協(xié)議以它自己的方式緩存數(shù)據(jù)。不過,其緩存過程對程序員和用戶是透明的。TCP數(shù)據(jù)包頭的結(jié)構(gòu)如圖1-4所示。TCP頭部0 1516 31源端口號目的端口號序號確認(rèn)號頭長保留URGACKPSHRSTSYNFIN窗口大小校驗(yàn)和(16位)緊急指針選項(xiàng)及填充圖1-4TCP數(shù)據(jù)包結(jié)構(gòu)源端口號和目的端口號:分別代表本次TCP通信發(fā)起主機(jī)和目的主機(jī)所使用的端口號;序列號:由于TCP協(xié)議是面向數(shù)據(jù)流的,它所傳遞的報文可以被視為持續(xù)的數(shù)據(jù)流,所以可以按照數(shù)據(jù)流中的先后順序給每個字節(jié)編號,本序列號就是該數(shù)據(jù)包中傳遞的第一個數(shù)據(jù)字節(jié)的編號;確認(rèn)號:表示接收端希望接收的下一個TCP包第一個字節(jié)的編號,與發(fā)送端的序列號對應(yīng);報頭長度:TCP數(shù)據(jù)包頭部長度,其范圍在5-15之間,所以TCP包頭最長可達(dá)60B(長度單位為ULONG);保留:無實(shí)際用途,置為零;控制字段:包括SYN、ACK、PSH、RST、URG、FIN,其中SYN表示同步信息,用來建立一個新的TCP連接,ACK表示確認(rèn),只有當(dāng)該位置位時,確認(rèn)號有效,PSH表示希望協(xié)議棧盡快向上層傳遞數(shù)據(jù),RST表示Reset,即強(qiáng)制切斷連接,URG表示需要緊急處理的數(shù)據(jù)存在,F(xiàn)IN代表連接正常終止,用來結(jié)束現(xiàn)有TCP連接;窗口大小:表示當(dāng)前滑動窗口大小,具體介紹參見滑動窗口協(xié)議模擬一章。校驗(yàn)和:數(shù)據(jù)報的網(wǎng)際校驗(yàn)值,提供錯誤發(fā)現(xiàn)功能;緊急指針:代表緊急數(shù)據(jù)在數(shù)據(jù)包中的位置,在URG置位時有效;1.4、Winpcap開發(fā)包1.2.1、 Winpcap簡介WinPcap(WindowsPacketCapture)是Windows平臺下一個免費(fèi),公共的網(wǎng)絡(luò)訪問系統(tǒng)。開發(fā)WinPcap這個項(xiàng)目的目的在于為Win32應(yīng)用程序提供訪問網(wǎng)絡(luò)底層的能力。它提供了以下的各項(xiàng)功能:捕獲原始數(shù)據(jù)報,包括在共享網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交換的數(shù)據(jù)報;在數(shù)據(jù)報發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)報過濾掉;在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)報;收集網(wǎng)絡(luò)通信過程中的統(tǒng)計信息。WinPcap的主要功能在于獨(dú)立于主機(jī)協(xié)議(如TCP-IP)而發(fā)送和接收原始數(shù)據(jù)報。也就是說,WinPcap不能阻塞,過濾或控制其他應(yīng)用程序數(shù)據(jù)報的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)報。因此,它不能用于QoS調(diào)度程序或個人防火墻。使用基于WinPcap開發(fā)包開發(fā)的程序要在電腦上運(yùn)行需要首先在電腦上安裝WinPcap相關(guān)的驅(qū)動程序。本次作業(yè)使用WinPcap實(shí)現(xiàn)的主要功能有:查詢網(wǎng)絡(luò)適配器信息,發(fā)送ARP數(shù)據(jù)包和偵聽ARP應(yīng)答以及IP流量監(jiān)控。1.2.2、 Winpcap工作流程獲取網(wǎng)絡(luò)設(shè)備列表通常,一個基于WinPcap的應(yīng)用程序所要做的第一件事,就是獲得適合的網(wǎng)絡(luò)接口的列表。獲取該列表可調(diào)用pcap_findalldevs_ex()函數(shù):這個函數(shù)返回一個pcap_if結(jié)構(gòu)的列表,每個元素都記錄了一個接口的信息。其中,name和description以人類可以閱讀的形式,記錄了設(shè)備的信息。該函數(shù)原型為:intpcap_findalldevs_ex(char*source,structpcapjrmtauth* auth,pcap_if_t** alldevs,char*errbuf)當(dāng)pcap_findalldevs_ex()返回成功后,alldevs參數(shù)指向獲取的網(wǎng)絡(luò)接口列表的第一個元素。利用WinPcap的pcap_findalldevs_ex()函數(shù)獲取本機(jī)網(wǎng)絡(luò)接口列表和每個網(wǎng)絡(luò)接口IP地址。打開網(wǎng)絡(luò)接口得到網(wǎng)絡(luò)設(shè)備列表之后,就可以選擇感興趣的網(wǎng)絡(luò)接口卡并對其上的網(wǎng)絡(luò)流量進(jìn)行監(jiān)聽。在監(jiān)聽前需要將其打開,可使用WinPcap提供的pcap_open()函數(shù),pcap_open()函數(shù)原型如下:pcap_t*pcap_open(constchar* source,intsnaplenintflags,int read_timeout,structpcap_rmtauth*auth,char*errbuf)source--指向需要打開的網(wǎng)絡(luò)接口卡的名字,該名字可從獲取網(wǎng)絡(luò)接口設(shè)備列表中得到。snaplen--指定了要捕捉的數(shù)據(jù)包的最大長度。我們使用一個高出MTU最大值的值(65536)以確??梢圆蹲降匠蓚€數(shù)據(jù)包。flags--指定以何種方式打開網(wǎng)絡(luò)接口設(shè)備并獲取網(wǎng)絡(luò)數(shù)據(jù)包。通常我們使用混雜模式(PCAP_OPENFLAG_PROMISCUOUS)打開網(wǎng)絡(luò)接口卡,用于捕獲所有流經(jīng)該網(wǎng)卡的數(shù)據(jù)包。read_timeou--用以設(shè)置超時,單位是毫秒。數(shù)據(jù)包捕獲函數(shù)是pcap_next_ex(),如果這段時間內(nèi)沒有捕捉到數(shù)據(jù)包,該函數(shù)將返回0。auth--在遠(yuǎn)程捕獲網(wǎng)絡(luò)數(shù)據(jù)包時使用,在編寫捕獲本機(jī)網(wǎng)絡(luò)數(shù)據(jù)包的程序中,要將該值賦為NULL。errbuf--存放錯誤信息的緩沖區(qū)。調(diào)用出錯時,pcap_open()函數(shù)返回NULL,成功時返回一個指向pcap_t的指針,該指針在后續(xù)調(diào)用的函數(shù)中會被使用。在打開的網(wǎng)絡(luò)接口卡上發(fā)送或捕獲網(wǎng)絡(luò)數(shù)據(jù)包一旦打開網(wǎng)絡(luò)接口卡,就可使用WinPcap提供的pcap_sendpacket()函數(shù)發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包,pcap_sendpacket()函數(shù)原型如下:intpcap_sendpacket(pcap_t* p,u_char*buf,intsize)此函數(shù)可以讓應(yīng)用程序發(fā)送原始數(shù)據(jù)包,而不用直接訪問底層的API函數(shù)。p--發(fā)送數(shù)據(jù)包的網(wǎng)絡(luò)接口。Buf--包含了待大宋的數(shù)據(jù)(包括各層網(wǎng)絡(luò)協(xié)議的包頭)。Size—是buf的大小。打開網(wǎng)絡(luò)接口卡后,還可使用WinPcap提供的pcap_next_ex()函數(shù)捕獲流經(jīng)的網(wǎng)絡(luò)數(shù)據(jù)包,pcap_next_ex()函數(shù)原型如下:intpcap_next_ex(pcap_t* p,structpcap_pkthdr**pkt_headerconstu_char**pkt_data)p--通過該參數(shù)指定捕獲哪個接口卡上的網(wǎng)絡(luò)數(shù)據(jù)包,該參數(shù)通常調(diào)用pcap_open()函數(shù)執(zhí)行成功后的返回值。pkt_headep-該參數(shù)指向的pcap_pkthdr結(jié)構(gòu)包含有所捕獲的網(wǎng)絡(luò)數(shù)據(jù)包的一些基本信息。pkt_data--指向捕獲到的網(wǎng)絡(luò)數(shù)據(jù)包。1.5、相關(guān)知識介紹1.5.1、 捕獲IP流量的基本原理Ethernet是目前應(yīng)用廣泛的進(jìn)算計聯(lián)網(wǎng)方式,它是基于總線結(jié)構(gòu),物理層是采用廣播方式的。當(dāng)一臺主機(jī)向另一臺主機(jī)發(fā)送數(shù)據(jù)時,發(fā)送主機(jī)會包含目的主機(jī)正確地址的數(shù)據(jù)幀發(fā)送到總線上,因此同一鏈路上所有活躍主機(jī)的網(wǎng)卡都能收到該幀。正常情況下,網(wǎng)卡收到傳輸來的數(shù)據(jù)幀后,會先檢查幀頭的目的地址字段,如果該地址不是本機(jī)的MAC地址,則丟棄不管,因此只有具有該地址的主機(jī)會接收這個數(shù)據(jù)幀。但是,如果某個程序能夠修改網(wǎng)卡的接收模式,使其成為“混雜”模式,即一臺主機(jī)可以接收網(wǎng)絡(luò)上所有的數(shù)據(jù)幀而不理會幀頭的目的地址,利用這一點(diǎn),可以實(shí)現(xiàn)捕獲網(wǎng)絡(luò)中所有的數(shù)據(jù)幀。一個良好的數(shù)據(jù)幀捕獲程序可以工作在網(wǎng)絡(luò)環(huán)境中的底層,攔截所有正在網(wǎng)絡(luò)上傳送的數(shù)據(jù),并且通過相應(yīng)的解析處理,可以實(shí)時分析這些數(shù)據(jù)的內(nèi)容,進(jìn)而分析所處的網(wǎng)絡(luò)狀態(tài)和整體布局。1.5.2、 TCP/IP分層體系結(jié)構(gòu)計算機(jī)網(wǎng)絡(luò)實(shí)際上是按照不同的通信功能劃分的層次結(jié)構(gòu),每一層功能都由特定的協(xié)議來完成。TCP/IP協(xié)議族是當(dāng)前最流行也是最成功的一套的網(wǎng)絡(luò)協(xié)議棧,其結(jié)構(gòu)自底向上分為4層,分別為主機(jī)-網(wǎng)絡(luò)層、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層。主機(jī)至網(wǎng)絡(luò)層在TCP/IP中并沒有做具體的規(guī)定。通常情況下我們選擇Ethernet網(wǎng)作為底層網(wǎng)絡(luò)環(huán)境并使用常用的5層網(wǎng)絡(luò)體系結(jié)構(gòu)即物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層作為分層標(biāo)準(zhǔn)。如圖<3>給出了一些常見的協(xié)議以及其所屬層次。
圖1-5TCP/IP常見協(xié)議及其所在層次1.5.3、數(shù)據(jù)幀的封裝與解析當(dāng)應(yīng)用程序通過IP網(wǎng)絡(luò)傳送數(shù)據(jù)時,數(shù)據(jù)被送入TCP/IP協(xié)議棧中,然后從上至下逐一通過每一層,直到最后被當(dāng)作一串比特流送入網(wǎng)絡(luò)。其中每一層收到的數(shù)據(jù)都要增加一些首部信息,這個過程被稱作封裝。通過以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀。在傳輸?shù)牧硪欢?,?dāng)目的主機(jī)收到一個以太網(wǎng)數(shù)據(jù)幀時,數(shù)據(jù)就開始從協(xié)議棧由底向上逐層解析,去掉各層協(xié)議所加上的報文頭部。每層協(xié)議均要檢查頭部中的協(xié)議標(biāo)識字段,以確定要接收數(shù)據(jù)的上層協(xié)議,最終從報文解析出應(yīng)用層數(shù)據(jù)后交給應(yīng)用程序處理。封裝與解析過程入圖<4>所示:應(yīng)用層數(shù)據(jù)傳輸層首部 應(yīng)用層數(shù)據(jù)封裝 解析網(wǎng)絡(luò)層首部傳輸層首部應(yīng)用層數(shù)據(jù)以太網(wǎng)首部網(wǎng)絡(luò)層首部傳輸層首部 應(yīng)用層數(shù)據(jù) 以太網(wǎng)尾部圖1-5數(shù)據(jù)的封裝與解析2、程序編譯、執(zhí)行和運(yùn)行方式2.1、程序開發(fā)環(huán)境操作系統(tǒng):WindowsXPsp2專業(yè)版開發(fā)工具:MicrosoftVisualC++6.0,WinPcap4.0.1編譯環(huán)境:MicrosoftVisualC++6.02.2、 程序執(zhí)行環(huán)境WindowsXP,WinPcap4.0.12.3、 程序運(yùn)行方式運(yùn)行步驟如下:雙擊IPMonitor.exe文件,打開IP包流量統(tǒng)計程序。選擇要使用的網(wǎng)卡。點(diǎn)擊“獲取主機(jī)”按鈕,開始搜索當(dāng)前的活動主機(jī),活動主機(jī)的IP地址則顯示在下面的列表中。選擇要統(tǒng)計流量的活動主機(jī)IP,如果不選擇則會統(tǒng)計所有活動主機(jī)的IP包流量。輸入偵聽時間,點(diǎn)擊“開始攔截”按鈕,程序開始捕獲流經(jīng)網(wǎng)卡的IP數(shù)據(jù)包,同時解析捕獲到的數(shù)據(jù)包。當(dāng)?shù)竭_(dá)偵聽時間時則列出所有捕獲到的數(shù)據(jù)包,包含源IP地址、目的IP地址、
源端口號、目的端口號、協(xié)議類型、數(shù)據(jù)包數(shù)量。如圖2-1所示:圖2-1效果圖3、程序說明3.1、程序設(shè)計思路根據(jù)作業(yè)要求,使用winpcap編寫程序,監(jiān)控本地網(wǎng)絡(luò),捕獲一段時間內(nèi)以用戶選擇的主機(jī)地址為源地址或目的地址的IP數(shù)據(jù)包,并統(tǒng)計IP數(shù)據(jù)包的信息,列出用戶選擇的主機(jī)與其他主機(jī)之間不同協(xié)議類型的IP數(shù)據(jù)包的數(shù)量。因此:首先,要監(jiān)控網(wǎng)絡(luò),首先要獲取當(dāng)前活動主機(jī)的IP,方法是向本地網(wǎng)絡(luò)中發(fā)送Arp請求數(shù)據(jù)包,如果得到某主機(jī)的響應(yīng)則該主機(jī)為當(dāng)前活動主機(jī),將該主機(jī)的IP地址添加到列表中。然后,用戶可以選擇要統(tǒng)計流量的IP地址,捕獲所有IP數(shù)據(jù)包,如果捕獲的數(shù)據(jù)包的源IP地址或目的IP地址與用戶選擇的一樣,則將該信息添加到一個鏈表中。最后,將鏈表中的信息顯示出來。3.2、程序流程圖程序的主流程圖如圖3-1:圖3-1程序主流程圖捕獲IP數(shù)據(jù)包流程圖如圖3-2:已混雜模式打開網(wǎng)卡編譯過濾器設(shè)置過濾器噸捕獲時間結(jié)束銀是否選擇IP屛統(tǒng)計網(wǎng)絡(luò)中所有的IP數(shù)據(jù)包統(tǒng)計以該IP為源統(tǒng)計網(wǎng)絡(luò)中所有的IP數(shù)據(jù)包創(chuàng)建Map,存IP包源IP地址、目
的IP地址、源端口號、目的端口
號、協(xié)議類型、數(shù)據(jù)包數(shù)量顯示統(tǒng)計結(jié)果結(jié)束圖3-2捕獲IP數(shù)據(jù)包流程圖3.3、主要數(shù)據(jù)結(jié)構(gòu)Ethernet幀首部:structBYTEDestMAI[6];BYTESrcMAC[6];VJORDFrameType;}FHank^Haad;?Arp幀typedefstructFrameHeadframeHead;UOFtDHaHduareTi/pe;UOFtDProtocalType;BVTEHuitLer;BVTEPttLer;MORDOperation:BVTESendHi[6];DUORDSendIPAddr;BVTERecuH<[6];DUORDFtecuIPAddr;}fiRPFrame;?IP幀頭typedeFstruct<BVTEUersion;BVTESeruiceType;WORDTotalLen;UORDIdentify;UORDFragnentOffset;BVTETTL;BVTEProtocolT^pe;WORDHeadCheckSum;DUORDSrcIPAddr;DUORDDestlPAddt;JIPHead;?TCPUDP幀頭tupedefstruct<USHORTSrcPort;USHORTDestPort:}TCPUDPHead;3?4、函數(shù)介紹?搜索活動主機(jī)用到以下函數(shù):封裝ARP包的函數(shù)staticARPFramePacketARPFrame(BYTEsrcMAC[6],ULONGsrcIP,ULONGdestIP);發(fā)送ARP包的函數(shù)staticvoidSendARPFrame(pcap_if_t*dev,BYTEmac[6],unsignedlonglocalIP);接收ARP包的函數(shù)staticvoidReceiveARPFrame(pcap_t*networkHandle,pcap_if_t*dev);獲得本機(jī)IP地址的函數(shù)staticvoidGetLocalMac(char*devName,unsignedlonglocalIPAddr);得到活動主機(jī)IP列表的輔助函數(shù)staticvoidAddrToHost(CListCtrl*Hostlist,CStringmessage,intindex);設(shè)置接收ARP包線程與發(fā)送ARP包線程,如下圖所示UINTOnStartSearch(LPUOIDpPardn)KCIPNonitorDlg::ReceiuefiRPFraneCNetworkHandle,SelectedDei);return0;}UINTOnS^nd(LPUOIDpParai)CIPNonitorDlg::SendARPFrame(SelectedDeurLocalMac,HostIP);return0;}圖3-3線程函數(shù)設(shè)置由于第二次作業(yè)為使用ARP協(xié)議獲取局域網(wǎng)內(nèi)活動主機(jī)物理地址,在此不做詳細(xì)介紹。IP流量統(tǒng)計1、 已混雜模式打開網(wǎng)卡、編譯并設(shè)置過濾器代碼如下圖所示:iF[(NetworkHandle=pcapopen(;BlectedDei->nane,65536,PCfiPOPEMFLfiGPROMISCJOlS,198,MULL<_MessageBoxCfl開網(wǎng)卡失ftl");>subHetMask=0xfffFff;Filter="arpand(ether[20:2]=Gx2)if(SelectsdDeu->addre55e<"NULL){subNetMask=((struttsockaddrin*)(SelectedDeu->addresse5->netnask))->sin_addr.S_u}—if(pcap_compile(NetiuorkHardle,&FCode,Filter,1,subHetMasl)<9)<MessageBoxC'^譯過慮器失收!”);return;}if(pcapsetfilterCNetworkHandle,tfCode)<0)Me55ageBox(,^置過濾器出錯!”);return;>圖3-4混雜模式打開網(wǎng)卡、設(shè)置編譯過濾器代碼若選擇網(wǎng)絡(luò)中所有IP包和統(tǒng)計選定IP地址為源地址或目的地址的數(shù)據(jù)包以選定IP包為例介紹,代碼如下圖所示:kep=CStringsrcIPAddr(inet_ntoa(*(in_addr*)&ipHead->frcIPAddi));CStringdestIPAddr(inet_ntoa(*(in_addr*)&ipHead->(estIPAddr));CStringprotoca;(GetProtocolMsg(LpHeai->ProtocolTypf));CStringsourPoriCStringdestPori="";sourPort.Format("^.d",ntohs(:cpUdpHeai->SrcPort));destPort.Forniat("^.d",ntohs(:cpUdpHeai->DestPort));key=srcIPAddr+destIPfiddr+protocal+sourPort+destPort;record.;rclf=srcIPAddr;record.lestll=JestIPAddr;record.*rotoca;=protocal;record.trcPort=sourPort;record.lestPort=destPort;record..nde)=1;captureResull=recordlist.find(cei);if(captureResull==recordlist.end())<recordlisi[key]=record;>else<recordlisi[key]|.index++;>圖3-5使用map存儲IP包信息代碼3顯示統(tǒng)計結(jié)果,代碼如下圖所示:indes=0;cdptureResuli=recordlist?begin();切hi"(cjptureResult!=recordlist.end())CLst_Result?Insertltemtindex;CLst_Result.^etItenTe?t(inde?,Q,captijreResiJlt->secon(l.SrcIP);CLst_Result.SetItemText(Lnde>,1,captureResult->second.JestH);CLstResult.SetItemText(index,2,captureResult->second.SrcPorl);CLst_Result.SetItenText(Index,3^
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45109.1-2024智慧城市城市數(shù)字孿生第1部分:技術(shù)參考架構(gòu)
- 2024版建筑工程泥工施工勞務(wù)合同
- 二手商品房買賣合同范本2024年版(買賣雙方權(quán)益保障)
- 二零二五版廣東教育機(jī)構(gòu)勞務(wù)派遣服務(wù)協(xié)議3篇
- 二零二五年建筑公司項(xiàng)目管理團(tuán)隊(duì)勞動合同3篇
- 2025年房產(chǎn)社交媒體營銷合同3篇
- 二零二五年文化旅游產(chǎn)業(yè)PPP項(xiàng)目特許經(jīng)營合同3篇
- 二零二五年度高效復(fù)合肥生產(chǎn)與銷售合作框架協(xié)議3篇
- 個性化2024版民間資金借貸擔(dān)保協(xié)議版B版
- 二零二五版光纖熔接項(xiàng)目融資服務(wù)合同范本3篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長競聘演講稿(3篇)
- 2025至2031年中國臺式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報告
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語文試題(解析版)
- 新人教版七年級數(shù)學(xué)上冊全冊專項(xiàng)訓(xùn)練大全
- 標(biāo)準(zhǔn)預(yù)防--ppt課件
- 壓力管道氬電聯(lián)焊作業(yè)指導(dǎo)書
- 審計資料封面(共6頁)
- 加油站施工情況報告安裝
- 分子標(biāo)記及遺傳連鎖圖譜
- 防火墻施工組織設(shè)計
評論
0/150
提交評論