【数据包的游戏系列之一】手把手教你玩转ARP包^_^

PiggyXP 2004-06-13 05:59:33
加精
前 言
很多人都不会到文档中心去看文章,为了造福所有朋友我想我还是在这里发一份吧^_^
首先要感谢网络安全资深专家卢湖川博士以及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的地址映射。

好了,终于到了编程实现它的时候了^_^

...全文
600 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellboy198502 2010-06-22
  • 打赏
  • 举报
回复
很好,就是看得有点累!
wangyumei_80_cpp 2010-06-22
  • 打赏
  • 举报
回复
路过,看了,收藏了!
fzd999 2004-06-21
  • 打赏
  • 举报
回复
此贴加入精华

我提倡原创,但是,在信息时代,转贴有利于技术推广,同样提倡!
fzd999 2004-06-21
  • 打赏
  • 举报
回复
啊?对不起啊~

没想到你有这一手,佩服ing!呵呵
PiggyXP 2004-06-21
  • 打赏
  • 举报
回复
晕.....


花花, 这个帖子是我原创的啊...-_-b
fun1357 2004-06-14
  • 打赏
  • 举报
回复
mark
PiggyXP 2004-06-14
  • 打赏
  • 举报
回复
呵呵,没想到一贴出来竟然这么多

其实还是推荐大家去看文档中心的,那个版排的比较好,而且是彩色的^_^

看这个帖子直接是虐待自己的眼睛呵呵

而且我也是只是初学,还希望大家多多讨论、多多指点*^_^*
myxs 2004-06-14
  • 打赏
  • 举报
回复
强!
fzd999 2004-06-14
  • 打赏
  • 举报
回复
好!
lixiaosan 2004-06-14
  • 打赏
  • 举报
回复
go on go on good job
szjay 2004-06-14
  • 打赏
  • 举报
回复
谢谢楼主了
Wenxy1 2004-06-13
  • 打赏
  • 举报
回复
mark.
cnBoysbe 2004-06-13
  • 打赏
  • 举报
回复
不错啊,希望类似的帖子多多发
  • 打赏
  • 举报
回复

^_^ 写得真不错!期待你的下一份佳作!^_^
shootingstars 2004-06-13
  • 打赏
  • 举报
回复
嗬嗬,不错,支持一下。
dzq138 2004-06-13
  • 打赏
  • 举报
回复
不好意思.没看全.
-------------------------------------------------------------
而且本文的代码使用了winpcap开发包,是要另外安装ainpcap驱动。
读者可以安装我代码包里的驱动,不过它更新很快,可以到它主页上去下载最新版本
http://winpcap.polito.it/install/default.htm
dzq138 2004-06-13
  • 打赏
  • 举报
回复
老提示找不到PACKET.DLL
wumingrock 2004-06-13
  • 打赏
  • 举报
回复
太感谢了,虽然还没有仔细看,不过这么好的帖子,先要表示感谢才好!
enoloo 2004-06-13
  • 打赏
  • 举报
回复
顶啊~

呵呵,干得不错。
halk 2004-06-13
  • 打赏
  • 举报
回复
顶一下!
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧