摘要:闡述了在共享式以太網(wǎng)中用Visual c++6.0實(shí)現(xiàn)的基于原始套接字技術(shù)的改進(jìn)網(wǎng)絡(luò)嗅探器實(shí)現(xiàn)。在設(shè)計(jì)上,除了捕獲數(shù)據(jù)包以外,還進(jìn)一步解析出應(yīng)用層協(xié)議,運(yùn)用模式匹配的KMP算法截獲相關(guān)的數(shù)據(jù)信息,并保存到本機(jī)文件中。
關(guān)鍵詞:共享式以太網(wǎng);Visual C++6.0;原始套接字;網(wǎng)絡(luò)嗅探器;KMP算法
0 引言
隨著計(jì)算機(jī)和網(wǎng)絡(luò)的普及,單獨(dú)工作、不需要與其他用戶交互的應(yīng)用程序越來越少了。展望未來的IT產(chǎn)業(yè),網(wǎng)絡(luò)將成為核心。而數(shù)據(jù)安全作為網(wǎng)絡(luò)中非常重要的一部分將越來越受到網(wǎng)絡(luò)設(shè)計(jì)人員的重視。本文就數(shù)據(jù)信息的監(jiān)控方面作一些探討。
1 Sniffer的設(shè)計(jì)原理
1.1原始套接字(Raw Socket)
套接字是一種很常用的網(wǎng)絡(luò)編程接口,應(yīng)用程序可以用它進(jìn)行網(wǎng)絡(luò)通信而不需要知道底層的細(xì)節(jié)。Raw Socket是允許訪問底層傳輸協(xié)議的一種套接字類型。原始套接字有兩種類型,第一種是在IP頭中使用預(yù)定義的協(xié)議,如ICMP;第二種是在IP頭中使用自定義的協(xié)議。Raw Socket提供管理下層傳輸?shù)哪芰?,所以它既可以用來進(jìn)行網(wǎng)絡(luò)安全維護(hù),也可能成為黑客竊取信息的有效手段。
1.2網(wǎng)絡(luò)嗅探器(Sniffer)
網(wǎng)絡(luò)嗅探器是一種常用的收集有用數(shù)據(jù)的工具,它在網(wǎng)絡(luò)安全方面扮演了很重要的角色。使用這種工具,可以監(jiān)視網(wǎng)絡(luò)的狀態(tài)、數(shù)據(jù)流動情況以及網(wǎng)絡(luò)上傳輸?shù)男畔ⅰR蛱鼐W(wǎng)安全系統(tǒng)公司ISS給Sniffer下的定義為:Sniffer是利用計(jì)算機(jī)的網(wǎng)絡(luò)接口截獲目的地為其他計(jì)算機(jī)的數(shù)據(jù)報(bào)文的一種工具。Sniffer只能抓取同一個物理網(wǎng)段內(nèi)的包,就是說,Sniffer和被監(jiān)聽的目標(biāo)中間不能有路由或其他屏蔽廣播包的設(shè)備。這一點(diǎn)很重要。
1.3設(shè)計(jì)原理分析
運(yùn)行Sniffer的主機(jī)要實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽必須滿足兩個條件:
其一,該主機(jī)的網(wǎng)卡必須工作在混雜模式下。通常的套接字程序只能響應(yīng)與自己MAC地址相匹配的,或是以廣播形式發(fā)出的數(shù)據(jù)幀,對于其他形式的數(shù)據(jù)幀網(wǎng)絡(luò)接口采取的動作就是直接丟棄。為了使網(wǎng)卡接收所有經(jīng)過它的數(shù)據(jù)包,要將其設(shè)置為混雜模式。在用戶模式下,對網(wǎng)卡混雜模式的設(shè)置是通過原始套接字來實(shí)現(xiàn)的。創(chuàng)建原始套接字之后,將它綁定到一個明確的本地地址,然后向套接字發(fā)送SIO_RCVALL控制命令,讓它接收所有的IP包,這樣網(wǎng)卡便進(jìn)入混雜模式了。
其二,傳輸?shù)臄?shù)據(jù)包能夠到達(dá)該主機(jī)。將以太網(wǎng)內(nèi)主機(jī)連在一起的設(shè)備主要有Hub和Switch。Hub是物理層設(shè)備,它僅是簡單地將收到的數(shù)據(jù)廣播到各個物理網(wǎng)線的接口,而不管這個數(shù)據(jù)包的目的MAC地址是什么。這樣的以太網(wǎng)稱之為共享式以太網(wǎng)。在共享式以太網(wǎng)中,只要將網(wǎng)卡設(shè)置為混雜模式就可以捕獲到經(jīng)過本地網(wǎng)絡(luò)地所有數(shù)據(jù)包了。Switch是數(shù)據(jù)鏈路層設(shè)備,它收到數(shù)據(jù)包后會檢查數(shù)據(jù)包的目的MAC地址,然后將該數(shù)據(jù)包發(fā)送到此MAC地址對應(yīng)的網(wǎng)卡上,其他主機(jī)是不會收到的。這樣的以太網(wǎng)稱之為交互式以太網(wǎng)。這時,如果想收到其他機(jī)器數(shù)據(jù)包的話,就要用到ARP欺騙技術(shù)。而這項(xiàng)技術(shù)涉及面很廣,不屬于本文所要討論的范圍。本文所要做的是在共享式以太網(wǎng)中實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽。
2 實(shí)現(xiàn)技術(shù)的程序設(shè)計(jì)
2.1程序的總體設(shè)計(jì)
程序的設(shè)計(jì)思想:—般的sniffer設(shè)計(jì)主要是捕獲經(jīng)過本機(jī)的IP包,并進(jìn)行解包,取出封包中的協(xié)議頭,源地址和目的地址等信息,并未捕獲所傳輸?shù)恼嬲龜?shù)據(jù)信息。而本程序設(shè)計(jì)的目的就是能根據(jù)用戶所感興趣的某些關(guān)鍵字對某個應(yīng)用層的協(xié)議(如:HTTP、FTP、SMTP等)進(jìn)行解析,取出用戶所感興趣的信息,并保存到本地機(jī)器上。因此本程序所要進(jìn)行的處理主要有三個:
(1)首先創(chuàng)建原始套接字,將它綁定到一個明確的本地地址,然后設(shè)置SIO_RcvALL控制代碼,最后進(jìn)入無限循環(huán),不斷調(diào)用recv函數(shù)接收經(jīng)過本地網(wǎng)卡的IP數(shù)據(jù)包;
(2)根據(jù)接收到的IP包,過濾出用戶感興趣的應(yīng)用層協(xié)議,取出其中的數(shù)據(jù)信息;
(3)判斷是否有用戶感興趣的信息,如果有,則存儲在某個文件中。
2.2監(jiān)聽程序的分析
在visual c++6.O中用winsock API函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽功能的步驟是比較固定的。圖1所示的流程圖是實(shí)現(xiàn)上述功能1的主要步驟。該流程圖基本上描述了監(jiān)聽程序的實(shí)現(xiàn)過程,所以本文就省略了具體的實(shí)現(xiàn)代碼。
圖1 網(wǎng)絡(luò)嗅探器通信流程
2.3協(xié)議解析函數(shù)的分析
void DecodePacket(char*pData)函數(shù)的主要功能就是根據(jù)用戶所關(guān)心的協(xié)議類型解析出相應(yīng)的數(shù)據(jù)包,其中pData參數(shù)表示所接收到的IP數(shù)據(jù)包。
以下是關(guān)鍵代碼描述:
//IPHeader是一個結(jié)構(gòu)體,描述了lP的頭結(jié)構(gòu),下面的
TCPHeader類似
IPHeader*plPHdr=(IPHeader*)pData:
//獲得IP的頭部長度,以便可以從JP數(shù)據(jù)包中取出TCP封包
jnt nHeaderLen=(plPHdr->iphVerLen Oxf)*sizeof(ULONG):
//根據(jù)IP報(bào)頭的協(xié)議部分判斷出上層是什么協(xié)議
switch(plPHdr->ipProtoc01)
{ case IPPROTO TCP://這里只以TCP為例,其他協(xié)議的實(shí)現(xiàn)
類似
//取出TCP封包,以做進(jìn)一步解析
{TCPHeader*pTCPHdr=(TCPHeader)(pData+nHeaderLen):
//根據(jù)端口號判斷應(yīng)用層協(xié)議類型
switch(::ntohs(pTCPHdr->destinationPort))
{ case 80://這里只以HTTP協(xié)議為例,其他協(xié)議的實(shí)現(xiàn)類似
//Checklnf0函數(shù)是用于搜索關(guān)鍵字的,主要用了模式匹配
的KMP算法
CheckInfo((char*)pTCPHdr+sizeof(TCPHeader),
szSourcelP,szDestlP):
……∥其他端口號的操作
}
}
}
2.4搜索關(guān)鍵字函數(shù)的分析
該函數(shù)的形參分別為應(yīng)用層數(shù)據(jù)的封包,源IP地址,目標(biāo)IP地址,當(dāng)封包中有和關(guān)鍵字相匹配的信息時,就將上述三個參數(shù)的信息寫入指定的文件中。而對封包信息進(jìn)行檢查主要是運(yùn)用了模式匹配的KMP算法,下面是一些主要的實(shí)現(xiàn)代碼。
void CheckInfo(char*pData,char*szSourceIP,charszDestlP)
{//szDest為需要監(jiān)視的關(guān)鍵字,pData為在網(wǎng)絡(luò)上傳輸?shù)男畔?/p>
int nDestLen=strlen(szDest,):int nSourceLen=strlen(pData);
//初始化源串和關(guān)鍵字比較的位置
int nSourcePos=0:Int nDestPos=0:
while(nSourcePos {if(nDestPos==0llpData[nSourcePos]==szDest[nDestPos]) {++nSourcePos;++nDestPos;) Else //當(dāng)匹配失敗時,源串下次比較的位置不變,而關(guān)鍵字下次要 比較的位置則由next //數(shù)組中對應(yīng)的數(shù)值來決定。next值表達(dá)的就是T關(guān)鍵字自 身部分匹配的性質(zhì)。 //這里省略了next數(shù)組的實(shí)現(xiàn),其實(shí)現(xiàn)類似與本函數(shù)的實(shí)現(xiàn)。 {nDestPos=next[nDestPos.1:} } if(nDestPos>=nDestLen) {……}//匹配成功,將所獲得的數(shù)據(jù)信息寫入到本地文件中 return 0: } 3 結(jié)束語 互聯(lián)網(wǎng)上大量使用的許多協(xié)議(如:HTTP、FTP、SMTP等)都是不加密的,本文正是基于這樣的一個事實(shí),利用一些相關(guān)的技術(shù)實(shí)現(xiàn)對網(wǎng)絡(luò)信息的監(jiān)視。在網(wǎng)絡(luò)安全非常重要的今天,網(wǎng)絡(luò)監(jiān)聽軟件所扮演的角色越來越不容忽視。 sniffcr既可以作為網(wǎng)絡(luò)故障的診斷工具,也可以被黑客作為嗅探和監(jiān)聽網(wǎng)絡(luò)的工具。所以,sniffer技術(shù)是一把雙刃劍,在了解了它的特性的基礎(chǔ)上,利用好它,可以給我們帶來方便。 注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。