SendARP(
IPAddr DestIP,
IPAddr SrcIP,
PULONG pMacAddr,
PULONG PhyAddrLen
);
第一个参数是IP地址的网络字节顺序,而不是一个指针,当初我就是赋值成指针而使得获取不了MAC地址。
第二个参数填0就可以
第三个参数是MAC缓冲区指针
第四个参数是一个指向一个DWORD型数值为6的指针
返回值:
31 说明对方没有开机,我们的函数检测不到它,
1784 说明的给函数的最后一个参数的值是0,或你的给的值与你给的缓存区大小不符合。
如果返回31不在线,则最后一个参数指针指向的值赋值为0
给一个列子:
attackip是已经获得的主机字节顺序的IP地址!
char attackmac[6]="\x0";
DWORD pl=6;
htonl(*(DWORD *)attackip);
_asm
{
mov dword ptr [attackip],eax
}
SendARP(*(DWORD *)attackip,0,(DWORD *)attackmac,&pl);
该函数有一个缺点:
该函数本质上就是向目标主机发送一个ARP请求包,然后得到应答包来更新MAC,但是ARP请求包里的发送端IP和MAC是本机的实际IP和MAC,这样对方arp -a查看缓存表时记录里就有我的IP-MAC映射记录,容易知道有人在扫描其机器,或者是ARP病毒也可能。
解决该函数问题就是自己伪造发包,但是MAC地址必须对,否则应答包不会发送到本机~
from:http://hi.baidu.com/csacer/item/b9c2d3dda0f6d4f592a974b3