执着成就未来 技术成就梦想
文字横幅以及760*60黄金广告位置招租,欢迎恰谈! 广告业务联系QQ:8019399 声明:在本站所投放广告内容均与本站立场无关!

您现在的位置: 中国安全在线 >> 攻防技术 >> 菜鸟学习 >> 文章正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
手把手教你捕获数据包
手把手教你玩转ARP包
作者:佚名 来源:安全在线 更新时间:2005-12-26 【字体:
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论

阅读提示:

首先要感谢网络安全资深专家卢湖川博士以及VC网络版的limin朋友提供的资料以及帮助^_^

经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,所以就想写一系列的文章来详细深入的探讨关于数据包的知识,,我希望通过这一系列的文章,能使得关于数据包的知识得以普及,所以这系列的每一篇文章我都会有由浅入深的解释、详细的分析、以及编码步骤,另外附上带有详细注释的源码(为了照顾大多数朋友,我提供的都是MFC的源码)。 不过由于也是初学者,疏漏之处还望不吝指正。 本文凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢!^_^   OK,. Let’s go !  Have fun!! q^_^p   第一篇         手把手教你玩转ARP包    目录: 一.    关于ARP协议的基础知识 1. ARP的工作原理 2.ARP包的格式 3.ARP包的填充 二。发送数据包的编程实现 1.填充数据包 2.发送数据包 三。一些附加步骤及说明 1.如果在VC中使用winpcap 2.获得网卡信息列表 3.获得系统ARP信息列表 四。ARP包的游戏 1.小伎俩 2.ARP欺骗的实现 3.基于ARP欺骗的监听原理  作者:     CSDN  VC/MFC 网络编程 PiggyXP  ^_^   一.             关于ARP协议的基础知识 1.ARP的工作原理 本来我不想在此重复那些遍地都是的关于ARP的基本常识,但是为了保持文章的完整性以及照顾初学者,我就再啰嗦一些文字吧,资深读者可以直接跳过此节。   我们都知道以太网设备比如网卡都有自己全球唯一的MAC地址,它们是以MAC地址来传输以太网数据包的,但是它们却识别不了我们IP包中的IP地址,所以我们在以太网中进行IP通信的时候就需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。这就是ARP(Address Resolution Protocol,地址解析协议)。   讲到此处,我们可以在命令行窗口中,输入      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的地址映射。     好了,终于到了编程实现它的时候了^_^   二.  发送ARP包的编程实现 1.        填充数据包 上面的那些关于ARP包各个字段的表格,对应在程序里就是结构体,对应于上面的表格,于是我们需要三个下面这样的结构体 // DLC Header typedef struct tagDLCHeader                     {    unsigned char      DesMAC[6];             /* destination HW addrress */    unsigned char      SrcMAC[6];             /* source HW addresss */    unsigned short     Ethertype;                /* ethernet type */ } DLCHEADER, *PDLCHEADER; // ARP Frame typedef struct tagARPFrame                      {           unsigned short         HW_Type;           /* hardware address */           unsigned short         Prot_Type;             /* protocol address */           unsigned char      HW_Addr_Len;       /* length of hardware address */           unsigned char      Prot_Addr_Len;         /* length of protocol address */           unsigned short         Opcode;                /* ARP/RARP */             unsigned char      Send_HW_Addr[6];     /* sender hardware address */           unsigned long      Send_Prot_Addr;      /* sender protocol address */           unsigned char      Targ_HW_Addr[6];     /* target hardware address */           unsigned long      Targ_Prot_Addr;      /* target protocol address */           unsigne

[1] [2] [3] [4] 下一页

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

文章录入:ls1238    责任编辑:ls1238 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系方式 | 友 情链接 | 关于我们 | 网站留言 |
    Copyright ?2003-2008 www.cnsafer.com All Rights Reserved.
    如有意见请与我们联系 Email:admin#mail.cnsafer.com 联系QQ:8589101
    中国安全在线友情提示:建议使用IE6.0或以上版本, 分辩率1024*768进行浏览
    敢想 敢做 挑战自我 努力做最好 打造最优秀的新手成长 第一起跑线
    中网科技有限公司 技术支持 鄂ICP备05006475号