设为主页 | 加入收藏 | 繁體中文

用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:
评论加载中...
内容:
评论者: 验证码: