用ARP伪装广播探测网络中的Sniffer
}
★
翻开适配器,此处我默许翻开第一块适配器:
★
lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);
if (!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
{
printf("Unable to open the driver, Error Code : %lx\n", GetLastError());
return 0;
}
★
以太网头部和ARP头部结构赋值,StrToMac函数是笔者自界说的字符串转换为Mac地点的函数:
★
StrToMac("00E06E41508F",s_Mac); //"00E06E41508F"是笔者测试步伐所用的当地机的网卡地点,测试者应将其改为测试机网卡地点
memcpy(et_header.eh_src,s_Mac,6);
StrToMac("FFFFFFFFFFFE",d_Mac); //目标物理地点设置为FFFFFFFFFFFE。
memcpy(et_header.eh_dst,d_Mac,6);
et_header.eh_type=htons(0x0806); //类型为0x0806表现这是ARP包
arp_header.arp_hdr=htons(0x0001); //硬件地点类型以太网地点
arp_header.arp_pro=htons(0x0800); //协议地点类型为IP协议
arp_header.arp_hln=6; //硬件地点长度为6
arp_header.arp_pln=4; //协议地点长度为4
arp_header.arp_opt=htons(0x0001); //标识为ARP请求
arp_header.arp_spa=inet_addr("172.24.21.10"); //"172.24.21.10"是我测试步伐所用的当地机的IP,测试者应将其改为测试机IP
memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=inet_addr(argv[1]);
memcpy(arp_header.arp_tha,et_header.eh_dst,6);
★
发送数据包:
★
lpPacket=PacketAllocatePacket(); //给PACKET结构指针分派内存
PacketInitPacket(lpPacket,buffer,512); //初始化PACKET结构指针
PacketSetNumWrites(lpAdapter,5); //设置发送次数
PacketSendPacket(lpAdapter,lpPacket,TRUE);//发送ARP请求包
★
最后别忘了扫尾工作:
★
PacketFreePacket(lpPacket); //释放PACKET结构指针
PacketCloseAdapter(lpAdapter); //关闭适配器
★
最后是监听线程:
设置接收数据包的系列参数:
★
PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_DIRECTED); //设置网卡为直接形式
PacketSetBuff(lpAdapter,1024); //设置网卡接收数据包的缓冲区巨细
PacketSetReadTimeout(lpAdapter,2); //设置接收到一个包后的“休息”工夫
★
接收数据包:
★PacketReceivePacket(lpAdapter, lpPacket, TRUE); //接收数据包★
对数据包进行阐发,以得出结论:
★
char *buf;
bpf_hdr *lpBpfhdr;
ET_HEADER *lpEthdr;
in_addr addr={0};
buf=(char *)lpPacket->Buffer;
lpBpfhdr=(bpf_hdr *)buf;
lpEthdr=(ET_HEADER *)(buf+lpBpfhdr->bh_hdrlen);
if(lpEthdr->eh_type==htons(0x0806)) //判断能否为ARP包
{
ARP_HEADER *lpArphdr=(ARP_HEADER*)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER));
char source_ip[20]={0},dest_ip[20]={0};
addr.S_un.S_addr=lpArphdr->arp_spa;
memcpy(source_ip,inet_ntoa(addr),strlen(inet_ntoa(addr)));
memset(&addr,0,sizeof(in_addr));
addr.S_un.S_addr=lpArphdr->arp_tpa;
memcpy(dest_ip,inet_ntoa(addr),strlen(inet_ntoa(addr)));
if(!strcmp(source_ip,ip) && !strcmp(dest_ip,"172.24.21.10")) //判断接收到的包的源IP与目标IP能否精确(字符串变量ip是从主线程传递过去的被探测机的ip)
{
if(lpArphdr->arp_opt==htons(0x0002)) //判断能否为ARP应对
{
printf("There is a Sniffer!\n");
}
}
}
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|
上一篇: 让路由器成为你防范的堡垒
下一篇: 教你查出反向木马的反向连接域名