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

2021-04-06 20:24:31 字數 3442 閱讀 1899

資料報

ip頭tcp頭(或其他資訊頭)

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

16位

16位

源埠目的埠

udp長度

udp校驗和

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

16位

16位源埠

目的埠

順序號確認號

tcp頭長

(保留)7位

urgack

pshrst

synfin

視窗大小

校驗和

緊急指標

可選項(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 程式設計實現網路嗅探器

引言 從事網路安全的技術人員和相當一部分準黑客 指那些使用現成的黑客軟體進行攻擊而不是根據需要去自己編寫 的人 都一定不會對網路嗅探器 sniffer 感到陌生,網路嗅探器無論是在網路安全還是在黑客攻擊方面均扮演了很重要的角色。通過使用網路嗅探器可以把網絡卡設定於混雜模式,並可實現對網路上傳輸的資料...

網路嗅探器

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

VC 實現資料報嗅探

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