VC 程式設計實現網路嗅探器

2021-04-02 18:44:04 字數 4577 閱讀 2482

引言

從事網路安全的技術人員和相當一部分準黑客(指那些使用現成的黑客軟體進行攻擊而不是根據需要去自己編寫**的人)都一定不會對網路嗅探器(sniffer)感到陌生,網路嗅探器無論是在網路安全還是在黑客攻擊方面均扮演了很重要的角色。通過使用網路嗅探器可以把網絡卡設定於混雜模式,並可實現對網路上傳輸的資料報的捕獲與分析。此分析結果可供網路安全分析之用,但如為黑客所利用也可以為其發動進一步的攻擊提供有價值的資訊。可見,嗅探器實際是一把雙刃劍。雖然網路嗅探器技術被黑客利用後會對網路安全構成一定的威脅,但嗅探器本身的危害並不是很大,主要是用來為其他黑客軟體提供網路情報,真正的攻擊主要是由其他黑軟來完成的。而在網路安全方面,網路嗅探手段可以有效地探測在網路上傳輸的資料報資訊,通過對這些資訊的分析利用是有助於網路安全維護的。權衡利弊,有必要對網路嗅探器的實現原理進行介紹。

嗅探器設計原理

具體到程式設計實現上,這種對網絡卡混雜模式的設定是通過原始套接字(raw socket)來實現的,這也有別於通常經常使用的資料流套接字和資料報套接字。在建立了原始套接字後,需要通過setsockopt()函式來設定ip頭操作選項,然後再通過bind()函式將原始套接字繫結到本地網絡卡。為了讓原始套接字能接受所有的資料,還需要通過ioctlsocket()來進行設定,而且還可以指定是否親自處理ip頭。至此,實際就可以開始對網路資料報進行嗅探了,對資料報的獲取仍象流式套接字或資料報套接字那樣通過recv()函式來完成。但是與其他兩種套接字不同的是,原始套接字此時捕獲到的資料報並不僅僅是單純的資料資訊,而是包含有 ip頭、 tcp頭等資訊頭的最原始的資料資訊,這些資訊保留了它在網路傳輸時的原貌。通過對這些在低層傳輸的原始資訊的分析可以得到有關網路的一些資訊。由於這些資料經過了網路層和傳輸層的打包,因此需要根據其附加的幀頭對資料報進行分析。下面先給出結構.資料報的總體結構:

資料報

ip頭

tcp頭(或其他資訊頭)

資料

資料在從應用層到達傳輸層時,將新增tcp資料段頭,或是udp資料段頭。其中udp資料段頭比較簡單,由乙個8位元組的頭和資料部分組成,具體格式如下:

16位

16位

源埠

目的埠

udp長度

udp校驗和

而tcp資料頭則比較複雜,以20個固定位元組開始,在固定頭後面還可以有一些長度不固定的可選項,下面給出tcp資料段頭的格式組成:

16位

16位

源埠

目的埠

順序號

確認號

tcp頭長

(保留)7位

urg

ack

psh

rst

syn

fin

視窗大小

校驗和

緊急指標

可選項(0或更多的32位字)

資料(可選項)

對於此tcp資料段頭的分析在程式設計實現中可通過資料結構_tcp來定義:

typedef struct _tcp tcp;

typedef tcp *lptcp;

typedef tcp unaligned * ulptcp;

在網路層,還要給tcp資料報新增乙個ip資料段頭以組成ip資料報。ip資料頭以大端點機次序傳送,從左到右,版本欄位的高位位元組先傳輸(sparc是大端點機;pentium是小端點機)。如果是小端點機,就要在傳送和接收時先行轉換然後才能進行傳輸。ip資料段頭格式如下:

16位

16位

版本 ihl

服務型別

總長 標識

標誌 分段偏移

生命期

協議 頭校驗和

源位址

目的位址

選項(0或更多)

同樣,在實際程式設計中也需要通過乙個資料結構來表示此ip資料段頭,下面給出此資料結構的定義:

typedef struct _ip;

byte servicetype; // 服務型別

word totallen; // 總長

word id; // 標識

union;

byte timetolive; // 生命期

byte protocol; // 協議

word hdrchksum; // 頭校驗和

dword srcaddr; // 源位址

dword dstaddr; // 目的位址

byte options; // 選項

} ip;

typedef ip * lpip;

typedef ip unaligned * ulpip;

在明確了以上幾個資料段頭的組成結構後,就可以對捕獲到的資料報進行分析了。

嗅探器的具體實現

根據前面的設計思路,不難寫出網路嗅探器的實現**,下面就給出乙個簡單的示例,該示例可以捕獲到所有經過本地網絡卡的資料報,並可從中分析出協議、ip源位址、ip目標位址、tcp源埠號、tcp目標埠號以及資料報長度等資訊。由於前面已經將程式的設計流程講述的比較清楚了,因此這裡就不在贅述了,下面就結合注釋對程式的具體是實現進行講解,同時為程式流程的清晰起見,去掉了錯誤檢查等保護性**。主要**實現清單為:

// 檢查 winsock 版本號,wsadata為wsadata結構物件

wsastartup(makeword(2, 2), &wsadata);

// 建立原始套接字

sock = socket(af_inet, sock_raw, ipproto_raw));

// 設定ip頭操作選項,其中flag 設定為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結構

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 繫結到本地網絡卡位址上

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

// dwvalue為輸入輸出引數,為1時執行,0時取消

dword dwvalue = 1;

// 設定 sock_raw 為sio_rcvall,以便接收所有的ip包。其中sio_rcvall

// 的定義為: #define sio_rcvall _wsaiow(ioc_vendor,1)

ioctlsocket(sock, sio_rcvall, &dwvalue);

前面的工作基本上都是對原始套接字進行設定,在將原始套接字設定完畢,使其能按預期目的工作時,就可以通過recv()函式從網絡卡接收資料了,接收到的原始資料報存放在快取recvbuf中,緩衝區長度buffer_size定義為65535。然後就可以根據前面對ip資料段頭、tcp資料段頭的結構描述而對捕獲的資料報進行分析:

其中,在進行協議分析時,使用了getprotocoltxt()函式,該函式負責將ip包中的協議(數字標識的)轉化為文字輸出,該函式實現如下:

#define protocol_string_icmp_txt "icmp"

#define protocol_string_tcp_txt "tcp"

#define protocol_string_udp_txt "udp"

#define protocol_string_spx_txt "spx"

#define protocol_string_ncp_txt "ncp"

#define protocol_string_unknow_txt "unknow"

…… cstring csnifferdlg::getprotocoltxt(int protocol)

最後,為了使程式能成功編譯,需要包含標頭檔案winsock2.h和ws2tcpip.h。在本示例中將分析結果用trace()巨集進行輸出,在除錯狀態下執行,得到的乙個分析結果如下:

小結

本文介紹的以原始套接字方式對網路資料進行捕獲的方法實現起來比較簡單,尤其是不需要編寫vxd虛擬裝置驅動程式就可以實現抓包,使得其編寫過程變的非常簡便,但由於捕獲到的資料報頭不包含有幀資訊,因此不能接收到與 ip 同屬網路層的其它資料報, 如 arp資料報、rarp資料報等。在前面給出的示例程式中考慮到安全因素,沒有對資料報做進一步的分析,而是僅僅給出了對一般資訊的分析方法。通過本文的介紹,可對原始套接字的使用方法以及tcp/ip協議結構原理等知識有乙個基本的認識。本文所述**在windows 2000下由microsoft visual c++ 6.0編譯除錯通過 .

VC 程式設計實現網路嗅探器

資料報 ip頭tcp頭 或其他資訊頭 資料資料在從應用層到達傳輸層時,將新增tcp資料段頭,或是udp資料段頭。其中udp資料段頭比較簡單,由乙個8位元組的頭和資料部分組成,具體格式如下 16位 16位 源埠目的埠 udp長度 udp校驗和 而tcp資料頭則比較複雜,以20個固定位元組開始,在固定頭...

網路嗅探器

網路嗅探器 把網絡卡設定成混雜模式,並可實現對網路上傳輸的資料報的捕獲與分析。原理 通常的套接字程式只能響應與自己mac位址相匹配的 或者是 廣播形式發出的資料幀,對於其他形式的資料幀網路介面採取的動作是直接丟棄 為了使網絡卡接收所有經過他的封包,要將其設定成混雜模式,通過原始套接字來實現。設定混雜...

VC 實現資料報嗅探

嗅探器 可以竊聽網路上流經的資料報。用集線器hub組建的網路是基於共享的原理的,區域網內所有的計算機都接收相同的資料報,而網絡卡構造了硬體的 過濾器 通過識別mac位址過濾掉和自己無關的資訊,嗅探程式只需關閉這個過濾器,將網絡卡設定為 混雜模式 就可以進行嗅探 用交換機switch組建的網路是基於 ...