手把手教你玩转ARP包^_^(1)

前       言    
            很多人都不会到文档中心去看文章,为了造福所有朋友我想我还是在这里发一份吧^_^  
            首先要感谢网络安全资深专家卢湖川博士以及VC网络版的limin朋友提供的资料以及帮助^_^  
            经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,所以就想写一系列的文章来详细深入的探讨关于数据包的知识,,我希望通过这一系列的文章,能使得关于数据包的知识得以普及,所以这系列的每一篇文章我都会有由浅入深的解释、详细的分析、以及编码步骤,另外附上带有详细注释的源码(为了照顾大多数朋友,我提供的都是MFC的源码)。  
            不过由于也是初学者,疏漏之处还望不吝指正。  
            本文凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢!^_^  
   
            OK,   Let’s   go   !     Have   fun!!   q^_^p  
   
            文中所附源码下载地址(是VC++.net   2003   的MFC代码,没装.net的朋友见文后解决方案)  
   
            http://iunknown.com.cn/csdn/network/ARPPlayer_by_PiggyXP.rar  
   
            非常感谢   _foo   兄弟无偿提供的空间,非常感谢!  
   
            第一篇       手把手教你玩转ARP包  
  目录:  
  一. 关于ARP协议的基础知识  
      1. ARP的工作原理  
      2. ARP包的格式  
      3. ARP包的填充  
  二. ARP包的编程实现  
      1. 编程填充数据包  
      2. 发送数据包  
  三. 附件步骤以及说明  
      1. winpcap驱动的安装与加载  
      2. 枚举系统网卡信息  
      3. 枚举系统ARP列表  
  四. ARP数据包的游戏  
      1. 小伎俩  
      2. 实现ARP欺骗  
      3. 基于ARP欺骗的监听技术原理  
   
   
  一. 关于ARP协议的基础知识  
  1.ARP的工作原理  
        本来我不想在此重复那些遍地都是的关于ARP的基本常识,但是为了保持文章的完整性以及照顾初学者,我就再啰嗦一些文字吧,资深读者可以直接跳过此节。  
        我们都知道以太网设备比如网卡都有自己全球唯一的MAC地址,它们是以MAC地址来传输以太网数据包的,但是它们却识别不了我们IP包中的IP地址,所以我们在以太网中进行IP通信的时候就需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。这就是ARP(Address   ResolutionProtocol,地址解析协议)。  
        讲到此处,我们可以在命令行窗口中,输入  
              arp   –   a  
        来看一下效果,类似于这样的条目  
                  210.118.45.100         00-0b-5f-e6-c5-d7         dynamic  
        就是我们电脑里存储的关于IP地址与MAC地址的对应关系,dynamic表示是临时存储在ARP缓存中的条目,过一段时间就会超时被删除(xp/2003系统是2分钟)。  
        这样一来,比如我们的电脑要和一台机器比如210.118.45.1通信的时候,它会首先去检查arp缓存,查找是否有对应的arp条目,如果没有,它就会给这个以太网络发ARP请求包广播询问210.118.45.1的对应MAC地址,当然,网络中每台电脑都会收到这个请求包,但是它们发现210.118.45.1并非自己,就不会做出相应,而210.118.45.1就会给我们的电脑回复一个ARP应答包,告诉我们它的MAC地址是xx-xx-xx-xx-xx-xx,于是我们电脑的ARP缓存就会相应刷新,多了这么一条:  
                    210.118.45.1       xx-xx-xx-xx-xx-xx       dynamic  
   
        为什么要有这么一个ARP缓存呢,试想一下如果没有缓存,我们每发一个IP包都要发个广播查询地址,岂不是又浪费带宽又浪费资源?  
      而且我们的网络设备是无法识别ARP包的真伪的,如果我们按照ARP的格式来发送数据包,只要信息有效计算机就会根据包中的内容做相应的反应.  
        试想一下,如果我们按照ARP响应包的相应的内容来刷新自己的ARP缓存中的列表,嘿嘿,那我们岂不是可以根据这点在没有安全防范的网络中玩些ARP包的小把戏了?在后面的文章里我就手把手来教你们如何填充发送ARP包,  
          不过先别急,我们再继续学点基础知识^_^  
   
  2.ARP包的格式  
          既然我们要来做一个我们自己的ARP包,当然首先要学习一下ARP包的格式。  
          从网络底层看来,一个ARP包是分为两个部分的,前面一个是物理帧头,后面一个才是ARP帧。  
          首先,物理帧头,它将存在于任何一个协议数据包的前面,我们称之为DLC   Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以便硬件设备识别。  
   
  DLC   Header  
  字段       长度(Byte) 默认值                       备注  
  接收方MAC     6         广播时,为   ff-ff-ff-ff-ff-ff  
  发送方MAC                   6  
  Ethertype                   2 0x0806         0x0806是ARP帧的类型值  
                                                        图1   物理帧头格式  
   
            图1是需要我们填充的物理帧头的格式,我们可以看到需要我们填充的仅仅是发送端和接收端的物理地址罢了,是不是很简单呢?  
   
            接下来我们看一下ARP帧的格式.  
   
  ARP   Frame  
  字段           长度(Byte) 默认值               备注  
  硬件类型                   2 0x1             以太网类型值  
  上层协议类型 2 0x0800           上层协议为IP协议  
  MAC地址长度 1 0x6           以太网MAC地址长度为   6  
  IP地址长度 1 0x4           IP地址长度为   4  
  操作码                   2             0x1表示ARP请求包,0x2表示应答包  
  发送方MAC     6  
  发送方IP                   4  
  接收方MAC                   6  
  接收方IP                   4  
  填充数据                 18           因为物理帧最小长度为64字节,前面的42字节再  
                                                                      加上4个CRC   校验字节,   还差18个字节  
                                                            图2   ARP帧格式  
   
  我们可以看到需要我们填充的同样也只是MAC,IP,再加上一个1或2的操作码而已。  
   
            讲到这里,你是不是已经跃跃欲试了?先别急,磨刀不误砍柴工,我最后再讲一下如何分别来填充请求包和应答包^_^  
   
  3.ARP包的填充  
  1)   请求包的填充:  
  比如我们的电脑MAC地址为   aa-aa-aa-aa-aa-aa,IP为   192.168.0.1  
          我们想要查询   192.168.0.99的MAC地址,应该怎么来做呢?  
   
          首先填充DLC   Header,通过前面的学习我们知道,想要知道某个计算机对应的MAC地址是要给全网发送广播的,所以接收方MAC肯定是   ffffffffffff,发送方MAC当然是自己啦   于是我们的DLC   Header就填充完成了,如图,(当然我编的程序比较智  
  能,会根据你选择的ARP包类型帮你自动填入一些字段,你一用便知^_^)。  
   
  DLC   Header  
  字段         长度(Byte) 填充值  
  接收方MAC     6 ffffffffffff  
  发送方MAC     6 aaaaaaaaaaaa  
  Ethertype   2 0x0806  
  图3   ARP请求包中   DLC   Header内容  
   
          接下来是ARP帧,请求包的操作码当然是   1,发送方的MAC以及IP当然填入我们自己的,然后要注意一下,这里的接收方IP填入我们要查询的那个IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如图,  
   
  ARP   Frame  
  字段         长度(Byte) 填充值  
  硬件类型     2 1  
  上层协议类型 2 0800  
  MAC地址长度 1 6  
  IP地址长度 1 4  
  操作码                   2 1  
  发送方MAC                   6 aaaaaaaaaaaa  
  发送方IP                   4 192.168.0.1  
  接收方MAC     6 任意值   xxxxxxxxxxxx  
  接收方IP                   4 192.168.0.99  
  填充数据                 18 0  
  图4   ARP请求包中   ARP帧的内容  
   
          如果我们构造一个这样的包发送出去,如果   192.168.0.99存在且是活动的,我们马上就会收到一个192.168.0.99发来的一个响应包,我们可以查看一下我们的ARP缓存列表,是不是多了一项类似这样的条目:  
  192.168.0.99 bb-bb-bb-bb-bb-bb  
          是不是很神奇呢?  
          我们再来看一下ARP响应包的构造  
   
  2)   响应包的填充  
          有了前面详细的解说,你肯定就能自己说出响应包的填充方法来了吧,所以我就不细说了,列两个表就好了  
          比如说给   192.168.0.99(MAC为   bb-bb-bb-bb-bb-bb)发一个ARP响应包,告诉它我们的MAC地址为aa-aa-aa-aa-aa-aa,就是如此来填充各个字段  
   
  DLC   Header  
  字段         长度(Byte) 填充值  
  接收方MAC     6 bbbbbbbbbbbb  
  发送方MAC   6 aaaaaaaaaaaa  
  Ethertype                   2 0x0806  
  图5   ARP响应包中   DLC   Header内容  
   
  ARP   Frame  
  字段         长度(Byte) 填充值  
  硬件类型                   2 1  
  上层协议类型 2 0800  
  MAC地址长度 1 6  
  IP地址长度 1 4  
  操作码                   2 2  
  发送方MAC     6 aaaaaaaaaaaa  
  发送方IP                   4 192.168.0.1  
  接收方MAC     6 bbbbbbbbbbbb  
  接收方IP                   4 192.168.0.99  
  填充数据                 18 0  
  图6   ARP响应包中   ARP帧的内容  
   
          这样192.168.0.99的ARP缓存中就会多了一条关于我们192.168.0.1的地址映射。  
   
          好了,终于到了编程实现它的时候了^_^  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值