我们都知道ARP协议可以用来获取已知IP主机的MAC地址,那是不是可以这样说,在同一个 局域网内,我们可以利用ARP回应包来判断局域网内的活动主机?其实是行的,只要局域网内的主机是处于开机状态,那就会对ARP请求包作出回应,通过分析ARP请求包就可以把局域网内所有活动主机的IP地址跟MAC地址提取出来。下面是ARP帧结构和以太网帧结构的定义:
//28字节ARP帧结构
struct arp_head
{
unsigned short hardware_type; //硬件类型
unsigned short protocol_type; //协议类型
unsigned char hardware_add_len; //硬件地址长度
unsigned char protocol_add_len; //协议地址长度
unsigned short operation_field; //操作字段
unsigned char source_mac_add[6]; //源mac地址
unsigned long source_ip_add; //源ip地址
unsigned char dest_mac_add[6]; //目的mac地址
unsigned long dest_ip_add; //目的ip地址
};
//14字节以太网帧结构
struct ethernet_head
{
unsigned char dest_mac_add[6]; //目的mac地址
unsigned char source_mac_add[6]; //源mac地址
unsigned short type; //帧类型
};
//arp最终包结构
struct arp_packet
{
ethernet_head ed;
arp_head ah;
};
这里我们是用winpcap开发包来构造相应的数据包的(利用pcap_sendpacket()函数可以发送构造后的数据包),具体内容可以自己去看下winpcap开发包的开发文档。下面是具体代码