小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)_第1頁
小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)_第2頁
小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)_第3頁
小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)_第4頁
小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

小型網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn)摘要:隨著網(wǎng)絡(luò)技術(shù)的發(fā)展和網(wǎng)絡(luò)應(yīng)用的普及,越來越多的信息資源放在了互聯(lián)網(wǎng)上,網(wǎng)絡(luò)的安全性和可靠性顯得越發(fā)重要。因此對于能夠分析診斷網(wǎng)絡(luò),測試網(wǎng)絡(luò)性能與安全性的工具軟件的需求也越來越迫切。嗅探器就是能夠捕獲網(wǎng)絡(luò)報文的設(shè)備,嗅探器的正當(dāng)用處在于分析網(wǎng)絡(luò)的流量,以便找出所關(guān)心的網(wǎng)絡(luò)中潛在的問題。網(wǎng)絡(luò)管理者可以通過使用嗅探器捕獲網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包并對其進行分析,分析結(jié)果可供網(wǎng)絡(luò)安全分析之用。例如,假設(shè)網(wǎng)絡(luò)的某一段運行得不是很好,報文的發(fā)送比較慢,而我們又不知道問題出在什么地方,此時就可以用嗅探器來作出精確的問題判斷。嗅探器在功能和設(shè)計方面有很多不同。本文對嗅探器技術(shù)進行了簡要分析,研究了網(wǎng)絡(luò)數(shù)據(jù)包的捕獲機制。分析了嗅探的原理,利用原始套接字在windows平臺下實現(xiàn)了一個網(wǎng)絡(luò)嗅探器程序,完成了對數(shù)據(jù)包進行解包、分析數(shù)據(jù)包的功能。Socket是Windows下網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)接口,它允許兩個或多個應(yīng)用程序在相同機器上,或者是通過網(wǎng)絡(luò)互相交流。分析了網(wǎng)絡(luò)化嗅探器在實用中的若干問題及對策.初步進展和實驗表明了這一技術(shù)路線的可行性。關(guān)鍵詞:嗅探器;多線程;Socket;VisualC++6.0;MFC一、緒論(一)項目開發(fā)背景隨著計算機網(wǎng)絡(luò)的不斷普及,網(wǎng)絡(luò)管理的應(yīng)用需求越來越大,而嗅探器很早就在此領(lǐng)域發(fā)揮著重要的作用。嗅探器的種類繁多,有的是專門的某一個協(xié)議的分析器,有的則具有強大的功能,如非常著名的Ethereal,NetXRay和Sniffer等。而這些大型的嗅探器需要昂貴的價格購買,對于小型網(wǎng)絡(luò)則有“大材小用”之弊。所以,針對小型網(wǎng)絡(luò)的簡易實用的嗅探器應(yīng)運而生。這里,我們的網(wǎng)絡(luò)協(xié)議分析工具就是應(yīng)用于小型局域網(wǎng)的管理,對其進行基于數(shù)據(jù)抓包的監(jiān)控,包括本地局域網(wǎng)行為的實時查看,從而滿足小型局域網(wǎng)如學(xué)校機房,公司部門,政府單位等這樣規(guī)模的網(wǎng)絡(luò)的監(jiān)管及網(wǎng)絡(luò)信息獲取。(二)項目開發(fā)目標(biāo)本項目開發(fā)的目標(biāo)是開發(fā)出實用于規(guī)模不大的局域網(wǎng)的監(jiān)控于管理。監(jiān)控就是實時對網(wǎng)絡(luò)的行為進行監(jiān)視從而獲取采取控制行為所需的信息。管理是基于網(wǎng)絡(luò)信息的掌握而產(chǎn)生的,我們提供了本地網(wǎng)絡(luò)信息快速獲取的工具,域名查詢的實用工具,以觀察本地主機的行為,另外我們還提供了端口掃描的功能,使監(jiān)視能力更加強大。總之,我們的開發(fā)目標(biāo)是滿足小型網(wǎng)絡(luò)的信息獲取和行為監(jiān)管。二、相關(guān)技術(shù)(一)多線程編程多線程處理的優(yōu)點同步應(yīng)用程序的開發(fā)比較容易,但由于需要在上一個任務(wù)完成后才能開始新的任務(wù),所以其效率通常比多線程應(yīng)用程序低。如果完成同步任務(wù)所用的時間比預(yù)計時間長,應(yīng)用程序可能會不響應(yīng)。多線程處理可以同時運行多個過程。例如,文字處理器應(yīng)用程序在您處理文檔的同時,可以檢查拼寫(作為單獨的任務(wù))。由于多線程應(yīng)用程序?qū)⒊绦騽澐殖瑟毩⒌娜蝿?wù),因此可以在以下方面顯著提高性能:· 多線程技術(shù)使程序的響應(yīng)速度更快,因為用戶界面可以在進行其他工作的同時一直處于活動狀態(tài)?!?當(dāng)前沒有進行處理的任務(wù)可以將處理器時間讓給其他任務(wù)?!?占用大量處理時間的任務(wù)可以定期將處理器時間讓給其他任務(wù)。· 可以隨時停止任務(wù)?!?可以分別設(shè)置各個任務(wù)的優(yōu)先級以優(yōu)化性能。是否需要創(chuàng)建多線程應(yīng)用程序取決于多個因素。在以下情況下,最適合采用多線程處理:· 耗時或大量占用處理器的任務(wù)阻塞用戶界面操作?!?各個任務(wù)必須等待外部資源(如遠(yuǎn)程文件或Internet連接)。例如,用于跟蹤Web頁上的鏈接并下載滿足特定條件的文件的Internet應(yīng)用程序“robot”。這種應(yīng)用程序可以依次同步下載各個文件,也可以使用多線程同時下載多個文件。多線程方法比同步方法的效率高很多,因為即使在某些線程中遠(yuǎn)程Web服務(wù)器的響應(yīng)非常慢,也可以下載文件。多線程編程的難點當(dāng)多個線程之間有聯(lián)系的時候,線程之間的同步控制就會成為一個難點,因為沒有人能預(yù)期線程的被執(zhí)行。在一個合作型多任務(wù)系統(tǒng)中,操作系統(tǒng)必須得到程序的允許才能夠改變線程。但是在強制性多任務(wù)系統(tǒng)中,控制權(quán)被調(diào)度程序強制轉(zhuǎn)移,也因此兩個線程之間的執(zhí)行次序變得不可預(yù)期。這不可預(yù)期性造成了所謂的racecondition。由于資源是共享的,有時還會出現(xiàn)死鎖。(二)Socket編程Socket是Windows下網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)接口,它允許兩個或多個應(yīng)用程序在相同機器上,或者是通過網(wǎng)絡(luò)互相交流。這種Windows下的Socket簡稱Winsock,Winsock庫有兩個版本,Winsock1和Winsock2?,F(xiàn)在開發(fā)網(wǎng)絡(luò)應(yīng)用程序都使用Winsock2,需要在程序中包含頭文件Winsock2.h,它包含了絕大部分socket函數(shù)和相關(guān)結(jié)構(gòu)類型的聲明和定義。同時要添加的還有到WS2_32.lib庫的鏈接。包含必要的頭文件,設(shè)置好鏈接環(huán)境之后,便可進行編碼工作了。(1)TCP/IP的socket提供下列三種類型套接字。流式套接字(SOCK_STREAM):提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議(FTP)即使用流式套接字。數(shù)據(jù)報式套接字(SOCK_DGRAM):提供了一個無連接服務(wù)。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)(NFS)使用數(shù)據(jù)報式套接字。原始式套接字(SOCK_RAW):該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有服務(wù)中配置的新設(shè)備。(2)為了更好地說明套接字編程原理,下面給出幾個基本套接字系統(tǒng)調(diào)用說明。=1\*GB3①創(chuàng)建套接字──socket()

應(yīng)用程序在使用套接字前,首先必須擁有一個套接字,系統(tǒng)調(diào)用socket()向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下:SOCKETPASCALFARsocket(intaf,inttype,intprotocol);該調(diào)用要接收三個參數(shù):af、type、protocol。參數(shù)af指定通信發(fā)生的區(qū)域,UNIX系統(tǒng)支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是網(wǎng)際網(wǎng)區(qū)域。因此,地址族與協(xié)議族相同。參數(shù)type描述要建立的套接字的類型。參數(shù)protocol說明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的連接模式。根據(jù)這三個參數(shù)建立一個套接字,并將相應(yīng)的資源分配給它,同時返回一個整型套接字號。=2\*GB3②指定本地地址──bind()

當(dāng)一個套接字用socket()創(chuàng)建后,存在一個名字空間(地址族),但它沒有被命名。bind()將套接字地址(包括本地主機地址和本地端口地址)與所創(chuàng)建的套接字號聯(lián)系起來,即將名字賦予套接字,以指定本地半相關(guān)。其調(diào)用格式如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號)。參數(shù)name是賦給套接字s的本地地址(名字),其長度可變,結(jié)構(gòu)隨通信域的不同而不同。namelen表明了name的長度。如果沒有錯誤發(fā)生,bind()返回0。否則返回值SOCKET_ERROR。地址在建立套接字通信過程中起著重要作用,作為一個網(wǎng)絡(luò)應(yīng)用程序設(shè)計者對套接字地址結(jié)構(gòu)必須有明確認(rèn)識。例如,UNIXBSD有一組描述套接字地址的數(shù)據(jù)結(jié)構(gòu),其中使用TCP/IP協(xié)議的地址結(jié)構(gòu)為:structsockaddr_in{

shortsin_family;

/*AF_INET*/

u_shortsin_port;

/*16位端口號,網(wǎng)絡(luò)字節(jié)順序*/

structin_addrsin_addr;

/*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/

charsin_zero[8];

/*保留*/}=3\*GB3③建立套接字連接──connect()與accept()

這兩個系統(tǒng)調(diào)用用于完成一個完整相關(guān)的建立,其中connect()用于建立連接。無連接的套接字進程也可以調(diào)用connect(),但這時在進程之間沒有實際的報文交換,調(diào)用將從本地操作系統(tǒng)直接返回。這樣做的優(yōu)點是程序員不必為每一數(shù)據(jù)指定目的地址,而且如果收到的一個數(shù)據(jù)報,其目的端口未與任何套接字建立“連接”,便能判斷該端口不可操作。而accept()用于使服務(wù)器等待來自某客戶進程的實際連接。

connect()的調(diào)用格式如下:intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s是欲建立連接的本地套接字描述符。參數(shù)name指出說明對方套接字地址結(jié)構(gòu)的指針。對方套接字地址長度由namelen說明。

如果沒有錯誤發(fā)生,connect()返回0。否則返回值SOCKET_ERROR。在面向連接的協(xié)議中,該調(diào)用導(dǎo)致本地系統(tǒng)和外部系統(tǒng)之間連接實際建立。由于地址族總被包含在套接字地址結(jié)構(gòu)的前兩個字節(jié)中,并通過socket()調(diào)用與某個協(xié)議族相關(guān)。因此bind()和connect()無須協(xié)議作為參數(shù)。accept()的調(diào)用格式如下:SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);

參數(shù)s為本地套接字描述符,在用做accept()調(diào)用的參數(shù)前應(yīng)該先調(diào)用過listen()。addr指向客戶方套接字地址結(jié)構(gòu)的指針,用來接收連接實體的地址。addr的確切格式由套接字創(chuàng)建時建立的地址族決定。addrlen為客戶方套接字地址的長度(字節(jié)數(shù))。如果沒有錯誤發(fā)生,accept()返回一個SOCKET類型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept()用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶方的地址信息。調(diào)用前,參數(shù)addr指向一個初始值為空的地址結(jié)構(gòu),而addrlen的初始值為0;調(diào)用accept()后,服務(wù)器等待從編號為s的套接字上接受客戶連接請求,而連接請求是由客戶方的connect()調(diào)用發(fā)出的。當(dāng)有連接請求到達(dá)時,accept()調(diào)用將請求連接隊列上的第一個客戶方套接字地址及長度放入addr和addrlen,并創(chuàng)建一個與s有相同特性的新套接字號。新的套接字可用于處理服務(wù)器并發(fā)請求。=4\*GB3④四個套接字系統(tǒng)調(diào)用,socket()、bind()、connect()、accept(),可以完成一個完全五元相關(guān)的建立。socket()指定五元組中的協(xié)議元,它的用法與是否為客戶或服務(wù)器、是否面向連接無關(guān)。bind()指定五元組中的本地二元,即本地主機地址和端口號,其用法與是否面向連接有關(guān):在服務(wù)器方,無論是否面向連接,均要調(diào)用bind();在客戶方,若采用面向連接,則可以不調(diào)用bind(),而通過connect()自動完成。若采用無連接,客戶方必須使用bind()以獲得一個唯一的地址。以上討論僅對客戶/服務(wù)器模式而言,實際上套接字的使用是非常靈活的,唯一需遵循的原則是進程通信之前,必須建立完整的相關(guān)。監(jiān)聽連接──listen()

此調(diào)用用于面向連接服務(wù)器,表明它愿意接收連接。listen()需在accept()之前調(diào)用,其調(diào)用格式如下:intPASCALFARlisten(SOCKETs,intbacklog);參數(shù)s標(biāo)識一個本地已建立、尚未連接的套接字號,服務(wù)器愿意從它上面接收請求。backlog表示請求連接隊列的最大長度,用于限制排隊請求的個數(shù),目前允許的最大值為5。如果沒有錯誤發(fā)生,listen()返回0。否則它返回SOCKET_ERROR。listen()在執(zhí)行調(diào)用過程中可為沒有調(diào)用過bind()的套接字s完成所必須的連接,并建立長度為backlog的請求連接隊列。調(diào)用listen()是服務(wù)器接收一個連接請求的四個步驟中的第三步。它在調(diào)用socket()分配一個流套接字,且調(diào)用bind()給s賦于一個名字之后調(diào)用,而且一定要在accept()之前調(diào)用。accept()調(diào)用為實現(xiàn)并發(fā)服務(wù)提供了極大方便,因為它要返回一個新的套接字號=5\*GB3⑤數(shù)據(jù)傳輸──send()與recv()

當(dāng)一個連接建立以后,就可以傳輸數(shù)據(jù)了。常用的系統(tǒng)調(diào)用有send()和recv()。send()調(diào)用用于在參數(shù)s指定的已連接的數(shù)據(jù)報或流套接字上發(fā)送輸出數(shù)據(jù),格式如下:intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);參數(shù)s為已連接的本地套接字描述符。buf指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)的指針,其長度由len指定。flags指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等。如果沒有錯誤發(fā)生,send()返回總共發(fā)送的字節(jié)數(shù)。否則它返回SOCKET_ERROR。recv()調(diào)用用于在參數(shù)s指定的已連接的數(shù)據(jù)報或流套接字上接收輸入數(shù)據(jù),格式如下:intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);參數(shù)s為已連接的套接字描述符。buf指向接收輸入數(shù)據(jù)緩沖區(qū)的指針,其長度由len指定。flags指定傳輸控制方式,如是否接收帶外數(shù)據(jù)等。如果沒有錯誤發(fā)生,recv()返回總共接收的字節(jié)數(shù)。如果連接被關(guān)閉,返回0。否則它返回SOCKET_ERROR。=6\*GB3⑥輸入/輸出多路復(fù)用──select()

select()調(diào)用用來檢測一個或多個套接字的狀態(tài)。對每一個套接字來說,這個調(diào)用可以請求讀、寫或錯誤狀態(tài)方面的信息。請求給定狀態(tài)的套接字集合由一個fd_set結(jié)構(gòu)指示。在返回時,此結(jié)構(gòu)被更新,以反映那些滿足特定條件的套接字的子集,同時,select()調(diào)用返回滿足條件的套接字的數(shù)目,其調(diào)用格式如下:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);參數(shù)nfds指明被檢查的套接字描述符的值域,此變量一般被忽略。參數(shù)readfds指向要做讀檢測的套接字描述符集合的指針,調(diào)用者希望從中讀取數(shù)據(jù)。參數(shù)writefds指向要做寫檢測的套接字描述符集合的指針。exceptfds指向要檢測是否出錯的套接字描述符集合的指針。timeout指向select()函數(shù)等待的最大時間,如果設(shè)為NULL則為阻塞操作。select()返回包含在fd_set結(jié)構(gòu)中已準(zhǔn)備好的套接字描述符的總數(shù)目,或者是發(fā)生錯誤則返回SOCKET_ERROR。使用TCP創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序稍微復(fù)雜一些,因為TCP是面向連接的協(xié)議,需要通信雙方首先建立一個連接,而UDP編程則相對簡單些。Winsock的編程步驟是比較固定的,一般分以下幾個步驟:套接字的創(chuàng)建和關(guān)閉;綁定套接字到指定的IP地址和端口號;設(shè)置套接字進入監(jiān)聽狀態(tài);接受連接請求;收發(fā)數(shù)據(jù)。(三)MFC編程如果你曾經(jīng)使用過傳統(tǒng)的windows編程方法開發(fā)應(yīng)用程序,你會深刻地體會到,即使是開發(fā)一個簡單的windows應(yīng)用程序也需要對windows的編程原理有很深刻的認(rèn)識,同時也要手工編寫很多的代碼。因為程序的出錯率幾乎是隨著代碼長度的增加呈幾何級數(shù)增長的,這就使得調(diào)試程序變得非常困難。所以傳統(tǒng)的windows編程是需要極大的耐心和豐富的編程經(jīng)驗的。

近幾年來,面向?qū)ο蠹夹g(shù)無論是在理論還是實踐上都在飛速地發(fā)展。面向?qū)ο蠹夹g(shù)中最重要的就是“對象”的概念,它把現(xiàn)實世界中的氣球、自行車等客觀實體抽象成程序中的“對象”。這種“對象”具有一定的屬性和方法,這里的屬性指對象本身的各種特性參數(shù)。如氣球的體積,自行車的長度等,而方法是指對象本身所能執(zhí)行的功能,如氣球能飛,自行車能滾動等。一個具體的對象可以有許多的屬性和方法,面向?qū)ο蠹夹g(shù)的重要特點就是對象的封裝性,對于外界而言,并不需要知道對象有哪些屬性,也不需要知道對象本身的方法是如何實現(xiàn)的,而只需要調(diào)用對象所提供的方法來完成特定的功能。從這里我們可以看出,當(dāng)把面向?qū)ο蠹夹g(shù)應(yīng)用到程序設(shè)計中時,程序員只是在編寫對象方法時才需要關(guān)心對象本身的細(xì)節(jié)問題,大部分的時間是放在對對象的方法的調(diào)用上,組織這些對象進行協(xié)同工作。

MFC的英文全稱是MicrosoftFundationClasses,即微軟的基本類庫,MFC的本質(zhì)就是一個包含了許多微軟公司已經(jīng)定義好的對象的類庫,我們知道,雖然我們要編寫的程序在功能上是千差萬別的,但從本質(zhì)上來講,都可以化歸為用戶界面的設(shè)計,對文件的操作,多媒體的使用,數(shù)據(jù)庫的訪問等等一些最主要的方面。這一點正是微軟提供MFC類庫最重要的原因,在這個類庫中包含了一百多個程序開發(fā)過程中最常用到的對象。在進行程序設(shè)計的時候,如果類庫中的某個對象能完成所需要的功能,這時我們只要簡單地調(diào)用已有對象的方法就可以了。我們還可以利用面向?qū)ο蠹夹g(shù)中很重要的“繼承”方法從類庫中的已有對象派生出我們自己的對象,這時派生出來的對象除了具有類庫中的對象的特性和功能之外,還可以由我們自己根據(jù)需要加上所需的特性和方法,產(chǎn)生一個更專門的,功能更為強大的對象。當(dāng)然,你也可以在程序中創(chuàng)建全新的對象,并根據(jù)需要不斷完善對象的功能。

正是由于MFC編程方法充分利用了面向?qū)ο蠹夹g(shù)的優(yōu)點,它使得我們編程時極少需要關(guān)心對象方法的實現(xiàn)細(xì)節(jié),同時類庫中的各種對象的強大功能足以完成我們程序中的絕大部分所需功能,這使得應(yīng)用程序中程序員所需要編寫的代碼大為減少,有力地保證了程序的良好的可調(diào)試性。

最后要指出的是MFC類庫在提供的對象的各種屬性和方法都是經(jīng)過謹(jǐn)慎的編寫和嚴(yán)格的測試,可靠性很高,這就保證了使用MFC類庫不會影響程序的可靠性和正確性。(四)開發(fā)工具VisualC++簡介VisualC++是一個功能強大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出VisualC++1.0后,隨著其新版本的不斷問世,VisualC++已成為專業(yè)程序員進行軟件開發(fā)的首選工具。

雖然微軟公司推出了VisualC++.NET(VisualC++7.0),但它的應(yīng)用的很大的局限性,只適用于Windows2000,WindowsXP和WindowsNT4.0。所以實際中,更多的是以VisualC++6.0為平臺。

VisualC++6.0不僅是一個C++編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個名為DeveloperStudio的組件集成為和諧的開發(fā)環(huán)境。

VisualC++它大概可以分成三個主要的部分:

(1)DeveloperStudio,這是一個集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫著“MicrosoftVisualC++”,所以很多人理所當(dāng)然的認(rèn)為,那就是VisualC++了。其實不然,雖然DeveloperStudio提供了一個很好的編輯器和很多Wizard,但實際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會介紹。我們也知道,DeveloperStudio并不是專門用于VC的,它也同樣用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟。所以不要把DeveloperStudio當(dāng)成VisualC++,它充其量只是VisualC++的一個殼子而已。這一點請切記!

(2)MFC。從理論上來講,MFC也不是專用于VisualC++,BorlandC++,C++Builder和SymantecC++同樣可以處理MFC。同時,用VisualC++編寫代碼也并不意味著一定要用MFC,只要愿意,用VisualC++來編寫SDK程序,或者使用STL,ATL,一樣沒有限制。不過,VisualC++本來就是為MFC打造的,VisualC++中的許多特征和語言擴展也是為MFC而設(shè)計的,所以用VisualC++而不用MFC就等于拋棄了VisualC++中很大的一部分功能。但是,VisualC++也不等于MFC。

(3)PlatformSDK。這才是VisualC++和整個VisualStudio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,PlatformSDK是以MicrosoftC/C++編譯器為核心(不是VisualC++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到DeveloperStudio沒有編譯程序的功能,那么這項工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成VisualStudio的基石。三、需求分析(一)整體需求分析小型局域網(wǎng)的管理不可能使用Ethereal,NetXRay和Sniffer等大型嗅探器,但又需要有經(jīng)濟實用的網(wǎng)絡(luò)數(shù)據(jù)抓包及協(xié)議分析工具,這里,不僅要求此工具具有一般協(xié)議分析器的通用功能,即對網(wǎng)絡(luò)中的所有主機的嗅探和行為分析,而且要配備一些實用的網(wǎng)絡(luò)信息查詢輔助工具,包括內(nèi)網(wǎng)和外網(wǎng)的一些信息,使之有所聯(lián)系。具體應(yīng)用分析1.網(wǎng)絡(luò)抓包及協(xié)議分析需求分析如何對網(wǎng)絡(luò)中的所有行為做到實時監(jiān)控?這就需要對網(wǎng)絡(luò)中的所有數(shù)據(jù)包都能獲取繼而進行協(xié)議分析,這樣才能獲取有用的信息。所以在本軟件中此模塊為主題功能,即主要模塊,擔(dān)任對總體把握和實時監(jiān)控的功能。2.本地網(wǎng)絡(luò)信息獲取需求分析對于一個網(wǎng)管,獲取本地網(wǎng)絡(luò)的全部或一個地址段的一組包括IP地址,主機名,物理地址,用戶信息及其所在工作組的信息是非常有用的,甚至是必須的。基于這種需求,我們提供了這樣的工具,即本模塊所實現(xiàn)的具有獲取本地網(wǎng)絡(luò)信息功能的工具。 3.端口掃描需求分析網(wǎng)絡(luò)通信的最終地址就不僅僅是主機地址了,還包括可以描述進程的某種標(biāo)識符。為此,TCP/IP協(xié)議提出了協(xié)議端口(protocolport,簡稱端口)的概念,用于標(biāo)識通信的進程。網(wǎng)絡(luò)通信的最終地址就不僅僅是主機地址了,還包括可以描述進程的某種標(biāo)識符。為此,TCP/IP協(xié)議提出了協(xié)議端口的概念,用于標(biāo)識通信的進程。所以,掃描端口的信息對網(wǎng)絡(luò)行為的分析有著至關(guān)重要的作用。這里我們在主模塊的基礎(chǔ)上提供了功能更強大的端口掃描工具,具有主機選擇和端口號指定掃描功能。為網(wǎng)管提供更有針對性的掃描工具。4.域名查詢需求分析DNS是網(wǎng)絡(luò)信息更直觀,這里也是出于這種考慮,提供給使用者一個輔助查詢工具,相信它將對使用者有所助益。主要是考慮到軟件完善性而加入的小模塊。開發(fā)本軟件我們只需要至少兩臺可以互相通信(在一個網(wǎng)絡(luò)中)的計算機,而這樣的開發(fā)條件是很容易滿足的,所以本軟件的開發(fā)成本是非常低的。具有良好的經(jīng)濟性。(三)可行性研究1.技術(shù)方面VisualC++6.0提供了功能強大的開發(fā)平臺,使得程序界面的實現(xiàn)簡單、快速、標(biāo)準(zhǔn)。Winsock為Windows網(wǎng)絡(luò)編程提供了豐富的接口技術(shù),結(jié)合多線程技術(shù),使得此處的基于TCP/IP網(wǎng)絡(luò)編程具有良好的健壯性和強大的可擴展性。本軟件最后所生成的.EXE可執(zhí)行文件具有很好的可移植性。2.經(jīng)濟方面3.工作難點開發(fā)本軟件主要要研究和解決的問題有:1)、多線程編程使用多線程編程是為了使程序的響應(yīng)速度更快,在使用時應(yīng)注意避免出現(xiàn)資源競爭和死鎖的出現(xiàn)。2)Socket編程Socket編程主要提供標(biāo)準(zhǔn)的網(wǎng)絡(luò)編程接口,使得兩個或多個應(yīng)用程序在同一臺電腦上,或者是通過網(wǎng)絡(luò)相互交流。使得本軟件中基于IP協(xié)議的TCP、UTP、ICMP和ARP等協(xié)議的編程得以實現(xiàn)。3)界面設(shè)計界面中各個控件的布局以及消息響應(yīng)函數(shù)的編寫是貫穿整個工程的一項重要的工作。它也在整個工程設(shè)計的過程中耗費了我們很多經(jīng)歷。四、系統(tǒng)總體結(jié)構(gòu)設(shè)計(一)軟件模塊結(jié)構(gòu)設(shè)計1.軟件工作模式圖(客戶機)圖4.1工作模式圖2.軟件模塊結(jié)構(gòu)圖數(shù)據(jù)抓包及協(xié)議分析(主程序sniffer)數(shù)據(jù)抓包及協(xié)議分析(主程序sniffer)域名查詢端口掃描本地計算機信息瀏覽域名查詢端口掃描本地計算機信息瀏覽 圖4.2軟件結(jié)構(gòu)圖3.軟件設(shè)計結(jié)構(gòu)圖SSocket(),建立流式套接字,返回套接字句柄sListen。Bind(),關(guān)聯(lián)一個本地地址到套接字sListen。Listen(),設(shè)置backlog值,進入監(jiān)聽狀態(tài)。Socket(),建立流式套接字s。建立連接,accept函數(shù)返回,得到新的套接字,如sClient。Recv()/send(),在套接字sClient上收發(fā)數(shù)據(jù),直到完成交換。Closesocket(),關(guān)閉監(jiān)聽套接字sListen,服務(wù)結(jié)束。Closesocket(),關(guān)閉套接字s,結(jié)束TCP對話。Accept(),等待接受客戶連接請求。Closesocket(),關(guān)閉套接字sClient。Connect(),將套接字s與服務(wù)器連接。Recv()/send(),在套接字上收發(fā)數(shù)據(jù),直到完成交換。服務(wù)器方客戶方五、系統(tǒng)詳細(xì)設(shè)計(一)嗅探器1.嗅探器簡介嗅探器(snifffer)就是能夠捕獲網(wǎng)絡(luò)報文的設(shè)備。嗅探器的正當(dāng)用處在于分析網(wǎng)絡(luò)的流量,以便找出所關(guān)心的網(wǎng)絡(luò)中潛在的問題。例如,假設(shè)網(wǎng)絡(luò)的某一段運行得不是很好,報文的發(fā)送比較慢,而我們又不知道問題出在什么地方,此時就可以用嗅探器來作出精確的問題判斷。嗅探器在功能和設(shè)計方面有很多不同。有些只能分析一種協(xié)議,而另一些可能能夠分析幾百種協(xié)議。一般情況下,大多數(shù)的嗅探器至少能夠分析下面的協(xié)議:■標(biāo)準(zhǔn)以太網(wǎng)■TCP/IP■IPX■DECNet嗅探器通常是軟硬件的結(jié)合。專用的嗅探器價格非常昂貴。另一方面,免費的嗅探器雖然不需要花什么錢,但得不到什么支持。嗅探器與一般的鍵盤捕獲程序不同。鍵盤捕獲程序捕獲在終端上輸入的鍵值,而嗅探器則捕獲真實的網(wǎng)絡(luò)報文。嗅探器通過將其置身于網(wǎng)絡(luò)接口來達(dá)到這個目的——例如將以太網(wǎng)卡設(shè)置成雜收模式。(為了理解雜收模式是怎么回事,先解釋局域網(wǎng)是怎么工作的)。數(shù)據(jù)在網(wǎng)絡(luò)上是以很小的稱為幀(Ftame)的單位傳輸?shù)膸珊脦撞糠纸M成,不同的部分執(zhí)行不同的功能。(例如,以太網(wǎng)的前12個字節(jié)存放的是源和目的的地址,這些位告訴網(wǎng)絡(luò):數(shù)據(jù)的來源和去處。以太網(wǎng)幀的其他部分存放實際的用戶數(shù)據(jù)、TCP/IP的報文頭或IPX報文頭等等)。幀通過特定的稱為網(wǎng)絡(luò)驅(qū)動程序的軟件進行成型,然后通過網(wǎng)卡發(fā)送到網(wǎng)線上。通過網(wǎng)線到達(dá)它們的目的機器,在目的機器的一端執(zhí)行相反的過程。接收端機器的以太網(wǎng)卡捕獲到這些幀,并告訴操作系統(tǒng)幀的到達(dá),然后對其進行存儲。就是在這個傳輸和接收的過程中,嗅探器會造成安全方面的問題。每一個在LAN上的工作站都有其硬件地址。這些地址唯一地表示著網(wǎng)絡(luò)上的機器(這一點于Internet地址系統(tǒng)比較相似)。當(dāng)用戶發(fā)送一個報文時,這些報文就會發(fā)送到LAN上所有可用的機器。在一般情況下,網(wǎng)絡(luò)上所有的機器都可以“聽”到通過的流量,但對不屬于自己的報文則不予響應(yīng)(換句話說,工作站A不會捕獲屬于工作站B的數(shù)據(jù),而是簡單的忽略這些數(shù)據(jù))。如果某在工作站的網(wǎng)絡(luò)接口處于雜收模式,那么它就可以捕獲網(wǎng)絡(luò)上所有的報文和幀,如果一個工作站被配置成這樣的方式,它(包括其軟件)就是一個嗅探器。嗅探器可能造成的危害:■嗅探器能夠捕獲口令■能夠捕獲專用的或者機密的信息■可以用來危害網(wǎng)絡(luò)鄰居的安全,或者用來獲取更高級別的訪問權(quán)限事實上,如果你在網(wǎng)絡(luò)上存在非授權(quán)的嗅探器就以為著你的系統(tǒng)已經(jīng)暴露在別人面前了。一般我們只嗅探每個報文的前200到300個字節(jié)。用戶名和口令都包含在這一部分中,這是我們關(guān)心的真正部分。工人,也可以嗅探給定接口上的所有報文,如果有足夠的空間進行存儲,有足夠的那里進行處理的話,將會發(fā)現(xiàn)另一些非常有趣的東西。簡單的放置一個嗅探器賓將其放到隨便什么地方將不會起到什么作用。將嗅探器放置于被攻擊機器或網(wǎng)絡(luò)附近,這樣將捕獲到很多口令,還有一個比較好的方法就是放在網(wǎng)關(guān)上。如果這樣的話就能捕獲網(wǎng)絡(luò)和其他網(wǎng)絡(luò)進行身份鑒別的過程。這樣的方式將成倍地增加我們能夠攻擊的范圍。關(guān)于怎么抵御嗅探器的攻擊,有三種方法可能會有所作用:■檢測和消滅嗅探器■將數(shù)據(jù)隱藏,使嗅探器無法發(fā)現(xiàn)。■會話加密2.界面設(shè)計3.程序流程圖4.主要代碼分析在IpMonDlg.h中,首先定義一些協(xié)議相關(guān)的結(jié)構(gòu)和宏。另外還會申明一個線程函數(shù)為友員函數(shù),它負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)數(shù)據(jù)報。代碼及相關(guān)注釋如下://定義協(xié)議的名稱結(jié)構(gòu)typedefstruct_PROTN2T{ intproto; char*pprototext;}PROTN2T;//協(xié)議數(shù) #definePROTO_NUM11//IP頭結(jié)構(gòu)typedefstruct_IPHEADER{unsignedcharheader_len:4;unsignedcharversion:4;unsignedchartos;//服務(wù)類型unsignedshorttotal_len;//數(shù)據(jù)報大小unsignedshortident;//數(shù)據(jù)報標(biāo)識unsignedshortflags;unsignedcharttl;unsignedcharproto;//協(xié)議(IP,TCP,UDP等)unsignedshortchecksum;unsignedintsourceIP;unsignedintdestIP;}IPHEADER;這里附加IP包頭部結(jié)構(gòu)圖:16位16位版本IHL服務(wù)類型總長標(biāo)識標(biāo)志分段偏移生命期協(xié)議頭校驗和源地址目的地址選項(0或更多)#defineUDP_HEAD_LEN8 /*UDP頭部長度*/#definePSEUDO_HEAD_LEN12 #defineICMP_HEAD_LEN4 /*ICMP頭部長度*///TCP包頭部結(jié)構(gòu)structTCPPacketHead{ WORDSourPort; WORDDestPort; DWORDSeqNo; DWORDAckNo; BYTEHLen; BYTEFlag; WORDWndSize; WORDChkSum; WORDUrgPtr;};這里附加TCP包頭部結(jié)構(gòu)圖:16位16位源端口目的端口順序號確認(rèn)號TCP頭長(保留)7位URGACKPSHRSTSYNFIN窗口大小校驗和緊急指針可選項(0或更多的32位字)數(shù)據(jù)(可選項)//ICMP包頭部結(jié)構(gòu)structICMPPacketHead{ BYTEType; BYTECode; WORDChkSum;};//UDP包頭部結(jié)構(gòu)structUDPPacketHead{ WORDSourPort; WORDDestPort; WORDLen; WORDChkSum;};這里附加UDP包頭部結(jié)構(gòu)圖:16位16位源端口目的端口UDP長度UDP校驗和//監(jiān)聽線程函數(shù)friendUINTthreadFunc(LPVOIDp);為程序流程的清晰起見,去掉了錯誤檢查等保護性代碼。主要代碼實現(xiàn)清單為://檢查Winsock版本號,WSAData為WSADATA結(jié)構(gòu)對象

WSAStartup(MAKEWORD(2,2),&WSAData);

//創(chuàng)建原始套接字

sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW));

//設(shè)置IP頭操作選項,其中flag設(shè)置為ture,親自對IP頭進行處理

setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));

//獲取本機名

gethostname((char*)LocalName,sizeof(LocalName)-1);

//獲取本地IP地址

pHost=gethostbyname((char*)LocalName));

//填充SOCKADDR_IN結(jié)構(gòu)

addr_in.sin_addr=*(in_addr*)pHost->h_addr_list[0];//IP

addr_in.sin_family=AF_INET;

addr_in.sin_port=htons(57274);

//把原始套接字sock綁定到本地網(wǎng)卡地址上

bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));

//dwValue為輸入輸出參數(shù),為1時執(zhí)行,0時取消

DWORDdwValue=1;

//設(shè)置SOCK_RAW為SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL

//的定義為:#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)

ioctlsocket(sock,SIO_RCVALL,&dwValue);前面的工作基本上都是對原始套接字進行設(shè)置,在將原始套接字設(shè)置完畢,使其能按預(yù)期目的工作時,就可以通過recv()函數(shù)從網(wǎng)卡接收數(shù)據(jù)了,接收到的原始數(shù)據(jù)包存放在緩存RecvBuf[]中,緩沖區(qū)長度BUFFER_SIZE定義為65535。然后就可以根據(jù)前面對IP數(shù)據(jù)段頭、TCP數(shù)據(jù)段頭的結(jié)構(gòu)描述而對捕獲的數(shù)據(jù)包進行分析:while(true)

{

//接收原始數(shù)據(jù)包信息

intret=recv(sock,RecvBuf,BUFFER_SIZE,0);

if(ret>0)

{

//對數(shù)據(jù)包進行分析,并輸出分析結(jié)果

ip=*(IP*)RecvBuf;

tcp=*(TCP*)(RecvBuf+ip.HdrLen);

TRACE("協(xié)議:%s\r\n",GetProtocolTxt(ip.Protocol));

TRACE("IP源地址:%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));

TRACE("IP目標(biāo)地址:%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));

TRACE("TCP源端口號:%d\r\n",tcp.SrcPort);

TRACE("TCP目標(biāo)端口號:%d\r\n",tcp.DstPort);

TRACE("數(shù)據(jù)包長度:%d\r\n\r\n\r\n",ntohs(ip.TotalLen));

}

}其中,在進行協(xié)議分析時,使用了GetProtocolTxt()函數(shù),該函數(shù)負(fù)責(zé)將IP包中的協(xié)議(數(shù)字標(biāo)識的)轉(zhuǎn)化為文字輸出,該函數(shù)實現(xiàn)如下:#definePROTOCOL_STRING_ICMP_TXT"ICMP"

#definePROTOCOL_STRING_TCP_TXT"TCP"

#definePROTOCOL_STRING_UDP_TXT"UDP"

#definePROTOCOL_STRING_SPX_TXT"SPX"

#definePROTOCOL_STRING_NCP_TXT"NCP"

#definePROTOCOL_STRING_UNKNOW_TXT"UNKNOW"

……

CStringCSnifferDlg::GetProtocolTxt(intProtocol)

{

switch(Protocol){

caseIPPROTO_ICMP://1

returnPROTOCOL_STRING_ICMP_TXT;

caseIPPROTO_TCP://6

returnPROTOCOL_STRING_TCP_TXT;

caseIPPROTO_UDP://17

returnPROTOCOL_STRING_UDP_TXT;

default:

returnPROTOCOL_STRING_UNKNOW_TXT

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論