ARP简介和分析

ARP简介 一. 关于ARP协议的基础知识 1.ARP的工作原理 以太网设备比如网卡都有全球唯一的MAC地址,MAC地址是网卡的物理地址,它由48位二进制数表示。其中前面24位表示网络厂商标识符,是由生产网卡的厂商向IEEE申请的厂商地址。后24位表示序号,由厂商自行分配。每个不同的网络厂商会有不同的厂商标识符,而每个厂商所生产出来的网卡都是依序号不断变化的。网卡等是以MAC地址来传输以太网数据包的(它们识别不了IP包中的IP地址),所以在以太网中进行IP通信的时候就需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。这就是ARP(Address Resolution Protocol,地址解析协议)。 arp命令可以查询本地arp缓存: arp –a 可以发现类似于这样的条目 192.168.45.100 01-23-45-67-89-ab dynamic 这就是存储的关于IP地址与MAC地址的对应关系,dynamic表示是临时存储在ARP缓存中的条目,过一段时间就会超时被删除(xp/2003系统是2分钟)。 这样一来,某台电脑要和一台机器(比如192.168..45.1)通信的时候,它会首先去检查arp缓存,查找是否有对应的arp条目,如果没有,它就会给这个以太网络发ARP请求包广播询问192.168.45.1的对应MAC地址,当然,网络中每台电脑都会收到这个请求包,但是它们发现192.168.45.1并非自己,就不会做出相应,而192.168.45.1就会回复一个ARP应答包,告诉它的MAC地址是xx-xx-xx-xx-xx-xx,于是发出ARP请求的计算机中的ARP缓存就会相应刷新,多了这么一条: 192.168.45.1 xx-xx-xx-xx-xx-xx dynamic ARP缓存是为了避免每发一个IP包都要发个广播查询地址。 网络设备是无法识别ARP包的真伪的,如果按照ARP的格式来发送数据包,只要信息有效计算机就会根据包中的内容做相应的反应. 2.ARP包的格式 从网络底层看来,一个ARP包是分为两个部分的,前面一个是物理帧头,后面一个才是ARP帧。 首先,物理帧头,它将存在于任何一个协议数据包的前面,被称为DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以便硬件设备识别。 DLC Header 字段 长度(Byte) 默认值 备注 接收方MAC 6 广播时,为 ff-ff-ff-ff-ff-ff 发送方MAC 6 Ethertype 2 0x0806 0x0806是ARP帧的类型值 图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帧格式 3.ARP包的填充 1) 请求包的填充: 例某计算机A的MAC地址为 aa-aa-aa-aa-aa-aa,IP为 192.168.0.1 要查询 192.168.0.99的MAC地址: 首先填充DLC Header;想要知道某个计算机对应的MAC地址是要给全网发送广播的,所以接收方MAC是 ffffffffffff。于是DLC Header就填充完成了,如图: DLC Header 字段 长度(Byte) 填充值 接收方MAC 6 ffffffffffff 发送方MAC 6 aaaaaaaaaaaa Ethertype 2 0x0806 图3 ARP请求包中 DLC Header内容 接下来是ARP帧,请求包的操作码是 1;发送方的MAC以及IP应当填入A的相应数据;需要注意的是:这里的接收方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 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. 填充数据包 相应的数据结构: // 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 */ unsigned char padding[18]; } ARPFRAME, *PARPFRAME; // ARP Packet = DLC header + ARP Frame typedef struct tagARPPacket { DLCHEADER dlcHeader; ARPFRAME arpFrame; } ARPPACKET, *PARPPACKET; 2.发送ARP数据包 发送ARP包需要用到winpcap的api。具体步骤及函数详见下面的代码(为了简单,错误处理的地方都被去掉了): /******************************************************************* * * 功能: * 发送ARP数据包 * *******************************************************************/ void SendARPPacket() { char *AdapterDeviceName =GetCurAdapterName(); // 首先获得获得网卡名字 lpAdapter = PacketOpenAdapter(AdapterDeviceName); // 根据网卡名字打开网卡 lpPacket = PacketAllocatePacket(); // 给PACKET结构指针分配内存 PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket)); //初始化PACKET结构指针,其中的ARPPacket是已经填充的ARP包 PacketSetNumWrites(lpAdapter, 1); // 每次只发送一个包 PacketSendPacket(lpAdapter, lpPacket, true); PacketFreePacket(lpPacket); // 释放资源 PacketCloseAdapter(lpAdapter); } 使用ARP包的tricks 在没有安全防护的网络里...... 1) 如果 发一个请求包广播,其中的ARP帧里相关的信息填成这样: 发送方MAC 6 随便乱填一个错误的 发送方IP 4 填上本机的IP 本机将会显示一个IP地址冲突的提示。同样的道理,如果发送方IP填成别人的,然后,每隔x秒发一次……… 2) 假设A、B都靠一个网关192.168.0.1上网 ,如果A想让B(192.168.0.77)上不了网,就可以伪装成网关给192.168.0.77发一个错误的ARP响应包,如: 发送方MAC 6 随便乱填一个错误的 发送方IP 4 网关IP 192.168.0.1 接收方就填192.168.0.77的相关信息,........ 同时可以参阅文章ARP协议分析 发表于: 2006-07-29,修改于: 2006-07-29 21:01,已浏览419次,有评论0条 推荐 投诉

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值