arp 协议详解 攻击原理 简单攻击源码

上传人:xzh****18 文档编号:35520764 上传时间:2018-03-16 格式:DOC 页数:22 大小:67KB
返回 下载 相关 举报
arp 协议详解 攻击原理 简单攻击源码_第1页
第1页 / 共22页
arp 协议详解 攻击原理 简单攻击源码_第2页
第2页 / 共22页
arp 协议详解 攻击原理 简单攻击源码_第3页
第3页 / 共22页
arp 协议详解 攻击原理 简单攻击源码_第4页
第4页 / 共22页
arp 协议详解 攻击原理 简单攻击源码_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《arp 协议详解 攻击原理 简单攻击源码》由会员分享,可在线阅读,更多相关《arp 协议详解 攻击原理 简单攻击源码(22页珍藏版)》请在金锄头文库上搜索。

1、一 关于 ARP 协议的基础知识1ARP 的工作原理我们都知道以太网设备比如网卡都有自己全球唯一的 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

2、就是我们电脑里存储的关于 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 就会给我们的电脑回 复一个 A

3、RP 应答包,告诉我们它的 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 缓存中的列表,嘿嘿,那我们岂不是可以根

4、据这点在没有安全防范的网络中玩些 ARP 包的小把戏了?在后面的文章 里我就手把手来教你们如何填充发送 ARP 包,不过先别急,我们再继续学点基础知识_2ARP 包的格式既然我们要来做一个我们自己的 ARP 包,当然首先要学习一下 ARP 包的格式。从网络底层看来,一个 ARP 包是分为两个部分的,前面一个是物理帧头,后面一个才 是 ARP 帧。首先,物理帧头,它将存在于任何一个协议数据包的前面,我们称之为 DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以 便硬件设备识别。DLC Header字段 长度(Byte) 默认值 备注接收方 MAC 6

5、广播时,为 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 地址长度为 6IP 地址长度 1 0x4 IP 地址长度为 4操作码 2 0x1 表示 ARP

6、请求包,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,通过前面的学习我们

7、知道,想要知道某个计算机对应的 MAC 地 址是要给全网发送广播的,所以接收方 MAC 肯定是 ffffffffffff,发送方 MAC 当然是自己啦,于是我们的 DLC Header 就填充完成了,如图,加粗的是我们要手动输入的值(当然我编 的程序比较智能,会根据你选择的 ARP 包类型帮你自动填入一些字段,你一用便知_)。DLC Header字段 长度(Byte) 填充值接收方 MAC 6 ffffffffffff发送方 MAC 6 aaaaaaaaaaaaEthertype 2 0x0806图 3 ARP 请求包中 DLC Header 内容接下来是 ARP 帧,请求包的操作码当然是 1

8、,发送方的 MAC 以及 IP 当然填入我们自己的, 然后要注意一下,这里的接收方 IP 填入我们要查询的那个 IP 地址,就是 192.168.0.99 了, 而接收方 MAC 填入任意值就行,不起作用,于是,如图,ARP Frame字段 长度(Byte) 填充值硬件类型 2 1上层协议类型 2 0800MAC 地址长度 1 6IP 地址长度 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 帧

9、的内容如果我们构造一个这样的包发送出去,如果 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 地址为 a

10、a-aa-aa-aa-aa-aa,就是如此来填充各个字段DLC Header字段 长度(Byte) 填充值接收方 MAC 6 bbbbbbbbbbbb发送方 MAC 6 aaaaaaaaaaaaEthertype 2 0x0806图 5 ARP 响应包中 DLC Header 内容ARP Frame字段 长度(Byte) 填充值硬件类型 2 1上层协议类型 2 0800MAC 地址长度 1 6IP 地址长度 1 4操作码 2 2发送方 MAC 6 aaaaaaaaaaaa发送方 IP 4 192.168.0.1接收方 MAC 6 bbbbbbbbbbbb接收方 IP 4 192.168.0.9

11、9填充数据 18 0图 6 ARP 响应包中 ARP 帧的内容这样 192.168.0.99 的 ARP 缓存中就会多了一条关于我们 192.168.0.1 的地址映射。好了,终于到了编程实现它的时候了_我们主要是要用到 pcap_open_live 函数,不过这个函数 winpcap 的开发小组已经建议用 pcap_open 函数来代替,不过因为我的代码里面用的就是 pcap_open_live,所以也不便于 修改了,不过 pcap_open_live 使用起来也是没有任何问题的,下面是 pcap_open_live 的函 数声明:/*pcap_t* pcap_open_live ( cha

12、r * device, int snaplen, int promisc, int to_ms, char * ebuf ) 功能:根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄参数:Device : 就是前前面我们获得的网卡的名字;Snaplen : 我们从每个数据包里取得数据的长度,比如设置为 100,则每次我 们只是获得每个数据包 100 个长度的数据,没有什么特殊需求的话就把它设置为 65535 最 大值就可以了;Promisc:这个参数就是设置是否把网卡设置为“混杂模式” ,设置为 1 即可;to_ms : 超时时间,毫秒,一般设置为 1000 即可。返回值:pcap_t :

13、 类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面 截获数据要用到的。*/虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就 OK 了:pcap_t* adhandle;char errbufPCAP_ERRBUF_SIZE;/ 打开网卡,并且设置为混杂模式/ pCardName 是前面传来的网卡名字参数adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);C. 截获数据包并保存为文件:-当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的 那一瞬间进行分析,转眼就没了_所以,为了便于日后分析

14、,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正 常的事情。下面首先来详细讲解一下,这个步骤中需要用到的 winpcap 函数:/*pcap_dumper_t* pcap_dump_open ( pcap_t * p, const char * fname ) 功能:建立或者打开存储数据包内容的文件,并返回其句柄参数:pcap_t * p :前面打开的网卡句柄;const char * fname :要保存的文件名字 返回值:pcap_dumper_t* : 保存文件的描述句柄,具体细节我们不用关心*/*int pcap_next_ex ( pcap_t * p, struct pcap_pkthdr * pkt_header, u_char * pkt_data ) 功能:从网卡或者数据包文件中读取数据内容参数:pcap_t * p: 网卡句柄struct pcap_pkthdr * pkt_header: 并非是数据包的指针,只是与数据包捕获驱动 有关的一个 Headeru_char * pkt_data:指向数据包内容的指针 ,包括了协议头 返回值:1 : 如果成功读取数据包0 :pcap_open_live()设定的超时时间之

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 计算机原理

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号