從事網路安全的技術人員和相當一部分準黑客(指那些使用現成的黑客軟體進行攻擊而不是根據需要去自己編寫**的人)都一定不會對網路嗅探器(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資料段頭的結構描述而對捕獲的資料報進行分析:
while (true)
} 其中,在進行協議分析時,使用了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()巨集進行輸出,在除錯狀態下執行,得到的乙個分析結果如下:
協議: udp
tcp源埠號: 16707
tcp目標埠號:19522
資料報長度: 78
……協議: tcp
tcp源埠號: 19714
tcp目標埠號:10
資料報長度: 200
……從分析結果可以看出,此程式完全具備了嗅探器的資料捕獲以及對資料報的分析等基本功能。
小結本文介紹的以原始套接字方式對網路資料進行捕獲的方法實現起來比較簡單,尤其是不需要編寫vxd虛擬裝置驅動程式就可以實現抓包,使得其編寫過程變的非常簡便,但由於捕獲到的資料報頭不包含有幀資訊,因此不能接收到與 ip 同屬網路層的其它資料報, 如 arp資料報、rarp資料報等。在前面給出的示例程式中考慮到安全因素,沒有對資料報做進一步的分析,而是僅僅給出了對一般資訊的分析方法。通過本文的介紹,可對原始套接字的使用方法以及tcp/ip協議結構原理等知識有乙個基本的認識。
以原始套接字的方式 截獲流經本機網絡卡的IP資料報
以原始套接字的方式 截獲流經本機網絡卡的ip資料報 具體到程式設計實現上,這種對網絡卡混雜模式的設定是通過原始套接字 raw socket 來實現的,這也有別於通常經常使用的資料流套接字和資料報套接字。在建立了原始套接字後,需要通過setsockopt 函式來設定ip頭操作選項,然後再通過bind ...
使用Sniffer截獲流經本機網絡卡的IP資料報
win2k下的sniffer源 性質 vc完整應用程式 作者 zw ip包監聽程式 for 9x 源 詳細資訊 區域網 資料報 ip頭 tcp頭 或其他資訊頭 資料 資料在從應用層到達傳輸層時,將新增tcp資料段頭,或是udp資料段頭。其中udp資料段頭比較簡單,由乙個8位元組的頭和資料部分組成,具...
原始套接字的花花世界
icmp 通常去檢測乙個網路是否為通暢,例如ping乙個ip igmp 組播中的控制報文,控制協議 int socket af inet,sock raw,protocol 處理ip資料的套接字 int socket af packet,sock raw,protocol 處理乙太網資料報的套接字 ...