摘 要 本文介紹了網(wǎng)絡(luò)嗅探器軟件的功能,以及網(wǎng)絡(luò)嗅探軟件設(shè)計(jì)的原理,并以軟件設(shè)計(jì)的模塊化思想為主介紹了編寫(xiě)一個(gè)網(wǎng)絡(luò)嗅探軟件的總體設(shè)計(jì)思想以及主要代碼設(shè)計(jì),同時(shí)對(duì)涉及到的若干網(wǎng)絡(luò)編程知識(shí)以及一些網(wǎng)絡(luò)基本知識(shí)進(jìn)行了介紹。本文的最后也指出了此網(wǎng)絡(luò)嗅探軟件設(shè)計(jì)的另一個(gè)發(fā)展方向。
關(guān)鍵詞 網(wǎng)絡(luò)嗅探器 混雜模式 模塊化設(shè)計(jì)
1 引 言
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)系統(tǒng)對(duì)于整個(gè)社會(huì)的工作和建設(shè)發(fā)揮著越來(lái)越大的作用,網(wǎng)絡(luò)環(huán)境也變得越來(lái)越復(fù)雜,與此同時(shí)網(wǎng)絡(luò)系統(tǒng)的安全問(wèn)題也引起了我們的關(guān)注。設(shè)計(jì)數(shù)據(jù)包嗅探器的目的在于能夠使系統(tǒng)管理員運(yùn)用此類(lèi)軟件分析網(wǎng)絡(luò)流量以便更好地控制網(wǎng)絡(luò)。它能夠幫助系統(tǒng)管理人員迅速地找到問(wèn)題癥結(jié)所在(如網(wǎng)絡(luò)瓶頸、錯(cuò)誤配置等),它們通常被用來(lái)在網(wǎng)路上截取/閱讀位于OSI 協(xié)議模型中各個(gè)協(xié)議層次上的數(shù)據(jù)包。
2 網(wǎng)絡(luò)嗅探軟件的設(shè)計(jì)原理
嗅探器可以理解為一個(gè)安裝在計(jì)算機(jī)上的竊聽(tīng)設(shè)備,它可以用來(lái)竊聽(tīng)計(jì)算機(jī)在網(wǎng)絡(luò)上所產(chǎn)生的眾多的信息,可以竊聽(tīng)計(jì)算機(jī)程序在網(wǎng)絡(luò)上發(fā)送和接收到的數(shù)據(jù),用來(lái)接收在網(wǎng)絡(luò)上傳輸?shù)男畔ⅰ?/span>
很多計(jì)算機(jī)網(wǎng)絡(luò)采用的是“共享媒體"。也就是說(shuō),不必中斷他的通訊,并且配置特別的線路,再安裝嗅探器,幾乎可以在任何連接著的網(wǎng)絡(luò)上直接竊聽(tīng)到同一掩碼范圍內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)。這種竊聽(tīng)方式為“基于混雜模式的嗅探”(promiscuous mode)。
2.1 以太網(wǎng)的工作原理
以太網(wǎng)的數(shù)據(jù)傳輸是基于“共享”原理的:所有的同一本地網(wǎng)范圍內(nèi)的計(jì)算機(jī)共同接收到相同的數(shù)據(jù)包。這意味著計(jì)算機(jī)直接的通訊都是透明可見(jiàn)的。正是因?yàn)檫@樣的原因,以太網(wǎng)卡都構(gòu)造了硬件的“過(guò)濾器”,這個(gè)過(guò)濾器將忽略掉一切和自己無(wú)關(guān)的網(wǎng)絡(luò)信息。事實(shí)上是忽略掉了與自身MAC地址不符合的信息。嗅探程序正是利用了這個(gè)特點(diǎn),它把網(wǎng)卡設(shè)置為“混雜模式”。因此,嗅探程序就能夠接收到整個(gè)以太網(wǎng)內(nèi)的網(wǎng)絡(luò)數(shù)據(jù)信息了。
在以太網(wǎng)中所有的通訊都是廣播的,也就是說(shuō)通常在同一個(gè)網(wǎng)段的所有網(wǎng)絡(luò)接口都可以訪問(wèn)在物理媒體上傳輸?shù)乃袛?shù)據(jù),而每一個(gè)網(wǎng)絡(luò)接口都有一個(gè)唯一的硬件地址,這個(gè)硬件地址也就是網(wǎng)卡的MAC地址。大多數(shù)系統(tǒng)使用48比特的地址,這個(gè)地址用來(lái)表示
網(wǎng)絡(luò)中的每一個(gè)設(shè)備。一般來(lái)說(shuō)每一塊網(wǎng)卡上的MAC地址都是不同的,每個(gè)網(wǎng)卡廠家得到一段地址,然后用這段地址分配給其生產(chǎn)的每個(gè)網(wǎng)卡一個(gè)地址。在硬件地址和IP地址間使用ARP和RARP協(xié)議進(jìn)行相互轉(zhuǎn)換。
在正常的情況下,一個(gè)網(wǎng)絡(luò)接口應(yīng)該只響應(yīng)這樣的兩種數(shù)據(jù)幀:
① 與自己硬件地址相匹配的數(shù)據(jù)幀。
② 發(fā)向所有機(jī)器的廣播數(shù)據(jù)幀。
2.2 網(wǎng)卡的工作原理
在一個(gè)實(shí)際的系統(tǒng)中,數(shù)據(jù)的收發(fā)是由網(wǎng)卡來(lái)完成的。網(wǎng)卡接收到傳輸來(lái)的數(shù)據(jù),網(wǎng)卡內(nèi)的單片程序接收數(shù)據(jù)幀的目的MAC地址。根據(jù)計(jì)算機(jī)上的網(wǎng)卡驅(qū)動(dòng)程序設(shè)置的接收模式判斷該不該接收。認(rèn)為該接收就接收后產(chǎn)生中斷信號(hào)通知CPU;認(rèn)為不該接收就丟掉不管。所以不該接收的數(shù)據(jù),網(wǎng)卡就截?cái)嗔耍?jì)算機(jī)根本就不知道。CPU得到中斷信號(hào)產(chǎn)生中斷,操作系統(tǒng)就根據(jù)網(wǎng)卡的驅(qū)動(dòng)程序設(shè)置的網(wǎng)卡中斷程序地址調(diào)用驅(qū)動(dòng)程序接收數(shù)據(jù),驅(qū)動(dòng)程序接收數(shù)據(jù)后放入信號(hào)堆棧讓操作系統(tǒng)處理。
對(duì)于網(wǎng)卡一般有四種接收模式:
① 廣播方式:該模式下的網(wǎng)卡能夠接收網(wǎng)絡(luò)中的廣播信息。
② 組播方式:設(shè)置在該模式下的網(wǎng)卡能夠接收組播數(shù)據(jù)。
③ 直接方式:在這種模式下,只有目的網(wǎng)卡才能接收該數(shù)據(jù)。
④ 混雜模式:在這種模式下的網(wǎng)卡能夠接收一切通過(guò)它的數(shù)據(jù),而不管該數(shù)據(jù)是否是傳給它的。
數(shù)據(jù)包MAC |
接口配置模式 |
產(chǎn)生中斷,通知CPU |
產(chǎn)生中斷,通知CPU |
不處理,丟棄 |
本地接口硬件地址 |
廣播地址
|
其他硬件地址 |
混雜模式 |
非混合模式 |
數(shù)據(jù)包MAC |
接口配置模式 |
產(chǎn)生中斷,通知CPU |
產(chǎn)生中斷,通知CPU |
不處理,丟棄 |
數(shù)據(jù)包 |
2.3 網(wǎng)絡(luò)嗅探軟件的工作原理
根據(jù)以上的介紹,我們可以得出結(jié)論如下:
首先,在以太網(wǎng)中是基于廣播方式傳送數(shù)據(jù)的,也就是說(shuō),所有的物理信號(hào)都要經(jīng)過(guò)我的機(jī)器。再次,網(wǎng)卡可以置于一種模式叫混雜模式(promiscuous mode),在這種模式下工作的網(wǎng)卡能夠接收到一切通過(guò)它的數(shù)據(jù),而不管實(shí)際上數(shù)據(jù)的目的地址是不是它。這就是以下將要介紹的網(wǎng)絡(luò)嗅探軟件的工作的基本原理:讓網(wǎng)卡接收一切它所能接收的數(shù)據(jù)。
計(jì)算機(jī)直接所傳送的數(shù)據(jù),事實(shí)上是大量的二進(jìn)制數(shù)據(jù)。因此, 一個(gè)網(wǎng)絡(luò)竊聽(tīng)程序還必須也使用特定的網(wǎng)絡(luò)協(xié)議來(lái)分解嗅探到的數(shù)據(jù),嗅探器也就必須能夠識(shí)別出哪個(gè)協(xié)議對(duì)應(yīng)于這個(gè)數(shù)據(jù)片斷,只有這樣才能夠進(jìn)行正確的解碼。
3 網(wǎng)絡(luò)嗅探軟件的設(shè)計(jì)實(shí)現(xiàn)
該網(wǎng)絡(luò)嗅探軟件能夠從網(wǎng)絡(luò)上讀取數(shù)據(jù)包并且解析數(shù)據(jù)包報(bào)文頭中各字段的意義。能夠分析數(shù)據(jù)幀以及所使用的協(xié)議的類(lèi)型。
3.1 網(wǎng)絡(luò)嗅探軟件的模塊結(jié)構(gòu)
設(shè)計(jì)該網(wǎng)絡(luò)嗅探軟件可分為以下幾個(gè)步驟:
① 創(chuàng)建套接字
② 把網(wǎng)卡設(shè)置為混雜模式
③ 捕獲數(shù)據(jù)包
④ 分析數(shù)據(jù)包
3.2 模塊說(shuō)明
⑴ 該網(wǎng)絡(luò)嗅探軟件主要是運(yùn)用LINUX環(huán)境下的SOCKET編程。網(wǎng)絡(luò)的SOCKET數(shù)據(jù)傳輸是一種特殊的I/O, SOCKET也是一種文件描述符。該網(wǎng)絡(luò)嗅探軟件設(shè)計(jì)的目的是截獲所有的數(shù)據(jù)包,即包括所有的協(xié)議。
Socket()函數(shù)的定義式如下:
Sockfd = socket ( int family, int type, int protocol ) ;
第一個(gè)參數(shù)是地址類(lèi)型,如果選用AF UNIX, 是用于本機(jī)上不同進(jìn)程之間進(jìn)行通信,而設(shè)為AF INET 則是用于不同主機(jī)之間的通信;第二個(gè)參數(shù)即socket的類(lèi)型參數(shù),主要有4種參數(shù)類(lèi)型如下:
① SOCK DRAM:used for udp datagrams.
② SOCK STREAM:used for tcp packets.
③ SOCK RAW:used to bypass the transport layer and directly access the IP layer.
④ SOCK PACKET:this is linux specific, it is similuar to sock raw except it accesses the DATA LINK layer.
第三個(gè)參數(shù)是協(xié)議參數(shù),指定程序使用具體的協(xié)議。
在此程序中為截獲包含所有協(xié)議的數(shù)據(jù)包,故在程序的開(kāi)始就寫(xiě)語(yǔ)句:
#define PROTO htons (0x0003)/ *Ethernet code for all protol */
且在本程序中socket()函數(shù)的第二個(gè)參數(shù)選用sock packet。
⑵ 套接字創(chuàng)建成功之后,就可以選擇網(wǎng)絡(luò)接口并加以參數(shù)控制了。進(jìn)入第二個(gè)模塊:設(shè)置網(wǎng)卡于混雜模式。
在程序中有一個(gè)單獨(dú)的自定義函數(shù)是用來(lái)將網(wǎng)卡設(shè)置為混雜模式的。在這個(gè)模塊中主要是調(diào)用了ioctl 函數(shù),ioctl 函數(shù)是用來(lái)控制特殊文件的底層設(shè)備參數(shù)的,這些特殊文件通常是終端、套接字和接口。ioctl 函數(shù)的定義如下:
ioctl(sock, SIOCGIFFLAGS, &ifr )
ioctl()函數(shù)中第一個(gè)參數(shù)是一個(gè)打開(kāi)的原始套接字描述符“sock”,第二個(gè)參數(shù)是所要執(zhí)行的請(qǐng)求操作。這里,請(qǐng)求操作是“SIOCGIFFLAGS”,意思是獲取接口“etho”的標(biāo)記符。第三個(gè)參數(shù)是接口請(qǐng)求數(shù)據(jù)結(jié)構(gòu)的地址指針,該結(jié)構(gòu)中包含了所要進(jìn)行請(qǐng)求操作的接口名稱值。
⑶ 網(wǎng)絡(luò)接口設(shè)置為混雜模式以后,接著就可以接收數(shù)據(jù)包了, 進(jìn)入捕獲數(shù)據(jù)包的模塊。
recvfrom ( if_eth_fd, &ep, sizeof (ep), 0, &dest, &dlen );
這個(gè)函數(shù)要做的就是接收數(shù)據(jù),并把接收到的數(shù)據(jù)放入buffer中。
⑷ 在成功的接收到數(shù)據(jù)包后,程序?qū)⑦M(jìn)入下一個(gè)模塊:分析數(shù)據(jù)包。
這里要介紹一下有關(guān)的網(wǎng)絡(luò)基本知識(shí),首先介紹一下TCP/IP的分層:
在TCP/IP協(xié)議族中,有很多種協(xié)議。可用圖一簡(jiǎn)單概括TCP/IP協(xié)議族中不同層次的協(xié)議。如圖所示,由于TCP、UDP、ICMP和IGMP都要向IP傳送數(shù)據(jù),因此IP必須在生成的IP首部中加入某種標(biāo)識(shí),以表明數(shù)據(jù)屬于哪一層。為此,IP在首部中存入一個(gè)長(zhǎng)度為8 bit的數(shù)據(jù),稱作協(xié)議域。1表示為ICMP協(xié)議,2表示為IGMP協(xié)議,6表示為TCP協(xié)議,17表示為UDP協(xié)議。類(lèi)似地,許多應(yīng)用程序都可以使用TCP或UDP來(lái)傳送數(shù)據(jù)。運(yùn)輸層協(xié)議在生成報(bào)文首部時(shí)要存入一個(gè)應(yīng)用程序的標(biāo)識(shí)符。TCP和UDP都用一個(gè)16 bit的端口號(hào)來(lái)表示不同的應(yīng)用程序。TCP和UDP把源端口號(hào)和目的端口號(hào)分別存入報(bào)文首部中。網(wǎng)絡(luò)接口分別要發(fā)送和接收IP、ARP和RARP數(shù)據(jù),因此也必須在以太網(wǎng)的幀首部中加入某種形式的標(biāo)識(shí),以指明生成數(shù)據(jù)的網(wǎng)絡(luò)層協(xié)議。為此,以太網(wǎng)的幀首部也有一個(gè)16 bit的幀類(lèi)型域。
|
TCP |
UDP |
ICMP |
IP |
IGMP |
ARP |
硬件接口 |
RARP |
用戶進(jìn)程 用戶進(jìn)程 用戶進(jìn)程 用戶進(jìn)程 應(yīng)用層 運(yùn)輸層 網(wǎng)絡(luò)層 鏈路層
媒體
(圖一)
網(wǎng)絡(luò)嗅探程序在分析數(shù)據(jù)包這一階段正是根據(jù)了網(wǎng)絡(luò)的工作原理:在收到一個(gè)以太網(wǎng)數(shù)據(jù)幀時(shí),數(shù)據(jù)就開(kāi)始從協(xié)議棧中由底向上升,同時(shí)去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議盒都要去檢查報(bào)文首部中的協(xié)議標(biāo)識(shí),以確定接收數(shù)據(jù)的上層協(xié)議。這個(gè)過(guò)程即是分用。
4 進(jìn)一步的發(fā)展方向
還有很多的功能可以加入到本文所設(shè)計(jì)的軟件中,使其變得更加完整。它的另一個(gè)發(fā)展的方向就是進(jìn)一步更好的分析數(shù)據(jù)包中的數(shù)據(jù)部分,并能夠把分析出來(lái)的數(shù)據(jù)從ASCII碼轉(zhuǎn)換為自然語(yǔ)言,這就能夠給用戶帶來(lái)很大的方便。