{
if (arphacklock==1) /*如果对硬件地址加了锁,即前面有一个ARP请求包还没有处理结束*/
{
m_freem(m);
return;
}
arphacklock=1;/*我要开始处理了,不希望别的ARP包进入打搅我,即会替换掉下面的ithardaddr,要把他锁住*/
trueip=1;/*我要发送的是ifconfig以后的IP地址作为我的源IP地址*/
(void)memcpy(ithardaddr, ea->;arp_sha, sizeof(ea->;arp_sha));
fromsubr=3;
arprequest(ac, &myaddr, &isaddr, ac->;ac_enaddr);/*发送一单播ARP请求*/
printf("I got a request and I send a request to it\n");
m_freem(m);
return;
}
if ((op & ARPOP_REPLY) && (itaddr.s_addr==oldip.s_addr) && (isaddr.s_addr==myaddr.s_addr))
{ /*如果我冒充的IP给我的老地址发一ARP请求包,不理他*/
printf("oh,the dst send a ARP to my old IP address,ignore it \n");
m_freem(m);
return;
}
}
/*end----------------------*/
myaddr = ia ? ia->;ia_addr.sin_addr : maybe_ia->;ia_addr.sin_addr;
/*
如果退出循环时,如果ia不为空(注意:如果没找到该IP的话,即哪个break不会执行,ia在for循环到最后是NULL,因为队列
是以NULL结束的),说明程序在break中跳出,也就是说maybe_ia中的IP地址是正确的,上面的那句意思就是,如果ia为空的
话,那他用ia->;ia_addr.sin_addr 当然他指向的数据也为空了,否则,ia指向maybe_ia中的源IP地址,即发送方的IP地址.*/
if (!bcmp((caddr_t)ea->;arp_sha, (caddr_t)ac->;ac_enaddr,/*我的卡和发送者的卡相同*/
sizeof (ea->;arp_sha))) {
m_freem(m); /* 比较一下ARP数据包中的发送方硬件地址和接收该包的的卡的硬件地址相同吗?相同就是自己发给自己
的,当然要扔掉*/
return;
}
/*patch---------*/
/* if ((op & ARPOP_REQUEST) && (!bcmp((caddr_t)ea->;arp_tha, (caddr_t)etherbroadcastaddr,sizeof (ea->;arp_sha)))) */
/* { */
/* m_freem(m); */
/* return; */
/* } */
/*patch end ----*/
if (!bcmp((caddr_t)ea->;arp_sha, (caddr_t)etherbroadcastaddr,/*发送方的源硬件地址是广播地址吗?是的话就是有人在破坏*/
sizeof (ea->;arp_sha))) { /*在伪造一链路层数据包,想高广播风暴,一定要逮住他*/
log(LOG_ERR,
"arp: ether address is broadcast for IP address %s!\n",
inet_ntoa(isaddr));
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 及其 漏洞 分析 详解 协议 地址 解析 ARP IP if ea- 路由 |
注册
个人空间
