手把手教你玩转ARP包(二)

原文链接:http://blog.csdn.net/piggyxp/article/details/19607

  作者:

   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) 填充值
接收方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 */

          unsigned char      padding[18];

} ARPFRAME, *PARPFRAME;

// ARP Packet = DLC header + ARP Frame

typedef struct tagARPPacket                

{

     DLCHEADER     dlcHeader;

     ARPFRAME      arpFrame;

} ARPPACKET, *PARPPACKET;

 

这些结构体一定能看懂吧,在程序中就是对号入座就好了

.................  ==================================================================       不爽这么快又满了,文章不知道要拆成几份了..-_-b      请期待下文 : )                                -----  Finished at 2004-05-29 19:41

                                ------  Made In        DLUT | DIP


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部