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