用ARP伪装广播探测网络中的Sniffer
嗅探器(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 //以太网头部
{
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;
}ET_HEADER;
typedef struct _arp_header //ARP头部
{
unsigned short arp_hdr;
unsigned short arp_pro;
unsigned char arp_hln;
unsigned char arp_pln;
unsigned short arp_opt;
unsigned char arp_sha[6];
unsigned long arp_spa;
unsigned char arp_tha[6];
unsigned long arp_tpa;
}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 //以太网头部
{
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;
}ET_HEADER;
typedef struct _arp_header //ARP头部
{
unsigned short arp_hdr;
unsigned short arp_pro;
unsigned char arp_hln;
unsigned char arp_pln;
unsigned short arp_opt;
unsigned char arp_sha[6];
unsigned long arp_spa;
unsigned char arp_tha[6];
unsigned long arp_tpa;
}ARP_HEADER;
★
然后是发送ARP请求报文的主线程,取得全部适配器的名字。此中,“adapter_name”表现一个用于寄存适配器名字的缓冲区,而这些适配器名字将以UNICODE编码方法存入此缓冲区中。UNICODE编码方法便是用一个字的空间(两个字节)来寄存一个字符。如许,每个字符间自然会出现一个'\0'。而两个适配器名字之间将会有一个字为'\0'作为隔断。adapter_length:这个缓冲区的巨细:
★
if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE)
{
printf("PacketGetAdapterNames error:%d\n",GetLastError());
return 0;
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|