用ARP探测以太网的活动主机 电脑资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用ARP探测以太网的活动主机电脑资料
网上存在很多关于ARP的文章,大多都是关于ARP欺骗,这里介绍ARP的另类用法:探测目标主机是否处于活动状态传统探测远程主机是否存活的方法是通过ICMP协议中的回显应答报文来探测(ping),用ARP探测以太网的活动主机。
随着对平安的越来越多的了解和重视,很多主机为了防止被扫描器探测,通过防火墙将ICMP 包屏蔽,从而到达在网络中隐藏的目的。
这里我们介绍一下利用ARP协议探测网络中的活动主机的思------------------------------------------ 以太网目的地址(6个字节)以太网源地址(6个字节)帧类型(ARP=0806)(2个字节)------------------------------------------ 硬件类型(Ether=01)(2个字节)
协议类型(IPv4=0800)(2个字节)硬件地址长度(1个字节)
协议地址长度(1个字节)OP操作选项
(ARPrequest=01,ARPreply=02)(2个字节)
发送端以太网地址(6个字节)发送端IP地址(4个字节)
目的以太网地址(6个字节)目的IP地址(4个字节)
--------------------------------------------
我们向目标主机发送一个ARP请求,如果目标主机处于活动状态那么会返回其MAC地址,如果对方返回MAC地址,那么说明对方处于活动状态,这样到达探测目的。
ARP请求包内容如下: ------------------------------------------ 以太网目的地址|FFFFFFFFFFFF(播送地址)
以太网源地址|本地MAC地址帧类型|0806
------------------------------------------ 硬件类型|01
协议类型|0800 硬件地址长度|06
协议地址长度|04 OP操作选项|01
发送端以太网地址|本地MAC地址发送端IP地址|目标主机IP地址
目的以太网地址|000000000000 目的IP地址|目标主机IP 地址
-------------------------------------------- 注意:这里以太网目的地址为FFFFFFFFFFFF,这是播送地址,以太网上所有主机都能收到这个包,在收到这个数据包后,操作系统判断目的IP地址是不是这台主机,如果不是那么丢弃(不作处理),否那么发送回一个ARP应答包,包的内容如下:
------------------------------------------ 以太网目的地址|探测主机的MAC地址
以太网源地址|本地MAC地址(这里本地指被探测主机)帧类型|0806
------------------------------------------ 硬件类型|01
协议类型|0800 硬件地址长度|06
协议地址长度|04 OP操作选项|02
发送端以太网地址|本地MAC地址(这里本地指被探测主机)发送端IP地址|本机IP地址(这里本地指被探测主机)
目的以太网地址|探测主机的MAC地址目的IP地址|探测主机的IP地址
--------------------------------------------
我们可以使用Pcap自己来构造这个数据包(具体过程参考Pcap的相关文档,这里我们使用SendARP()来实现),SendARP()是MicrosoftPlatform.SDK中提供用来获得目标主机的MAC地址的函数,SendARPSendARP的函数原型如下:
DWORDSendARP( IPAddrDestIP,//目标IP地址
IPAddrSrcIP,//源IP地址PULONGpMacAddr,//返回MAC地址指针
PULONGPhyAddrLen//返回MAC地址长度);
下面这个例子摘至MSND,稍做改动可以成为一个以太网内活动主机探测工具//
//Linkwithws232.libandiphlpapi.lib //
#include
#include #include
#include
intcdeclmain()
{ HRESULThr;
IPAddripAddr; ULONGpulMac[2];
ULONGulLen;
ipAddr=iaddr(192.168.0.1);
memset(pulMac,0xff,sizeof(pulMac));
ulLen=6;
hr=SendARP(ipAddr,0,pulMac,ulLen);
printf(Return%08x,length%8d\n,hr,ulLen);
sizeti,j;
char*szMac=newchar[ulLen*3];
PBYTEpbHexMac=(PBYTE)pulMac;
//
//ConvertthebinaryMACaddressintohuman-readable // for(i=0,j=0;iulLen-
1;++i){ j+=sprintf(szMac+j,%02X:,pbHexMac[i]);
}
sprintf(szMac+j,%02X,pbHexMac[i]);
printf(MACaddress%s\n,szMac);
delete[]szMac;
return0;
}。