局域網的IP數(shù)據包監(jiān)控分析軟件與設計_第1頁
局域網的IP數(shù)據包監(jiān)控分析軟件與設計_第2頁
局域網的IP數(shù)據包監(jiān)控分析軟件與設計_第3頁
局域網的IP數(shù)據包監(jiān)控分析軟件與設計_第4頁
局域網的IP數(shù)據包監(jiān)控分析軟件與設計_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

題目局域網的IP數(shù)據包監(jiān)控分析軟件實現(xiàn)學院名稱指導教師職稱班級學號學生姓名頁,共59頁第一章緒論1.1選題背景及意義隨著信息技術的快速發(fā)展,網絡已成為信息交換的主要手段,一些網絡新業(yè)務在不斷地興起,如電子商務、移動支付等,這些都對網絡安全提出了較高的要求。與此同時,黑客對網絡的攻擊從未停止,有的利用網絡盜取他人個人信息,如網上銀行賬號密碼等,對他人的財產安全構成了嚴重威脅,網絡的安全問題變得日趨嚴峻。因此,必須加強安全意識,并及早防范,防范這種現(xiàn)象的方法和工具有很多,按時間元素歸納起來大致有三類,事先預警,事中防范和事后監(jiān)督,其中,事中防范是目前正在流行的一種安全措施,主要作用是在根據正在發(fā)生的事件判斷風險程度和防范水平。而網絡監(jiān)聽是正是它的一個典型例子,網絡監(jiān)聽又稱網絡竊聽,它引起人們普遍注意是從94年開始的。實現(xiàn)網絡監(jiān)聽的主要工具是sniffer,中文名稱叫做嗅探器。隨著以太網這種局域網技術的日漸成熟,網絡監(jiān)聽也日漸成熟,它在協(xié)助網絡管理員監(jiān)測網絡傳輸數(shù)據,排除網絡故障等方面具有不可替代的作用,因而一直倍受網絡管理員的青睞,局域網的IP數(shù)據包監(jiān)控分析軟件,就是網絡監(jiān)聽技術的一種實現(xiàn)方式,該實現(xiàn)主要運用sniffer原理來嗅探出網絡有效信息,并經過windows網絡編程,從中提取出有效數(shù)據,以實現(xiàn)對IP數(shù)據包的監(jiān)控,以達到安全防范的目的。1.2研究現(xiàn)狀一般來講,Windows環(huán)境下有三種方案可供選擇以編程實現(xiàn)IP數(shù)據包的捕獲:RawSocket,原始套接字是WindowsSocket2.2版本中定義的套接字結構,目前只有一個WinSocket2.h運行時庫提供對它的支持,原始套接字能夠生成自己的數(shù)據報文,包括報頭和數(shù)據報本身的內容。通過原始套接字可以自如的控制Windows下的多種協(xié)議,而且能夠對底層的傳輸機制進行控制[1]??梢杂迷继捉幼謥戆l(fā)送和接收IP層以上的原始數(shù)據包,如ICMP(Internet互聯(lián)網控制報文協(xié)議),TCP(TransmissionControlProtocal,傳輸控制協(xié)議),UDP(UserDatagramProtocal,用戶數(shù)據報協(xié)議),而且能夠對底層的傳輸機制進行控制。RawSocket的作用主要有三個方面:1)接收發(fā)向本機的ICMP,IGMP(Internet組管理協(xié)議)協(xié)議包,或者發(fā)送這些協(xié)議包;2)接收發(fā)向本機的IP包;3)發(fā)送自定義的IP包。(2)NDIS(NetworkDriverInterfaceSpecification,網絡驅動程序接口規(guī)范),為傳輸層提供標準的網絡接口,所有的傳輸驅動程序都需要調用NDIS接口來訪問網絡[2]。由Microsoft和3Com公司聯(lián)合開發(fā),是Windows中的“通信協(xié)議程序”和“網絡設備驅動”之間通信的規(guī)范,它為協(xié)議控制程序提供標準的接口,它支持計算機通過不同的協(xié)議棧與網絡相連。(3)WinPcap(windowspacketcapture),是一個基于Win32的捕獲數(shù)據包和網絡分析的體系結構,它包括一個內核級的包過濾器,一個底層的動態(tài)鏈接庫(Packet.dll),一個高層并且與系統(tǒng)無關的庫(WPcap)[3]。WinPcap提供了以下四項功能:1)捕獲原始數(shù)據包,包括共享網絡上各主機發(fā)送/接收的以及相互之間交互的數(shù)據報;2)在數(shù)據報發(fā)往應用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據報過濾掉;3)在網絡上發(fā)送原始數(shù)據包;4.收集網絡通信過中的統(tǒng)計信息。表1.1對它們各自的優(yōu)缺點進行了簡單比較:表1.1Windows下捕包方案比較方法優(yōu)點缺點補充RawSocket實現(xiàn)簡單只能抓取IP包,對于IP同層(如ARP)的其他數(shù)據包無能為力只能獲得包的一份拷貝,WindowsXP以后的版本不兼容NDIS可以對網卡進行任意的操作,可以抓取原始數(shù)據包驅動程序開發(fā)代價較大可以截斷數(shù)據流而不僅僅是一份拷貝WinPcap可以抓取原始數(shù)據包,提供應用程序接口,復雜的內部實現(xiàn)由DLL完成實現(xiàn)的Sniffer需要安裝相應的鏈接庫才能運行只能獲得包的一份拷貝1.3實現(xiàn)方法在以太網上通訊的每張網卡上都擁有一個全球唯一的物理地址,也叫MAC地址。該地址是一個48比特的二進制數(shù)。在以太網卡中內建有一個數(shù)據包過濾器。該數(shù)據包過濾器的作用是保留以本身網卡的MAC地址為通訊目的的數(shù)據包和廣播數(shù)據包,丟棄所有其它無關的數(shù)據包,以免CPU對無關的數(shù)據報作無謂的處理[4]。這是以太網卡在一般情況下的工作方式。因此在正常情況下,一個合法的網絡接口應該只響應這樣的兩種數(shù)據包(幀):(1)幀的目標地址具有和本地網絡接口相匹配的硬件地址。(2)幀的目標地址是“廣播地址”(代表所有的接口地址),格式為“FFFFFFFFFFFF”。在接收到上面兩種情況的數(shù)據幀時,網卡通過CPU產生中斷,操作系統(tǒng)進行中斷處理后將幀中包含的數(shù)據傳送給上層系統(tǒng)進行進一步處理。在其他情況下數(shù)據幀將被丟棄而不作處理。要想捕獲到流經網卡的不屬于本主機的數(shù)據,必須繞過系統(tǒng)正常工作的處理機制,直接訪問網絡底層。我們可以把網卡的狀態(tài)設為“混雜”(promiscuous)模式,當網卡工作在這種“混雜”模式時,該網卡就具備了“廣播地址”,它對所接收到的每一個幀都產生一個硬件中斷以提醒操作系統(tǒng)處理流經該網卡上的每一個報文包。操作系統(tǒng)通過直接訪問鏈路層,截獲相關數(shù)據,由應用程序而非上層協(xié)議(如IP層、TCP層)對數(shù)據過濾處理,這樣就可以捕獲到流經網卡的所有數(shù)據。本次研究是在共享局域網環(huán)境下,共享式以太網的典型代表是使用10Base5的總線型網絡和以集線器(HUB)為核心的星型網絡。另外,本次只對TCP/IP的抓包研究,不涉及數(shù)據報的截獲或攔截。第二章技術背景2.1Winsock基本概念Windows下網絡編程的規(guī)范--WindowsSocket是Windows下得到廣泛應用的、開放的、支持多種協(xié)議的的網絡編程接口。該規(guī)范以U.C.Berkeley大學BSDUNIX中流行的Socket接口為范例定義了一套MicosoftWindows下網絡編程接口。它不僅包含了BerkeleySocket風格的庫函數(shù),也包含了一組針對Windows的擴展庫函數(shù),以使程序員能充分利用Windows消息驅動機制進行編程。Windows在Internet支配域中的TCP/IP協(xié)議定義了Winsock網絡編程規(guī)范,融入了許多新特點。使用Socket的目的是使用戶在網絡協(xié)議上工作而不必對該網絡協(xié)議有非常深入的了解。此外,編寫的程序還可被迅速地移植到任何支持Socket的網絡系統(tǒng)中去。Winsock提供了一種可為指定傳輸協(xié)議打開、計算和關閉會話的能力。在Windows下,TCP/IP上層模型在很大程度上與用戶的Winsock應用有關;換言之,用戶的Winsock應用控制了會話的方方面面,必要時,還會根據程序的需要格式化數(shù)據。套接字,是通信的基石,是支持TCP/IP協(xié)議的網絡通信的基本操作單元[5]??梢詫⑻捉幼挚醋鞑煌鳈C間的進程進行雙向通信的端口。一個套接口就是通信的一端,套接口,就是一個指向傳輸提供者的句柄。套接字有三種類型:流式套接字、數(shù)據報套接字及原始套接字。流式套接字定義了一種可靠的面向連接的服務,實現(xiàn)了無差錯無重復的順序數(shù)據傳輸。數(shù)據報套接字定義了一種無連接的服務,數(shù)據通過相互獨立的報文進行傳輸,是無序的,并且不保證可靠和無差錯。原始套接字允許對低層協(xié)議如IP或ICMP直接訪問,主要用于新的網絡協(xié)議實現(xiàn)的測試等,本次系統(tǒng)就是使用的該套接字。2.2IP數(shù)據包的構成2.2.1IP地址通常所說IP地址是指現(xiàn)在所使用的第四版本的Ipv4地址協(xié)議。其中的IP是以32位的二進制數(shù)來表示的,它惟一地定義了一個在因特網上的主機或路由器。通常按8位分成4段,用十進制的數(shù)值表示,中間用點號分開。因此IP地址的數(shù)值可以從到55。計算機地址除了0和全部為1的數(shù)值外都可以使用。計算機地址為0時,在網絡地址中指定為指向網絡本身。計算機地址全部為1時,網絡地址指定為向全體網絡進行通信廣播。網絡地址使用多少位取決于一個局域網能容納的計算機臺數(shù)。因此,網絡地址的位數(shù)決定了IP地址的分類,總共分為A,B,C,D和E五類。 A類地址中網絡地址有7位,計算機地址被分配為24位。即具有A類地址的網絡在全世界只有100個左右,是能夠容納1600萬臺計算機的網絡。B類地址使用方便,網絡數(shù)量和可容納的主機數(shù)都比較合適,造成現(xiàn)在B類地址資源不足,申請分配十分困難。C類地址目前還有大量剩余,但是由于一個單位中使用一個C類地址,常常不能容納自己網絡上所有的計算機,因此必須分配給相應的多個C類地址。這種情況下,需要使用把這些計算機作為一個網絡的無類別域際路由選擇(CIDR:ClasslessInter-DomainRouting)技術,使用不受本來類別制約的地址,進行地址空間的再分配會擴大網絡地址的使用,在此種情況下分配的網絡稱為子網。使用子網時不能從IP地址的類別上區(qū)分IP地址中哪部分是網絡地址。D類地址是多點傳送地址,向多方傳送IP數(shù)據包。廣播會向所有的網絡設備傳送IP數(shù)據包,但是在多點傳送中希望接收數(shù)據的多臺計算機可以接受到IP數(shù)據包。這種多點傳送可以將聲音、圖像等向多臺網絡設備同時傳送,因此常被使用在利用網絡進行廣播的應用程序上。E類地址保留為今后用。 在因特網中使用的IP地址,在世界范圍內是不重復的。但是對于因特網沒有對外公開的IP地址和其他網絡中發(fā)生重復是沒有關系的。因此,作為沒有公開的內部私有地址,要規(guī)定其使用范圍。RFC1918中對私有地址的規(guī)定是:~55~55~55因此在內部私有網中的IP常常會是在以上范圍內。 下一代的IP地址為Ipv6,IP地址的位數(shù)達到128位,IP地址的個數(shù)可以達到現(xiàn)在的296倍,這樣Ipv4地址資源不足的問題將得到解決。2.2.2數(shù)據包的封裝與分用當應用程序用TCP傳送數(shù)據時,數(shù)據被送入協(xié)議棧中,然后逐個通過每一層直到被當做一串比特流送入網絡。其中每一層對收到的數(shù)據都要增加一些首部信息(有時還要增加一些尾部信息),該過程如圖2.1[6]所示。圖2.1數(shù)據包的封裝過程示意圖TCP傳給IP的數(shù)據單元為TCP報文段,IP傳給網絡接口層的數(shù)據單元為IP數(shù)據報(IPdatagram),通過以太網傳輸?shù)谋忍亓鞣Q作幀(Frame),以太網數(shù)據幀的長度必須在46~1500字節(jié)之間。UDP數(shù)據與TCP數(shù)據基本一致。唯一不同的是UDP傳給IP的信息單元稱作UDP數(shù)據報(UDPDatagram),而且UDP的首部長為8字節(jié)。由于TCP、UDP、ICMP和IGMP都要向IP傳送數(shù)據,因此IP必須在生成的IP首部中加入某種標識,以表明數(shù)據屬于哪一層。為此,IP首部中存入一個長度為8bit的數(shù)據,即協(xié)議域。1表示ICMP協(xié)議,2表示IGMP,6表示TCP,17表示UDP。許多應用程序都可以使用TCP或UDP來傳送數(shù)據,傳輸層協(xié)議在生成報文首部時要存入一個應用程序的標識符,TCP和UDP都用一個16位的端口號來表示不同的應用程序,TCP和UDP把源端口號和目的端口號分別存入報文首部中。網絡接口要發(fā)送和接收IP、ARP(AddressResolutionProtocol,地址解析協(xié)議)和RARP(ReverseAddressResolutionProtocol,逆向地址解析協(xié)議)數(shù)據,也必須在以太網的幀首部中加入某種形式的標識,以指明生成數(shù)據的網絡層協(xié)議,為此,以太網的首部也有一個16bit的幀類型域。當目的主機收到一個以太網數(shù)據幀時,數(shù)據就開始從協(xié)議棧中由底向上升,同時去掉各層協(xié)議加上的報文首部。每層協(xié)議盒都要去檢查報文首部中的協(xié)議標識,以確定接收數(shù)據的上層協(xié)議。這個分用過程如圖2.2[6]所示。圖2.2數(shù)據分用過程2.2.3IP數(shù)據報IP數(shù)據報,是Internet上數(shù)據通信的基本單元。IP數(shù)據報文的格式如圖2.3所示:版本報頭長度服務類型(TOS)總長度信息包標志標志分段偏移量生命周期協(xié)議校驗和源IP地址目的IP地址IP選項與填充值圖2.3IP數(shù)據報格式其中,版本字段用于指定IP協(xié)議的版本號,本次系統(tǒng)使用環(huán)境即為版本4。報頭長度字段用于指定IP數(shù)據頭的長度,它以4B為單位,且至少為5,即20個字節(jié)或160個比特;需要注意的是,IP報頭長度不包含數(shù)據區(qū)中的數(shù)據。服務器類型(TOS)字段共占用了8bit,其分配方法為:優(yōu)先級DTR字段未用;優(yōu)先級字段用于指定IP數(shù)據包在網絡中的優(yōu)先級,優(yōu)先級可以影響一個信息包通過網橋的速度,以及目的主機翻譯的方式;字段D為延遲標志位;T為流量標志位;R為質量標志位??傞L度字段用于指定IP數(shù)據包的總長度(包含數(shù)據區(qū)中的數(shù)據),它以字節(jié)為單位,理論最大長度為65535,然而,如今大多數(shù)應用程序允許最大長度為8192[7]。信息包標識,用來判斷分段屬于哪一個數(shù)據包。標志,共分3位,其中第一位未用;第二位為DF,若DF等于1,則表明不對該數(shù)據包進行分段;第三位為MF,若為MF等于1,則表明該分段不是最后一個包,即還有其他分段存在,若MF等于0,則表明該分段是最后一個分段,利用MF標志位可以判斷是否所用的分段都已到達。分段偏移量,用于指明分段在整個數(shù)據包中的位置。生命周期(TTL)字段用于控制IP數(shù)據包在網絡存在時間的長短,其理論最大值為255,每經過一個路由器,TTL值就減1,當TTL等于0時,設備將丟棄該IP數(shù)據包,并向源主機發(fā)送一個出錯信息,該出錯信息中含有該IP數(shù)據包所經過的路由器的地址。校驗和字段用于對IP報頭進行校驗,它只用于IP報頭,而非整個IP數(shù)據包。而源IP地址和目的地址分別包含了該報文和接收該報文的計算機IP地址。本程序中定義的IP數(shù)據結構為:typedefstruct_IPHeader{ unsignedcharver_len; //版本+報頭長度 unsignedchartos; //服務類型 unsignedshortlen; //總長度 unsignedshortident; //信息包標志 unsignedshortflag_frag; //標志(3)+分段偏移(13) unsignedcharttl; //生命周期 unsignedcharproto; //協(xié)議 unsignedshortchecksum; //校驗和 unsignedintsrc; //源IP地址 unsignedintdst; //目的IP地址 _IPHeader() { memset(this,0,sizeof(_IPHeader));//初始化 }}IPHeader,*PIPHeader;2.3網絡數(shù)據包捕獲原理目前有兩種方法可以從網絡中捕獲數(shù)據包,一種是采用專用硬件,另一種是利用普通計算機與網絡連接的通用硬件網絡適配器,即網卡,由軟件來完成數(shù)據包的捕獲。雖然由軟件來捕獲數(shù)據包的方法在性能上比不上專用硬件,但其實現(xiàn)成本相對更低,且易于修改和更新?;谝陨显?采用軟件的捕獲方法得到了廣泛的使用和認同。在以太網中,所有的通信都是廣播方式,即在同一網段上的所有網絡接口都可以訪問在物理媒體上傳輸?shù)臄?shù)據。數(shù)據的收發(fā)由網卡來完成,網卡的工作模式起著至關重要的作用,一般網卡有四種方式:(1)廣播方式,此方式下網卡可以接收網絡中的廣播信息;(2)組播方式,此方式下網卡可以接收網絡中的組播信息;(3)直接方式,此方式下只有目的網卡才能接收該數(shù)據;(4)混雜模式,此模式下網卡能夠接收一切通過它的數(shù)據,不論是否傳給它[8]。網卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發(fā)給自己的幀。如果采用混雜模式,一個站點的網卡將接受同一網絡內所有站點所發(fā)送的數(shù)據包這樣就可以到達對于網絡信息監(jiān)視捕獲的目的。2.4RawSocket原始套接字提供管理下層傳輸?shù)哪芰?,它們可能會被惡意利用,這是一個安全問題,僅Administrator組的成員能夠創(chuàng)建SOCK_RAW類型套接字。任何人都可以在NT下穿件套接字,但沒有Administrator權限的人不能用它做任何事,因為bind函數(shù)將會失敗,出錯碼為WSAEACCESS[9]。要使用原始套接字,必須經過創(chuàng)建原始套接字、設置套接字選項和創(chuàng)建并填充相應協(xié)議頭這三個步驟,然后用send、WSASend函數(shù)將組裝好的數(shù)據發(fā)送出去[10]。接收的過程也很相似,只是需要用recv或WSARecv函數(shù)接收數(shù)據。2.4.1WSAStartup()函數(shù)Winsock的服務是以動態(tài)鏈接庫WinsockDLL形式實現(xiàn)的,必須先調用WSAStartup函數(shù)對WinsockDLL進行初始化,協(xié)商Winsock的版本支持,分配必要的資源。WSAStartup函數(shù)的原型如下:intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);其中,參數(shù)wVersionRequested用于指定準備加載的Winsock庫的版本,高字節(jié)指定Winsock庫的副版本,而低位字節(jié)則是主版本。lpWSAData參數(shù)是指向LPWSADATA結構的指針,該結構包含了加載的版本有關信息。2.4.2socket()函數(shù)使用套接字之前,必須使用socket()函數(shù)創(chuàng)建一個套接字對象,此函數(shù)調用成功將返回一個套接字對象。該函數(shù)原型如下:SOCKETsocket(intaf,inttype,intprotocol);其中,參數(shù)af用于指定網絡地址類型,在Internet域中,取AF_INET。參數(shù)type用于用于指定套接字類型,流式套接字取SOCK_STREAM,數(shù)據報套接字取SOCK_DGRAM,而本次系統(tǒng)取值SOCK_RAM,即原始套接字。參數(shù)protocol用于指定網絡協(xié)議,一般取0,表示默認為TCP/IP協(xié)議。2.4.3bind()函數(shù)通過調用bind()函數(shù)將本地地址綁定到所創(chuàng)建的套接字上以在網絡上標識該套接字。該函數(shù)原型如下:intbind(SOCKETs,conststructsockaddr*name,intnamelen);其中,第一個參數(shù)s標識一個未捆綁套接字的句柄。第三個參數(shù)namelen為地址的長度。第二個參數(shù)name是賦予套接字的地址,由structsocketaddr結構表示,結構如下:structsockaddr{u_shortsa_family;//設為AF_INET,表示socket處于Internet域charsa_data[14];//數(shù)據存儲};一般情況下,socketaddr_in結構更常用,在TCP/IP協(xié)議下,可以方便地通過強制類型轉換把sockaddr_in結構轉換為sockaddr結構。其結構格式如下:structsocketaddr_in{shorsin_family;//設為AF_INET,表示socket處于Internet域 unsingedshortsin_port;//端口號structin_addrsin_addr;//存儲一個4字節(jié)的地址數(shù)charsin_zear[8];//填充項,以保持同sockaddr結構長度一致};2.4.4WSAIoctl()函數(shù)該函數(shù)用于控制一個套接字的模式,函數(shù)的原型為:intWSAIoctl(SOCKETs,DWORDdwIoControlCode,LPVOIDlpvInBuffer,DWORDcbInBuffer,LPVOIDlpvOutBuffer,DWORDcbOutBuffer,LPDWORDlpcbBytesReturned,LPWSAOVERLAPPEDlpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);其中,參數(shù)s標識套接字描述字,參數(shù)dwIoControlCode為欲進行操作的控制代碼,參數(shù)lpvInBuffer表示輸入緩沖區(qū)的地址,參數(shù)cbInBuffer指定緩沖區(qū)的大小,參數(shù)lpvOutBuffer表示輸出緩沖區(qū)的地址,參數(shù)cbOutBuffer指定輸出緩沖區(qū)的大小,參數(shù)lpcbBytesReturned用于輸出實際字節(jié)數(shù)的地址,參數(shù)lpOverlapped為WSAOVERLAPPED結構的地址,參數(shù)lpCompletionRoutine指向操作結束后調用的例程指針。2.4.5recv()函數(shù)使用該函數(shù)來接收我們想要的數(shù)據包,函數(shù)的原型為:intrecv(SOCKETs,char*buf,intlen,intflags);其中,參數(shù)s為準備接收數(shù)據的套接字。第二個參數(shù)buf是即將收到數(shù)據的字符緩沖區(qū),而len是準備接收的字節(jié)數(shù)。Flags參數(shù)可以是0、MSG_PEEK或MSG_OOB或這些標志的按位“或”運算,0表示無特殊行為;MSG_PEEK使有用的數(shù)據復制到所提供的接收端緩沖區(qū)內,但沒有從系統(tǒng)緩沖區(qū)中將其刪除。recv函數(shù)返回發(fā)送字節(jié)數(shù)。2.5網絡編程接口在網絡中相互通信的主機其實質是主機中相對應的進程或者線程之間的通信。首先,他們要遵循統(tǒng)一的網絡協(xié)議。其次,進程或者線程與網絡協(xié)議之間的數(shù)據傳輸是通過網絡編程接口來實現(xiàn)的,而網絡協(xié)議則是依靠操作系統(tǒng)將數(shù)據最終送到傳輸介質上[11],如下圖2.4所示。圖2.4進程、網絡協(xié)議、網絡編程接口關系第三章系統(tǒng)整體分析與設計3.1基本情況分析網絡服務飛速發(fā)展,但同時網絡的安全問題也迫在眉睫,本系統(tǒng)通過對局域網的數(shù)據進行捕獲分析,可以分析網絡中存在的安全問題及流量查看。同時通過實踐來提高自己的動手能力。本系統(tǒng)適用于通過以太網和共享HUB的上網方式對局域網中的數(shù)據進行捕獲分析。其目的通過此監(jiān)控平臺,提高上網的安全控制。3.2程序需求概述3.2.1設計目標通過學習數(shù)據包捕獲相關知識,以及借鑒國內外的成功經驗,完成一個基本的局域網抓包分析工具,以幫助管理員及時發(fā)現(xiàn)局域網網絡中的異常,做出正確處理。3.2.2功能需求能夠捕獲流經本機網卡上的所有數(shù)據包。能夠對捕獲的數(shù)據包進行分析,分析的結果以列表形式顯示。提供直觀的數(shù)據流量統(tǒng)計圖。提供IP數(shù)據包分析結果以日志的形式保存功能。3.2.3用戶特點由于用戶不一定為具有相關專業(yè)知識,因此,需要提供一個友好的操作界面,簡單的操作步驟和盡可能全面的出錯提示。3.2.4制約因素以太網環(huán)境主要分為兩種,共享以太網和交換以太網。在共享式以太網中的典型代表是使用10Base5的總線型網絡和以集線器(HUB)為核心的星型網絡。集線器工作在物理層。在使用集線器的以太網中,集線器將很多以太網設備集中到一臺中心設備上,這些設備都連接到集線器中的同一物理總線結構中。從本質上講,以集線器為核心的以太網同原先的總線型以太網無根本區(qū)別,集線器并不處理或檢查其上的通信量,僅通過將一個端口接收的信號重復分發(fā)給其他端口來擴展物理介質。所有連接到集線器的設備共享同一介質,其結果是它們也共享同一沖突域、廣播和帶寬。因此集線器和它所連接的設備組成了一個單一的沖突域。如果一個節(jié)點發(fā)出一個廣播信息,集線器會將這個廣播傳播給所有同它相連的所有節(jié)點,因此它也是一個單一的廣播域。當局域網內的主機通過HUB連接時,HUB的作用就是局域網上面的一個共享的廣播媒體,所有通過局域網發(fā)送的數(shù)據首先被送到HUB,然后HUB將接收到的所有數(shù)據向它的每個端口轉發(fā)。因此我們只要將某臺主機的網卡設置為混雜模式,就可以接收到局域網內所有主機間的數(shù)據流量。而在交換式以太網中,交換機根據收到數(shù)據幀中的源MAC地址建立該地址同交換機端口的映射,并將其寫入MAC地址表中。當有數(shù)據包發(fā)送到交換機時,交換機會將數(shù)據包中的目的MAC地址與自己維護的MAC地址端口映射表中的數(shù)據進行對照,然后將數(shù)據包發(fā)送到對應的端口上。對交換機而言,僅有兩種情況會發(fā)送廣播,一是數(shù)據包的目的MAC地址不在交換機維護的數(shù)據庫中,此時數(shù)據包向所有端口轉發(fā),這一過程稱之為泛洪(flooding);二是數(shù)據包本身就是廣播包。不同于工作在物理層的集線器,交換機是工作在數(shù)據鏈路層的。由于端口間的傳遞的數(shù)據幀彼此屏蔽,因此節(jié)點就不擔心自己發(fā)送的幀在通過交換機時是否會與其他節(jié)點發(fā)送的幀產生沖突。交換機將沖突隔絕在每一個端口(每個端口都是一個沖突域),避免了沖突的擴散。因此,基于交換機以太網建立的局域網并不是真正的廣播媒體,交換機限制了被動監(jiān)聽工具所能截獲的數(shù)據。因此,要捕獲數(shù)據包就必須將捕包系統(tǒng)運行在網關或路由器上,如果想在網段的任意一臺主機上實現(xiàn)捕包功能,就需要采取其它的方法,如端口鏡像,MAC洪泛法,ARP欺騙(黑客經常會以此方法進行攻擊和竊取數(shù)據)。而作為本次的學習研究對象,選取的是共享以太網,也就是說本系統(tǒng)在交換以太網中就無能為力了。3.3概要設計3.3.1概要設計目標理清程序邏輯,劃分程序模塊,明確模塊之間的調用關系,盡量做到高內聚低耦合。程序內部代碼要有一定的封裝性,也要有一定的可移植性,因為這個程序的功能也可以成為一個較大程序的一部分,所以對移植性和擴展要有一定的要求。3.3.2系統(tǒng)功能模塊劃分依據需求分析中的功能需求,系統(tǒng)將要實現(xiàn)的功能如下,同時每個功能包含了一個或多個模塊:數(shù)據捕獲,這個是本系統(tǒng)的核心,用于捕獲IP數(shù)據包,由數(shù)據包捕獲模塊組成。數(shù)據包分析,截獲到了數(shù)據包后還不能直接使用,需要按照相關協(xié)議頭來完成有效信息提取功能,這個功能包括數(shù)據包定義模塊和數(shù)據包拆包模塊。數(shù)據信息顯示,本程序意在提供給用戶一個簡單易用的操作界面,該功能由程序初始化模塊、數(shù)據顯示模塊和圖形統(tǒng)計模塊組成。數(shù)據讀寫,為方便用戶日后對數(shù)據包進行進一步分析,可將數(shù)據包保存到日志文件內,并可以將日志內文件重新加入程序分析中,該功能能包含在文件讀寫模塊中。線程控制,程序開始后,系統(tǒng)將不停的對數(shù)據包進行捕獲,而程序的控制權應該交由用戶來控制,因此,為了保護用戶的控制權,需要除主線程外,另外創(chuàng)建新的線程,新的線程用于數(shù)據包的捕獲、分析、停止等,而主線程則用于根據用戶的需要對新線程進行創(chuàng)建和監(jiān)視等任務。該功能包含線程創(chuàng)建模塊、線程停止模塊。3.3.3系統(tǒng)模塊描述抓包模塊根據RawSocket捕包方式,完成數(shù)據包的捕獲。新線程創(chuàng)建后,需執(zhí)行該模塊,是一個相對獨立的模塊。(2)數(shù)據包定義模塊根據相關協(xié)議,創(chuàng)建IP,TCP等協(xié)議頭的數(shù)據結構,是數(shù)據包分析功能的重要一部分。(3)數(shù)據包拆包模塊利用截獲的數(shù)據包,根據已定義的協(xié)議頭數(shù)據結構,提取IP地址,通信端口,數(shù)據包大小等信息。主要是根據數(shù)據包捕獲模塊提供的數(shù)據,參照數(shù)據包定義模塊的數(shù)據結構來完成該功能。(4)數(shù)據顯示模塊將分析數(shù)據包后的信息使用列表的信息顯示出來。主要是調用數(shù)據包分析模塊中得到的有用信息。(5)圖形統(tǒng)計模塊根據捕獲到的數(shù)據包,提供按IP報頭、協(xié)議類型來統(tǒng)計數(shù)據包的流量信息。圖形統(tǒng)計模塊也需要數(shù)據包分析模塊提供信息。(6)文件讀寫模塊將捕獲到的數(shù)據包,根據需要保存到文件。并且可以將已保存的數(shù)據重新顯示到列表框中。線程控制模塊該模塊用于創(chuàng)建新線程和停止線程,新線程將調用數(shù)據包捕獲模塊捕獲數(shù)據包。按照用戶需求,當用戶需要停止捕獲數(shù)據包時,需要調用停止線程,停止數(shù)據包的捕獲。3.3.4功能模塊圖根據系統(tǒng)功能模塊劃分,其圖形描述如圖3.1。圖3.1程序功能模塊結構圖第四章系統(tǒng)詳細設計及實現(xiàn)4.1系統(tǒng)設計思想本系統(tǒng)將流經過本地網卡的數(shù)據包截取后,按照已知的數(shù)據包的格式進行拆包分析。系統(tǒng)的用戶操作層處理與后臺數(shù)據處理相分離,后臺數(shù)據的顯示層分別封裝在兩個類中,同時對數(shù)據包的截取和分析放在專門的處理類中,這樣,在程序運行的時候,當需要時就通過操作層調用后臺數(shù)據處理提供的接口函數(shù)即可。在程序運行的時候,主線程會調用類中相應的功能,通過后臺數(shù)據處理類的接口,先是初始化,然后抓包,再進行分析,再顯示到屏幕上,并完成相關統(tǒng)計,這些功能的都是在后臺數(shù)據處理類中新建的子線程下完成的,這樣做的原因是抓包是用一個無限循環(huán)進行的,如果不新建線程,一旦開始抓包,則程序就會進入“假死”,就不能進行其它的任何操作了,比如停止。在每次停止運行程序以后,用戶可以選擇保存當前數(shù)據,程序就會自動獲取當前日期和時間,將得到的數(shù)據存入文件中?;蛘?,用戶可以將之前保存的數(shù)據加載到顯示列表中去。4.2程序各模塊的詳細設計在概要設計時,已經對各模塊功能進行了詳細描述,但還未設計到各模塊的具體實現(xiàn),其具體實現(xiàn)設計如下:(1)抓包模塊:這個模塊和數(shù)據包拆包、線程創(chuàng)建、線程停止模塊聯(lián)系緊密,所以應該封裝到一個類里面。在外部調用的時候,只需要把這個在實例化一個對象,并且外的接口也只需要提供初始化、開始捕包、停止捕包接口即可,模塊的具體實現(xiàn)不需對外泄露。這個模塊內就是包含WSAStartup()函數(shù),Socket()函數(shù),bind()函數(shù),WSAIoctl()函數(shù),recv()函數(shù)。每個函數(shù)都有會有返回值,在這個模塊里也將判斷是不是每個函數(shù)都成功的執(zhí)行了,如果任意一個函數(shù)沒有成功執(zhí)行,那么整個程序的功能都無法實現(xiàn)。該程序就會提示出相應的出錯信息,以便能更快更準確的找到問題的所在。本模塊雖然是程序的核心部分,但是比較簡單,都是一些Socket提供的一些接口函數(shù),所以在實現(xiàn)起來也比較容易。 (2)數(shù)據包定義模塊:這個模塊是定義在一個頭文件里的,因為它其實是一個結構體(Struct)。該模塊沒什么別的特殊意義,IP數(shù)據報結構已在2.2.3節(jié)列出,同時為了能對端口進行分析,有必要對TCP協(xié)議結構,及UDP結構進行分析,TCP協(xié)議結構如下:typedefstruct_TCPHeader{ WORDSourPort; //源端口 WORDDestPort; //目的端口 DWORDSeqNo; //序列號 DWORDAckNo; //確認序列號 BYTEHLen; //頭部長度 BYTEFlag; //保留 WORDWndSize; //窗口 WORDChkSum; //校驗和 WORDUrgPtr; //緊急指針 _TCPHeader() { memset(this,0,sizeof(_TCPHeader));//初始化 }}TCPHeader,*PTCPHeader;UDP協(xié)議結構如下:typedefstruct_UDPHeader{ WORDSourPort; //源端口 WORDDestPort; //目的端口 WORDLen; //報文長度 WORDChkSum; //校驗和 _UDPHeader() { memset(this,0,sizeof(_UDPHeader));//初始化 }}UDPHeader,*PUDPHeader; (3)數(shù)據包拆包模塊:本模塊也是寫在新創(chuàng)建的線程里,這樣做的目的是為了可以更方便的處理數(shù)據包。因為當上一個模塊抓取到數(shù)據后,就會直接調用這個模塊,這個模塊接收的數(shù)據從字符指針類型的數(shù)據強制轉換成我們定義的數(shù)據包結構類型,通過指針移動,及移位運算和按位與的方法,從數(shù)據包中提取出用戶想要的信息。(4)程序初始化模塊:本模塊是制作界面的,主要是通過分割窗口的方法,將主窗口分割成兩個窗口,一個主要是用于裝載列表框,表一定會有表頭,而表頭是固定的,所以會在初始化里就先將它加在界面上。另一個是圖形統(tǒng)計那里,初始化時,可以先將坐標和尺度先畫處理。(5)數(shù)據顯示模塊:本模塊是在單獨創(chuàng)建一個視圖類的中。在數(shù)據包拆包模塊執(zhí)行后,就會得到已經分析好的包內的所有信息,并通過SendMessage()函數(shù)向主程序發(fā)送數(shù)據達到通知,主程序將通過分割窗口時保存的函數(shù)指針,調用該模塊類中的函數(shù),這些得到的信息添加到已經初始化過的列表中,就這樣一個一個填,就可以把所有數(shù)據都顯示出來。(6)數(shù)據流繪圖模塊:得到數(shù)據包的數(shù)據后,會有一段數(shù)據是表示數(shù)據包長度的,通過這個就可以計算出當前的流量。每得到一個數(shù)據包,主程序都會通過SendMessage()函數(shù)將數(shù)據長度發(fā)給本模塊,本模塊就會將數(shù)據長度累加起來,然后通過事先調用SetTimer()函數(shù)設置的定時器,判斷是否需要重畫窗口,本窗口時程序初始化時分割的一個獨立的窗口,因此窗口重畫不會對其他窗口產生影響。定時器會每秒中啟動一次,每次調用繪圖函數(shù),這樣就可生成流量統(tǒng)計的折線圖。 (7)文件讀寫模塊:在程序停止抓包后,因為對前面的數(shù)據包的信息并沒有進行記錄,所以不能從內存中找到數(shù)據包信息而進行記錄。但是因為列表里的信息與數(shù)據包是一一對應的,所以就把表內的信息按照設定的格式完完全全的寫入文件中即可。這樣就完成了一次數(shù)據包的信息記錄。當然,記錄完數(shù)據后,也可以通過ifstream文件流將數(shù)據重新加入列表框中顯示分析。 (8)線程控制模塊:這個模塊是需要抓包模塊調用。當用戶點擊“開始捕包”菜單按鈕的時候,捕包模塊開始調用捕包初始化函數(shù),接著使用CreatThread()函數(shù)創(chuàng)建新的捕包線程。在用戶按下“停止捕包”菜單按鈕時,抓包模塊將調用該模塊,停止線程,停止數(shù)據包的捕獲。4.3系統(tǒng)類圖4.3.1系統(tǒng)類關系圖4.3.2關鍵類的說明CpackHandle:本類是本系統(tǒng)的關鍵類,窗口類對本類實例化就可以進行初始化套接字、抓取數(shù)據包、解析數(shù)據包等一系列操作。詳細說明見表4.1表4.1CpackHandle詳細說明表屬性和方法說明m_sockRaw原始數(shù)據套接字句柄m_eventDataArr數(shù)據到達通知事件m_hMyThread抓包線程句柄m_dwThreadID抓包線程IDm_nDataLen數(shù)據包長度Init()初始化Winsock2并且創(chuàng)建原始數(shù)據套接字DecodeUDPPack()對UDP數(shù)據包進行解析DecodeTCPPack()對TCP數(shù)據包進行解析ErrorNotify()錯誤通知DecodeIPPack()對IP數(shù)據包進行解析BindSocket()將套接字與本機綁定GetIPAdress()獲取本機IPInitWinsock2()初始化Winsock2CatchIPPack()抓取IP數(shù)據包CMainFrame:主窗口類,所有的界面操作都在這里進行,而通過界面的操作,來啟動一些后臺操作,如抓包,并將結果以列表、曲線顯示出來。詳細說明見表4.2表4.2CMainFrame詳細說明表屬性和方法說明IsRuning判斷抓包線程是否啟動m_IPPack保存當前數(shù)據包相關數(shù)據,方便加入列表顯示m_PackHandleCpackHandle的實例對象,用它啟動各項操作m_pFigureView用于曲線顯示的視圖m_pIPListView列表顯示視圖m_wndSplitter窗口切割對象,將窗口切割為列表視圖和曲線視圖CatchIPPack()通過m_PackHandle啟動抓包OnAddPack()將當前數(shù)據包的各項數(shù)據加入列表視圖OnClearList()清空列表視圖OnFileOpen()打開文件菜單的響應函數(shù)OnSaveData()保存菜單的響應函數(shù)OnStartPacket()開始捕包的響應函數(shù)OnStopPacket()停止捕包菜單的響應函數(shù)OnCatch()開始捕包CIPListView:列表視圖,將各個數(shù)據包在列表框中顯示。詳細說明見表4.3表4.3CIPListView詳細說明表屬性和方法說明m_lstIPInfoClistctrl控件AddPack()向列表框中添加數(shù)據項ClearList()清空列表框SaveIPData()將當前列表框的數(shù)據保存到文件中CFigureView:列表視圖,將各個數(shù)據包在列表框中顯示。詳細說明見表4.4表4.3CFigureView詳細說明表屬性和方法說明IPFlow保存需要畫的點m_nCurNum當前已經是第幾個點m_nLen數(shù)據包長度m_nTimeEvent計時器標示m_bIsRunning抓包線程是否啟動OnDraw()繪制曲線OnTime()計時器處理函數(shù)4.4系統(tǒng)流程圖圖4.1系統(tǒng)流程圖4.5安全控制進行系統(tǒng)的安全控制,主要是為了保證軟件的正常運行。一般而言,從數(shù)據環(huán)境和數(shù)據處理兩方面來看,影響系統(tǒng)安全的因素主要有環(huán)境性因素和數(shù)據處理因素。環(huán)境性因素,包括硬件和系統(tǒng)軟件、系統(tǒng)開發(fā)等方面。例如,硬件軟件方面,硬件失靈,系統(tǒng)軟件失靈,邏輯線路錯誤等;系統(tǒng)開發(fā)方面,沒有按科學的方法開發(fā)系統(tǒng)和設計程序、系統(tǒng)未經測試和調試等。數(shù)據處理因素,是指數(shù)據處理行為引起的各種情況。例如,處理環(huán)節(jié)使用了錯誤的程序、錯誤的數(shù)據文件,處理不及時,丟失數(shù)據文件和程序。因此,要進行系統(tǒng)的安全控制,應針對影響系統(tǒng)安全的兩方面因素入手,有的放矢,相應地進行環(huán)境和數(shù)據處理兩方面的有效控制,以保證系統(tǒng)安全有效地運行。本系統(tǒng)中主要使用的安全控制包括:(1)軟件運行系統(tǒng)環(huán)境由于目前Windows7系統(tǒng)與WindowsXP系統(tǒng)性的變化,而本程序的運行環(huán)境是WindowsXP,并不完全兼容Windows系統(tǒng)的各個版本,尤其在Window7系統(tǒng)中,如果不以管理員身份運用,則無法正常啟動抓包程序,因此,為了避免不必要的錯誤,程序中作了系統(tǒng)版本的判別,本程序定義了一個OSVERSIONINFO結構,通過在啟動抓包的時候,調用GetVersionEx()函數(shù),將系統(tǒng)版本信息及時存入OSVERSIONINFO結構中,進而比較出當前程序運行系統(tǒng)是否為WindowsXP,如果不是則提示用戶,由用戶來決定是否繼續(xù)運行本軟件。(2)初始化階段主要是套接字的初始化階段,包括創(chuàng)建套接字,綁定套接字,設置套接字等,如果其中一個環(huán)節(jié)出錯,為了避免不必要的錯誤,程序就不應該繼續(xù)進行下去,同時為了軟件的維護,通過WSAGetLastError()函數(shù)提示使用出現(xiàn)了的問題,并馬上返回,結束程序運行。(3)捕包階段之前也有提到過,通過使用多線程來防止系統(tǒng)崩潰。數(shù)據的使用與釋放數(shù)據使用前,應該養(yǎng)成初始化的好習慣,如果不進行初始化數(shù)據對應的內存值不一定為0或空,可能會出現(xiàn)亂碼,也有可能是其他程序未釋放的數(shù)據。本程序中TCP、IP等數(shù)據結構在使用前都使用了memset()函數(shù)清空內存,值得注意的是OSVERSIONINFO結構是必須清空的,否則無法獲取系統(tǒng)版本信息。另外,在資料釋放的時候,最好先判斷資源還是否存在,否則,可能系統(tǒng)會出現(xiàn)莫名其妙的錯誤,如在清空CListCtrl表時,如不使用GetSafeHwnd()判斷句柄是否有效,清空列表時將可能出現(xiàn)系統(tǒng)DebugAssertionFailed提示,這有時是一個很難發(fā)現(xiàn)的問題。4.6程序具體運行步驟軟件的使用者有可能是對計算機并不太熟悉,因此,本系統(tǒng)的操作設計的盡可能便于操作者使用,主要運行步驟如下:程序初始化:程序初始化是程序啟動啟動后,用戶最先看到的界面,此時,主要是主界面的現(xiàn)實,并沒有創(chuàng)建抓包線程,如圖4.2。圖4.2程序初始化主界面客戶區(qū)被分為兩大部分,上半部分即IP數(shù)據顯示區(qū)域,捕包后得到的數(shù)據將被添加到該區(qū)域,并以列表的形式動態(tài)的顯示。每得到一個新數(shù)據,就會顯示到最上面的一行,形成掃描的效果。下半部分即為實時流量統(tǒng)計分析部分,在這里,每秒鐘將進行一次流量統(tǒng)計,并以折線圖的形式呈現(xiàn)給用戶,效果見圖4.3。開始捕包程序開始之后,用戶可點擊菜單項中“捕包”的子菜單“開始捕包”操作,此時,主程序將調用數(shù)據包操作類中的捕包函數(shù)接口,并由該函數(shù)調用數(shù)據包操作類中的子函數(shù)來完成套接字環(huán)境的初始化和套接字的綁定、設置工作,在確認套接字環(huán)境初始化和綁定、設置工作無誤之后,該函數(shù)將創(chuàng)建一個新線程,該線程將調用recv()函數(shù)開始抓包,一旦數(shù)據到達,就被立即截取下來進行分析,分析結果存儲到數(shù)據包操作類中的成員變量結構體中,這個結構體地址及IP數(shù)據包數(shù)據長度將被一并通過SendMessage()發(fā)給主程序,主程序接收到消息后,將調用相關函數(shù),讓列表操作類和實時流量統(tǒng)計類來完成數(shù)據顯示區(qū)域和流量統(tǒng)計區(qū)域的工作。值得注意的是,在系統(tǒng)運行時,“服務類型”那一列為零,這是因為在IPv4版本中,服務類型是沒有用的,這個字段在IPv6將被使用。開始捕包的效果圖如下圖4.3。圖4.3開始捕包停止捕包程序開始之后,用戶隨時可點擊菜單項中“捕包”的子菜單“停止捕包”操作,這是主程序將判斷程序是否在運行,如果已停止,則直接返回,什么也不作,如果正在運行,主程序將調用數(shù)據包操作類的退出函數(shù),退出函數(shù)負責結束捕包線程,關閉套接字和釋放套接字環(huán)境的工作,這是由于沒有新的數(shù)據包捕獲,也就不會再向列表視圖類中添加新函數(shù)了,同時,主程序也將調用實時流量統(tǒng)計類的相關函數(shù),來停止計時器的運行和刷新流量統(tǒng)計視圖,這樣折線將不會繼續(xù)畫。停止捕包的效果圖實際和圖4.3相似,只是此時數(shù)據已停止加入列表框,統(tǒng)計圖也停止了。清空列表程序運行一段時間后,列表數(shù)據可能會過多,用戶可以清空列表數(shù)據,及點擊“捕包菜單”中的“清空列表項”,這樣主程序將調用列表視圖類中的清空列表的公有函數(shù),通過DeleteAllItems()函數(shù)清空列表框中的舊的數(shù)據,以便查看到最新的數(shù)據。清空列表的效果圖如下圖4.4。圖4.4清空列表文件保存用戶還未來得及處理的數(shù)據,可以通過點擊“文件”菜單中的“保存”項,將需要保存的數(shù)據保存到指定目錄下。文件保存格式如下圖4.5。圖4.5文件保存文件保存內容如圖4.6,文件保存的格式與列表的格式大致相同,只不過是以記事本的格式保存的。圖4.6文件保存內容文件打開用戶需要對保存的數(shù)據重新分析時,可以通過點擊“文件”菜單中的“打開文件”項,將保存好的數(shù)據重新加載到程序中的列表框中顯示出來。文件打開的效果圖如圖4.7。圖4.7文件打開第五章總結與展望5.1總結 本文主要討論了基于原始套接字的數(shù)據包的捕獲與分析技術。通過對本程序中的數(shù)據進行分析,可以分析出網絡中的異常,以便及時做出應對策略。但使用該工具仍然存在不足,由于目前以太網不同連接方式造成工作原理不一致,所以,本程序暫時只能支持采用集線器連接方式的局域網,而對于交換以太網,則需要采用額外的技術,而這些技術不在本次研究范圍之內,因此,對于交換以太網,本程序則無能為力了。另外,本程序需要將網卡設置成混雜模式,如果對于不支持混雜模式的網卡(特別是無線網卡,大部分無限網卡不支持混雜模式),程序可能無法得到預期效果。此外,通過本文的介紹,可對原始套接字的使用和TCP/IP協(xié)議基本結構有一個基本認識。本程序編碼及調試歷時兩個月,程序在WindowsXP平臺下由VisualC++6.0編譯調試通過。5.2展望隨著互聯(lián)網的飛速發(fā)展,信息與通信技術在多個領域取得了突破性進展,國防事業(yè),銀行系統(tǒng),通信電力行業(yè),電子商務領域及個人信息通過網絡得到了極大的便利。但是互聯(lián)網的發(fā)展,已經暴露出不可避免的缺點:易被攻擊,技術人員的好奇和技術恐怖主義使金融機構、企業(yè)、學校等單位很難避免。網絡安全也逐漸成為一個潛在的巨大問題,在其最簡單的形式中,它主要關心的是確保無關人員不能讀取,更不能修改傳送給其他接收者的信息,而黑客一般是通過截獲數(shù)據包并分析來取得數(shù)據信息的。另外,隨著信息與通信技術在多個領域的突破性發(fā)展,網絡通信方式已不再局限于傳統(tǒng)的有限網絡,無線網絡已成為市場熱點,無線網絡也從商場,公司單位向個人用戶擴展,這給用戶帶來方便的同時,也給網絡安全提出了更高的要求,攻擊者也同樣無需通過物理連線進行攻擊,而與此同時,很多監(jiān)控軟件還無法完全適應這種無線網絡中的監(jiān)控任務。另一方面,網絡數(shù)據結構也發(fā)生了很大變化,通信協(xié)議也在不斷完善,IPv6開始慢慢代替IPv4,這使得網絡管理環(huán)境也越來越復雜化。當然,人們創(chuàng)造網絡的目的是為了讓它更好的方便我們的生活,相信這一點在網絡的發(fā)展過程中是不會被偏離的,隨著科技的進步和對網絡的進一步認知,也許在不久的將來,一種新的網絡數(shù)據形式將出現(xiàn),這樣人們的網絡安全將得到進一步保障。參考文獻[1]趙新輝,李祥.捕獲數(shù)據包的方法[R].貴州大學計算機軟件與理論研究所,2004.[2]朱雁輝.Windows防火墻與網絡封包截獲技術[M].北京:電子工業(yè)出版社,2002.40~41.[3]劉波濤,趙剛,馮翠麗,唐樂.Sniffer原理解析及其WinPcap實現(xiàn)[J].華東交通大學學報,2005,10(5):96~99.[4]劉冠梅,張琴.網絡數(shù)據包捕獲研究[J].現(xiàn)代商貿工業(yè),2010,1(1):271~272.[5]汪曉平,鐘軍.VisualC++網絡通信協(xié)議分析與實現(xiàn)[M].北京:人民郵電出版社,2003.134~139.[6]陳堅,陳偉.VisualC++網絡高級編程[M].北京:人民郵電出版社,2001.7~11.[7](美)史蒂文斯(W.RichardStevens).TCP/IP詳解(卷1:協(xié)議)[M].北京:機械工業(yè)出版社,2008:27~29.[8]付東洋,周家紀.局域網出口檢測系統(tǒng)中數(shù)據包捕獲與分析[J].四川師范大學學報,2003,2(26):213~215.[9]王艷萍.Windows網絡與通信程序設計[M].北京:人民郵電出版社,2009.120~136.[10]尤文堅.利用RAWSOCKET捕獲網絡底層數(shù)據包的方法[J].廣西輕工業(yè),2007,11(11):56~57.[11]ErichGamma,RichardHelm,RalphJohn,Vlissides.DesignPatterns:ElementsofReusableObject-OrientedSoftware[M].ChinaMachinePress,2007.3[12]JeffreyRichter,ChristopheNasarre.WindowsviaC/C++[M].MicrosoftPress,2008[13]CraigHunt.NetworkAdministration[M].O'ReillyTaiwanPress,2006.3結束語在論文即將完成之際,從開始進入課題到論文的順利完成,有多少可敬的師長、同學、朋友給了我無言的幫助,在這里請接受我誠摯的謝意!最后感謝計算機科學與技術學院和我的母校——南華大學四年來對我的大力栽培。附錄//packHead.h#pragmaonce#include<string>usingnamespacestd;/*******************定義IP數(shù)據頭***********************/typedefstruct_IPHeader{ unsignedcharver_len; //版本+報頭長度 unsignedchartos; //服務類型 unsignedshortlen; //總長度 unsignedshortident; //信息包標志 unsignedshortflag_frag; //標志(3)+分段偏移(13) unsignedcharttl; //生命周期 unsignedcharproto; //協(xié)議 unsignedshortchecksum; //校驗和 unsignedintsrc; //源IP地址 unsignedintdst; //目的IP地址 _IPHeader() { memset(this,0,sizeof(_IPHeader)); }}IPHeader,*PIPHeader;/******************定義TCP數(shù)據頭**********************/typedefstruct_TCPHeader{ WORDSourPort; //源端口 WORDDestPort; //目的端口 DWORDSeqNo; //序列號 DWORDAckNo; //確認序列號 BYTEHLen; //頭部長度 BYTEFlag; //保留 WORDWndSize; //窗口 WORDChkSum; //校驗和 WORDUrgPtr; //緊急指針 _TCPHeader() { memset(this,0,sizeof(_TCPHeader)); }}TCPHeader,*PTCPHeader;/*****************定義UDP數(shù)據頭*********************/typedefstruct_UDPHeader{ WORDSourPort; //源端口 WORDDestPort; //目的端口 WORDLen; //報文長度 WORDChkSum; //校驗和 _UDPHeader() { memset(this,0,sizeof(_UDPHeader)); }}UDPHeader,*PUDPHeader;/****************定義ICMP數(shù)據頭******************/typedefstruct_ICMHeader{ BYTEType; //消息類型 BYTECode; //代碼域 WORDChkSum; //校驗和 _ICMHeader() { memset(this,0,sizeof(_ICMHeader)); }}ICMHeader,*PICMHeader;/***************定義捕包分析的數(shù)據結構*********/typedefstruct_IPPack{ stringver;//版本 stringlen;//報頭長度 stringtos;//服務類型 stringtotal_len;//總長度 stringident;//信息包標志 stringflag;//標志 stringfrag;//分段偏移 stringttl;//生命周期 stringproto;//協(xié)議 stringchecksum;//校驗和 stringsrc;//源IP地址 stringdst;//目的IP地址 stringsrcPort;//源端口 stringdestPort;//目的端口 _IPPack() { memset(this,0,sizeof(_IPPack)); }}IPPack,*PIPPack;//PackHandle.h:interfacefortheCPackHandleclass.//////////////////////////////////////////////////////////////////////////PackHandle.h#if!defined(AFX_PACKHANDLE_H__CFFFC3C4_22C3_4D7F_8C1A_1D681CF2CE73__INCLUDED_)#defineAFX_PACKHANDLE_H__CFFFC3C4_22C3_4D7F_8C1A_1D681CF2CE73__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include<string>usingnamespacestd;#include<winsock2.h>#pragmacomment(lib,"Ws2_32.lib")#include"PackHead.h"classCPackHandle{public: boolInit(void);//初始化捕包環(huán)境 intCatchIPPack(PIPPackpIPPack);//捕獲數(shù)據包 CPackHandle(); virtual~CPackHandle();private: staticDWORDWINAPIThreadProc(LPVOIDpParam);//數(shù)據處理線程 boolDecodeUDPPack(char*pData);//分析UDP數(shù)據包 boolDecodeTCPPack(char*pData);//分析TCP數(shù)據包 voidErrorNotify(char*szBuff);//出錯提示 boolDecodeIPPack(char*pData);//分析IP數(shù)據包 boolBindSocket(void);//創(chuàng)建套接字、設置套接字選項、綁定套接字 intGetIPAddress(DWORD&ipAddr);//獲取本機IP地址 boolInitWinsock2(void);//初始化套接字庫 SOCKETm_sockRaw;//套接字,捕獲原始套接字 WSAEVENTm_eventDataArr;//數(shù)據到達通知事件 IPPackm_IPPack;//保存捕獲的數(shù)據 HANDLEm_hMyThread;//捕包線程 DWORDm_dwThreadID;//線程ID號 intm_nDataLen;//數(shù)據長度public: voidExit(void);//停止捕包};#endif//!defined(AFX_PACKHANDLE_H__CFFFC3C4_22C3_4D7F_8C1A_1D681CF2CE73__INCLUDED_)//PackHandle.cpp:implementationoftheCPackHandleclass.////////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"ipanalyse.h"#include"PackHandle.h"#include<stdlib.h>#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)#defineBUFFER_SIZE(1024*8)#defineWM_ADDPACKINFO(WM_USER+100)////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////CPackHandle::CPackHandle(){ m_hMyThread=NULL; m_dwThreadID=0;}CPackHandle::~CPackHandle(){ TerminateThread(m_hMyThread,m_dwThreadID); m_hMyThread=NULL; m_dwThreadID=0; closesocket(m_sockRaw); m_nDataLen=0;// WSACloseEvent(m_eventDataArr); WSACleanup();}//初始化套接字庫boolCPackHandle::InitWinsock2(){ WORDwVersionRequested; WSADATAwsaData; interr; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) { /*Telltheuserthatwecouldnotfindausable*/ /*WinSockDLL.*/ returnfalse; } /*ConfirmthattheWinSockDLLsupports2.2.*/ /*NotethatiftheDLLsupportsversionsgreater*/ /*than2.2inadditionto2.2,itwillstillreturn*/ /*2.2inwVersionsincethatistheversionwe*/ /*requested.*/ if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2) { /*Telltheuserthatwecouldnotfindausable*/ /*WinSockDLL.*/ WSACleanup(); returnfalse; } returntrue;}//獲取本機IP地址intCPackHandle::GetIPAddress(DWORD&ipAddr){ charszHostName[256]={0}; structhostent*pHost=NULL; char*pszIP=NULL; if(gethostname(szHostName,sizeof(szHostName))!=0) { ErrorNotify(_T("獲取主機名出錯,Errorgethostname()")); return-1; } pHost=gethostbyname(szHostName); if(NULL==pHost) { ErrorNotify(_T("獲取本機IP地址出錯,Errorgethostbyname()")); return-1; } pszIP=inet_ntoa(*(in_addr*)pHost->h_addr_list[0]); ipAddr=inet_addr(pszIP); return0;}boolCPackHandle::BindSocket()//創(chuàng)建套接字、設置套接字選項、綁定套接字{ intrcvtimeo=5000;//接收套接字超時時間 sockaddr_insockAddr; DWORDdwIPAddr; DWORDdwOutBuffer[10]; DWORDdwInBuffer=1; DWORDdwBytesReturned=0; m_sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(INVALID_SOCKET==m_sockRaw) { ErrorNotify(_T("創(chuàng)建套接字失敗,Errorsocket()")); returnfalse; }/* if(SOCKET_ERROR==setsockopt(m_sockRaw,SOL_SOCKET,SO_RCVTIMEO,(constchar*)&rcvtimeo, sizeof(rcvtimeo))) { ErrorNotify(_T("設置套接字選項失敗,Errorsetsockopt()")); returnfalse; }*/ if(-1==GetIPAddress(dwIPAddr)) { returnfalse; } sockAddr.sin_addr.s_addr=dwIPAddr; sockAddr.sin_family=AF_INET; sockAddr.sin_port=htons(5000); if(SOCKET_ERROR==bind(m_sockRaw,(sockaddr*)&sockAddr,sizeof(sockAddr))) { ErrorNotify(_T("綁定套接字失敗,Errorbind()")); returnfalse; } //設置SIO_RCVALL控制代碼,以便接收所有的IP包 if(SOCKET_ERROR==WSAIoctl(m_sockRaw,SIO_RCVALL,&dwInBuffer,sizeof(dwInBuffer), &dwOutBuffer,sizeof(dwOutBuffer),&dwBytesReturned,NULL,NULL)) { ErrorNotify(_T("設置套接字控制碼失敗,ErrorWSAIoctl()")); returnfalse; } returntrue;}//解析捕獲的數(shù)據boolCPackHandle::DecodeIPPack(char*pData){ structin_addrina; PIPHeaderpIPHeader=(PIPHeader)pData; CStringstrTemp=_T(""); strTemp.Format("%d",pIPHeader->ver_len>>4); m_IPPack.ver=strTemp.GetBuffer(0);//獲取版本 strTemp.Format("%d",pIPHeader->ver_len&15); //獲取報頭長度 m_IPPack.len=strTemp.GetBuffer(0); strTemp.Format("%d",pIPHeader->tos); //獲取服務類型,如優(yōu)先級 m_IPPack.tos=strTemp.GetBuffer(0); strTemp.Format("%d",ntohs(pIPHeader->len)); //獲取總長度 m_IPPack.total_len=strTemp.GetBuffer(0); m_nDataLen=ntohs(pIPHeader->len)-4*(pIPHeader->ver_len&15); strTemp.Format("%d",ntohs(pIPHeader->ident)); //獲取信息包標志 m_IPPack.ident=strTemp.GetBuffer(0);strTemp.Format("%d",pIPHeader->flag_frag>>13); //獲取標志 m_IPPack.flag=strTemp.GetBuffer(0); strTemp.Format("%d",pIPHeader->flag_frag&0x1ff);//獲取分段偏移量 m_IPPack.frag=strTemp.GetBuffer(0); strTemp.Format("%d",pIPHeader->ttl); //獲取生命周期 m_IPPack.ttl=strTemp.GetBuffer(0); strTemp.Format("%d",ntohs(pIPHeader->checksum)); //獲取校驗和 m_IPPack.checksum=strTemp.GetBuf

溫馨提示

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

評論

0/150

提交評論