三度网教程:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

灵活运用ARP 探测网络中的黑客软件

时间:2022-11-4作者:未知来源:三度网教程人气:


随着网络的普及,我们的生活越来越方便,但是网络安全也成了很多人面临的一个问题。特别是那些有着商业数据的企业电脑,更要注意上网安全常识,不然病毒会对我们造成严重的威胁。

嗅探器(Sniffer)一直以来都是一种让人恼火的黑客工具, 因为它是一种静态的攻击软件, 它的存在不会留下任何痕迹, 因此人们很难将它揪出来。 可是, 它的危害性却又是相当大的(它就像一个监视器, 你的“一举一动”都在它的监视之下, 你说危害大不大)。 所以, 我们不能不要想个办法出来检查网络中是否存在Sniffer, 这是非常必要的。

  1. Sniffer原理

  所谓知己知彼方能百战不殆, 要了解探测Sniffer的方法, 就先得了解Sniffer的原理。 首先, 让我们来看一看局域网中是怎样传输数据的。 当一个数据包的目的地是局域网内的某台计算机时, 此数据包将以广播的形式被发送到网内每一台计算机上。 而每台计算机的网卡将分析数据包中的目的Mac地址(即以太网地址), 如果此地址为本计算机Mac地址或为广播地址(FF-FF-FF-FF-FF-FF), 那么, 数据包将被接收, 而如果不是, 网卡将直接将其丢弃。 但是, 这里有一个前提, 就是接收端计算机的网卡是在正常模式下工作的。 而如果网卡被设置为混杂模式, 那么它就可以接收所有经过的数据包了(当然也包括目的地不是本机的数据包)。 就是说, 只要是发送到局域网内的数据包, 都会被设置成混杂模式的网卡所接收!这也就是Sniffer的基本原理了。 至于Sniffer的具体实现和一些细节, 这里就不多讲了, 大家有兴趣可以参考相关资料。

  2. 以太网中传输的ARP数据报

  知道了Sniffer的基本原理, 现在, 我们就要想想怎么才能将局域网中隐藏的Sniffer揪出来, 这才是本篇文章的主题。 这里, 我们需要自己构造ARP数据包, 所以, 就先简单介绍一下ARP请求和应答数据报的结构:

  typedef struct _et_header //以太网头部

           { 

  unsigned char eh_dst[6]; 

  unsigned char eh_src[6]; 

  unsigned short eh_type; 

  }ET_HEADER; 

    

          { 

  unsigned short arp_hdr; 

  unsigned short arp_pro; 

  unsigned char arp_hln; 

  unsigned char arp_pln; 

  unsigned short arp_opt; 

  unsigned char arp_sha[6]; 

  unsigned long arp_spa; 

  unsigned char arp_tha[6]; 

  unsigned long arp_tpa; 

  }ARP_HEADER; 

    

    以上就是网络中传输的ARP数据包的结构了。 至于结构中每个字段所表示的具体含义以及如何初始化, 超出了本文章的讨论范围, 大家有兴趣可以参看《TCP-IP协议详解》一书。

3. 探测局域网中的Sniffer

  终于进入主题了。 既然Sniffer是一种静态的黑软, 不会留下任何日志, 那么我们就要主动的去探测它。 鉴于Sniffer的原理是设置网卡为混杂模式, 那么, 我们就可以想办法探测网络中被设置为混杂模式的网卡, 以此来判断是否存在Sniffer。

  这里, 让我们再来看看计算机接收数据包的规则。 前面已经讲过, 在正常模式下, 首先由网卡判断数据包的目的Mac地址, 如果为本机Mac地址或为广播地址, 那么数据包将被接收进入系统核心, 否则将被丢弃。 而如果网卡被设置为混杂模式, 那么所有的数据包都将直接进入系统核心。 数据包到达系统核心后, 系统还将进一步对数据包进行筛选:系统只会对目的Mac地址为本机Mac地址或广播地址的数据包做出响应――如果接收到的是ARP请求报文, 那么系统将回馈一个ARP应答报文。 但是, 不同的是, 系统核心和网卡对广播地址的判断有些不一样:以Windows系统为例, 网卡会判断Mac地址的所有六位, 而系统核心只判断Mac地址的前两位(Win98甚至只判断前一位), 也就是说, 对于系统核心而言, 正确的广播地址FF-FF-FF-FF-FF-FF和错误的广播地址FF-FF-FF-FF-FF-FE是一样的, 都被认为是广播地址, 甚至FF-FF-00-00-00-00也会被系统核心认为是广播地址!

  写到这里, 聪明的读者大概已经知道该怎么做了。 如果我们构造一个目的Mac

4. 主要源码分析

  由以上分析可知, 程序大概分为两个模块, 一个是发送伪装广播地址的ARP请求报文, 另一个是接收回馈的ARP应答报文并做出分析。 我们就分别用两个线程来实现。 主线程负责发送, 监听线程负责接收。

  首先是创建以太网头部和ARP头部的结构:

  typedef struct _et_header //以太网头部

        { 

  unsigned char eh_dst[6]; 

  unsigned char eh_src[6]; 

  unsigned short eh_type; 

  }ET_HEADER; 

    

           { 

  unsigned short arp_hdr; 

  unsigned short arp_pro; 

  unsigned char arp_hln; 

  unsigned char arp_pln; 

  unsigned short arp_opt; 

  unsigned char arp_sha[6]; 

  unsigned long arp_spa; 

  unsigned char arp_tha[6]; 

  unsigned long arp_tpa; 

  }ARP_HEADER; 

    

    然后是发送ARP请求报文的主线程, 取得所有适配器的名字。 其中, “adapter_name”表示一个用于存放适配器名字的缓冲区, 而这些适配器名字将以UNICODE编码方式存入此缓冲区中。 UNICODE编码方式就是用一个字的空间(两个字节)来存放一个字符。 这样, 每个字符间自然会出现一个’\0’。 而两个适配器名字之间将会有一个字为’\0’作为间隔。 adapter_length:这个缓冲区的大小:

    

      if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE) 

  { 

  printf("PacketGetAdapterNames error:%d\n",GetLastError()); 

  return 0; 

  } 

 

    

    打开适配器, 此处我默认打开第一块适配器:

    

    

      lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]); 

  if (!lpAdapter

关键词:  灵活运用ARP  探测网络中的黑客软件





Copyright © 2012-2018 三度网教程(http://www.3du8.cn) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版