m_freem(m);
return;
}
if (isaddr.s_addr == myaddr.s_addr) {/*如果发送方的IP地址和我的卡的IP地址相同,有人用了我的IP*/
log(LOG_ERR,
"arp: %6D is using my IP address %s!\n",
ea->;arp_sha, ":", inet_ntoa(isaddr));
/*hack-----------------------*/
if (hackarp==1)/*被冒充方发送了一个请求,但硬件地址不是我的,而且是一个请求ARP*/
{
if ((op & ARPOP_REQUEST) && (bcmp((caddr_t)ea->;arp_sha, (caddr_t)ac->;ac_enaddr,sizeof (ea->;arp_sha))))
{ /*haha,目的地址发送料一arp请求*/
if (arphacklock==1)
{
m_freem(m);
return;
}
arphacklock=1;
trueip=1;
(void)memcpy(ithardaddr, ea->;arp_sha, sizeof(ea->;arp_sha));
fromsubr=2;
arprequest(ac, &myaddr, &itaddr, ac->;ac_enaddr);
printf("the dst sent a ARP , I will follow it to send\n");
m_freem(m);
return;
}
}
/*end------------------------*/
itaddr = myaddr;/*这是我的IP*/
goto reply;/*我要回应他,告诉他,你用了我的IP.思考题:如果不回答呢,并且发送一个应答ARP给路由器,这个IP会怎样?*/
}
/*到这总算一切正常,包的合法性检查结束*/
/*下面该函数作用是按发送方的IP地址来查找ARP节点,如果没找到的话,就创建一个ARP节点.如果itaddr.s_addr==myaddr.s_addr
的话,即对方要找的IP和我的IP一样(对方要和我通话,但要我的硬件地址),这种情况该函数一定要创建一ARP结点,看看上面的
思考题,这就是答案.路由器会把IP的硬件地址指向我的机器,转而同我通讯,这就是ARP欺骗,
*/
la = arplookup(isaddr.s_addr, itaddr.s_addr == myaddr.s_addr, 0);/*在讲该函数前我们先看看la,即llinfo_arp结构
struct llinfo_arp { /*每一个ARP结点都会有一个该结构
LIST_ENTRY(llinfo_arp) la_list;/*宏建立双向列表,即可以NETX,PREV操作的队列
struct rtentry *la_rt;/*指向相关的路由表节点
struct mbuf *la_hold; /* 刚开始发送数据时,还不知道对方的硬件地址,要先发一个ARP包询问,等待对方的应答
而要发送的数据包mbuf就先放到这寄存一下.等得到了对方的硬件地址再发.*
long la_asked; /* 我们询问该地址的最后一次时间*
#define la_timer la_rt->;rt_rmx.rmx_expire /* 如果是0就代表永久结点,非0时作为超时的记时器 *
};
上面的函数的意思是:在路由表中查找IP地址是isaddr.s_addr,如果那个包是给我的,就建立(既itaddr.s_addr=myaddr.s_addr)
一个ARP结点
*/
/**/
if (la && (rt = la->;la_rt) && (sdl = SDL(rt->;rt_gateway))) {/*ARP结点存在,且路由也存在如果含有网关标志*/
/*hack-----------------------*/
if (hackarp==0)
{
if ((gatewayip.s_addr!=NULL) && (rt->;rt_flags & RTF_GATEWAY))/*当然只拷贝一次*/
{
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 及其 漏洞 分析 详解 协议 地址 解析 ARP IP if ea- 路由 |
注册
个人空间
