嗅探器(sniffer)一直以來都是一種讓人惱火的黑客工具,因為它是一種靜態的攻擊軟體,它的存在不會留下任何痕跡,因此人們很難將它揪出來。可是,它的危害性卻又是相當大的(它就像乙個監視器,你的「一舉一動」都在它的監視之下,你說危害大不大)。所以,我們不能不要想個辦法出來檢查網路中是否存在sniffer,這是非常必要的。
1. sniffer原理
所謂知己知彼方能百戰不殆,要了解探測sniffer的方法,就先得了解sniffer的原理。首先,讓我們來看一看區域網中是怎樣傳輸資料的。當乙個資料報的目的地是區域網內的某台計算機時,此資料報將以廣播的形式被傳送到網內每一台計算機上。而每台計算機的網絡卡將分析資料報中的目的mac位址(即乙太網位址),如果此位址為本計算機mac位址或為廣播位址(ff-ff-ff-ff-ff-ff),那麼,資料報將被接收,而如果不是,網絡卡將直接將其丟棄。但是,這裡有乙個前提,就是接收端計算機的網絡卡是在正常模式下工作的。而如果網絡卡被設定為混雜模式,那麼它就可以接收所有經過的資料報了(當然也包括目的地不是本機的資料報)。就是說,只要是傳送到區域網內的資料報,都會被設定成混雜模式的網絡卡所接收!這也就是sniffer的基本原理了。至於sniffer的具體實現和一些細節,這裡就不多講了,大家有興趣可以參考相關資料。
2. 乙太網中傳輸的arp資料報
知道了sniffer的基本原理,現在,我們就要想想怎麼才能將區域網中隱藏的sniffer揪出來,這才是本篇文章的主題。這裡,我們需要自己構造arp資料報,所以,就先簡單介紹一下arp請求和應答資料報的結構:
typedef struct _et_header //乙太網頭部
et_header;
typedef struct _arp_header //arp頭部
arp_header;
以上就是網路中傳輸的arp資料報的結構了。至於結構中每個欄位所表示的具體含義以及如何初始化,超出了本文章的討論範圍,大家有興趣可以參看《tcp-ip協議詳解》一書。
3. 探測區域網中的sniffer
終於進入主題了。既然sniffer是一種靜態的黑軟,不會留下任何日誌,那麼我們就要主動的去探測它。鑑於sniffer的原理是設定網絡卡為混雜模式,那麼,我們就可以想辦法探測網路中被設定為混雜模式的網絡卡,以此來判斷是否存在sniffer。
這裡,讓我們再來看看計算機接收資料報的規則。前面已經講過,在正常模式下,首先由網絡卡判斷資料報的目的mac位址,如果為本機mac位址或為廣播位址,那麼資料報將被接收進入系統核心,否則將被丟棄。而如果網絡卡被設定為混雜模式,那麼所有的資料報都將直接進入系統核心。資料報到達系統核心後,系統還將進一步對資料報進行篩選:系統只會對目的mac位址為本機mac位址或廣播位址的資料報做出響應――如果接收到的是arp請求報文,那麼系統將回饋乙個arp應答報文。但是,不同的是,系統核心和網絡卡對廣播位址的判斷有些不一樣:以windows系統為例,網絡卡會判斷mac位址的所有六位,而系統核心只判斷mac位址的前兩位(win98甚至只判斷前一位),也就是說,對於系統核心而言,正確的廣播位址ff-ff-ff-ff-ff-ff和錯誤的廣播位址ff-ff-ff-ff-ff-fe是一樣的,都被認為是廣播位址,甚至ff-ff-00-00-00-00也會被系統核心認為是廣播位址!
寫到這裡,聰明的讀者大概已經知道該怎麼做了。如果我們構造乙個目的mac位址為ff-ff-ff-ff-ff-fe的arp請求報文,那麼,對於在正常工作模式下的網絡卡,資料報將被丟棄,當然也就不會回饋任何報文;而對於在混雜模式下網絡卡,資料報將被接收進入系統核心。而系統核心會認為這個mac位址是廣播位址,因此就會回饋乙個arp應答報文。這樣,我們就可以判斷出這台機器上存在sniffer了。
4. 主要原始碼分析
由以上分析可知,程式大概分為兩個模組,乙個是傳送偽裝廣播位址的arp請求報文,另乙個是接收回饋的arp應答報文並做出分析。我們就分別用兩個執行緒來實現。主線程負責傳送,監聽執行緒負責接收。
首先是建立乙太網頭部和arp頭部的結構:
★typedef struct _et_header //乙太網頭部
et_header;
typedef struct _arp_header //arp頭部
arp_header;
★然後是傳送arp請求報文的主線程,取得所有介面卡的名字。其中,「adapter_name」表示乙個用於存放介面卡名字的緩衝區,而這些介面卡名字將以unicode編碼方式存入此緩衝區中。unicode編碼方式就是用乙個字的空間(兩個位元組)來存放乙個字元。這樣,每個字元間自然會出現乙個'/0'。而兩個介面卡名字之間將會有乙個字為'/0'作為間隔。adapter_length:這個緩衝區的大小:
★if(packetgetadapternames((char*)adapter_name, &adapter_length)==false)
★開啟介面卡,此處我預設開啟第一塊介面卡:
★lpadapter=(lpadapter)packetopenadapter((lptstr)adapter_list[0]);
if (!lpadapter||(lpadapter->hfile==invalid_handle_value))★★
strtomac("00e06e41508f",s_mac); //"00e06e41508f"是筆者測試程式所用的本地機的網絡卡位址,測試者應將其改為測試機網絡卡位址
memcpy(et_header.eh_src,s_mac,6);
strtomac("fffffffffffe",d_mac); //目的實體地址設定為fffffffffffe。
memcpy(et_header.eh_dst,d_mac,6);
et_header.eh_type=htons(0x0806); //型別為0x0806表示這是arp包
arp_header.arp_hdr=htons(0x0001); //硬體位址型別乙太網位址
arp_header.arp_pro=htons(0x0800); //協議位址型別為ip協議
arp_header.arp_hln=6; //硬體位址長度為6
arp_header.arp_pln=4; //協議位址長度為4
arp_header.arp_opt=htons(0x0001); //標識為arp請求
arp_header.arp_spa=i***_addr("172.24.21.10"); //"172.24.21.10"是我測試程式所用的本地機的ip,測試者應將其改為測試機ip
memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=i***_addr(argv[1]);
memcpy(arp_header.arp_tha,et_header.eh_dst,6);
★傳送資料報:
★lppacket=packetallocatepacket(); //給packet結構指標分配記憶體
packetinitpacket(lppacket,buffer,512); //初始化packet結構指標
packetsetnumwrites(lpadapter,5); //設定傳送次數
packetsendpacket(lpadapter,lppacket,true);//傳送arp請求包
★最後別忘了掃尾工作:
★packetfreepacket(lppacket); //釋放packet結構指標
packetcloseadapter(lpadapter); //關閉介面卡
★最後是監聽執行緒:
設定接收資料報的系列引數:
★packetsethwfilter(lpadapter, ndis_packet_type_directed); //設定網絡卡為直接模式
packetsetbuff(lpadapter,1024); //設定網絡卡接收資料報的緩衝區大小
packetsetreadtimeout(lpadapter,2); //設定接收到乙個包後的「休息」時間
★接收資料報:
★packetreceivepacket(lpadapter, lppacket, true); //接收資料報★
對資料報進行分析,以得出結論:
★char *buf;
bpf_hdr *lpbpfhdr;
et_header *lpethdr;
in_addr addr=;
buf=(char *)lppacket->buffer;
lpbpfhdr=(bpf_hdr *)buf;
lpethdr=(et_header *)(buf+lpbpfhdr->bh_hdrlen);
if(lpethdr->eh_type==htons(0x0806)) //判斷是否為arp包
,dest_ip[20]=;
addr.s_un.s_addr=lparphdr->arp_spa;
memcpy(source_ip,i***_ntoa(addr),strlen(i***_ntoa(addr)));
memset(&addr,0,sizeof(in_addr));
addr.s_un.s_addr=lparphdr->arp_tpa;
memcpy(dest_ip,i***_ntoa(addr),strlen(i***_ntoa(addr)));
if(!strcmp(source_ip,ip) && !strcmp(dest_ip,"172.24.21.10")) //判斷接收到的包的源ip與目的ip是否正確(字串變數ip是從主線程傳遞過來的被探測機的ip)}}
★5. 結尾
真的是所謂一物降一物,sniffer雖然厲害,但我們終究找到了破解它的辦法了。由於這個原理,軟體anti-sniff應運而生。當然,我寫的這個程式比起anti-sniff來可以說是小巫見大巫,但是,萬變不離其綜,它們的基本原理都是一樣的。
用ARP偽裝廣播探測網路中的Sniffer
用arp偽裝廣播探測網路中的sniffer 嗅探器 sniffer 一直以來都是一種讓人惱火的黑客工具,因為它是一種靜態的攻擊軟體,它的存在不會留下任何痕跡,因此人們很難將它揪出來。可是,它的危害性卻又是相當大的 它就像乙個監視器,你的 一舉一動 都在它的監視之下,你說危害大不大 所以,我們不能不要...
利用arp發現網路中的嗅探器
1.sniffer原理 所謂知己知彼方能百戰不殆,要了解探測sniffer的方法,就先得了解sniffer的原理。首先,讓我們來看一看區域網中是怎樣傳輸資料的。當乙個資料報的目的地是區域網內的某台計算機時,此資料報將以廣播的形式被傳送到網內每一台計算機上。而每台計算機的網絡卡將分析資料報中的目的ma...
交換網路中的嗅探和ARP欺騙
文章提交 refdom refdom at 263.net 乙太網內的嗅探 sniff 對於網路安全來說並不是什麼好事,雖然對於網路管理員能夠跟蹤資料報並且發現 網路問題,但是如果被破壞者利用的話,就對整個網路構成嚴重的安全威脅。至於嗅探的好處和壞處就不羅嗦了。arp快取表 假設這樣乙個網路 hub...