利用ARP协议来获取局域网内活动主机的IP跟MAC地址

我们都知道ARP协议可以用来获取已知IP主机的MAC地址,那是不是可以这样说,在同一个局域网内,我们可以利用ARP回应包来判断局域网内的活动主机?其实是行的,只要局域网内的主机是处于开机状态,那就会对ARP请求包作出回应,通过分析ARP请求包就可以把局域网内所有活动主机的IP地址跟MAC地址提取出来。下面是ARP帧结构和以太网帧结构的定义:

这里是用winpcap开发包来实现发包的(利用pcap_sendpacket()函数可以发送构造后的协议包),具体内容可以自己去看下winpcap开发包的开发文档,可看下这里http://www.winpcap.org/。由于winpcap涉及到网络层以下,故需要自己构建各个协议头部,相对来说比较麻烦,但假如说要实现IP包欺骗、ARP网关欺骗什么的就大有好处了。由于发送ARP请求包过程中会有回应包返回,如果单一线程的话就只能等待发送完所有ARP请求包后(总共255个,你不要说不知道)才能执行接收操作,这样势必会丢失大量的回应包,故这里我采用了两个线程,一个负责发送ARP请求包,一个负责接收回应包。发送线程每发一个包就会Sleep大概50ms,主要是怕发包太快导致程序接收不到一些回应包。下面是具体代码:

后记:其实后来才知道WINDOWS平台上有SendArp这个函数可以获取到相应的MAC地址,实现这个东西时是正好在看WinpCap这个平发包,才突然想到做这个东西,当是练练手吧,呵呵!后来写的ARP欺骗程序也是基于这个平发包的,算是受益甚多吧。

标签: ,
文章分类 C/C++

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*