您的位置:首页 > 其它

手把手教你玩转ARP包(二)【数据包的游戏系列之一】

2008-04-27 17:32 477 查看
作者: CSDN VC/MFC 网络编程 PiggyXP ^_^ 目录: . 关于ARP协议的基础知识 3. ARP包的填充二。发送数据包的编程实现 1.填充数据包 .........................紧接上文............................ 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)填充值接收方MAC6ffffffffffff发送方MAC6aaaaaaaaaaaaEthertype20x0806图3 ARP请求包中 DLC Header内容 接下来是ARP帧,请求包的操作码当然是 1,发送方的MAC以及IP当然填入我们自己的,然后要注意一下,这里的接收方IP填入我们要查询的那个IP地址,就是192.168.0.99了,而接收方MAC填入任意值就行,不起作用,于是,如图, ARP Frame字段长度(Byte)填充值硬件类型21上层协议类型20800MAC地址长度16IP地址长度14操作码21发送方MAC6aaaaaaaaaaaa发送方IP4192.168.0.1接收方MAC6任意值 xxxxxxxxxxxx接收方IP4192.168.0.99填充数据180 图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)填充值接收方MAC6bbbbbbbbbbbb发送方MAC6aaaaaaaaaaaaEthertype20x0806 图5 ARP响应包中 DLC Header内容 ARP Frame字段长度(Byte)填充值硬件类型21上层协议类型20800MAC地址长度16IP地址长度14操作码22发送方MAC6aaaaaaaaaaaa发送方IP4192.168.0.1接收方MAC6bbbbbbbbbbbb接收方IP4192.168.0.99填充数据180 图6 ARP响应包中 ARP帧的内容 这样192.168.0.99的ARP缓存中就会多了一条关于我们192.168.0.1的地址映射。 好了,终于到了编程实现它的时候了^_^ 二. 发送ARP包的编程实现1. 填充数据包上面的那些关于ARP包各个字段的表格,对应在程序里就是结构体,对应于上面的表格,于是我们需要三个下面这样的结构体// DLC Headertypedef struct tagDLCHeader { unsigned char DesMAC[6]; /* destination HW addrress */ unsigned char SrcMAC[6]; /* source HW addresss */ unsigned short Ethertype; /* ethernet type */} DLCHEADER, *PDLCHEADER;// ARP Frametypedef 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 Frametypedef struct tagARPPacket { DLCHEADER dlcHeader; ARPFRAME ARPFrame;} ARPPACKET, *PARPPACKET; 这些结构体一定能看懂吧,在程序中就是对号入座就好了.................
================================================================== 不爽这么快又满了,文章不知道要拆成几份了..-_-b 请期待下文 : ) ----- Finished at 2004-05-29 19:41 ------ Made In DLUT | DIP
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐