程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 手把手教你玩轉ARP包(二)【數據包的游戲系列之一】

手把手教你玩轉ARP包(二)【數據包的游戲系列之一】

編輯:.NET實例教程

作者:
   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;

 

這些結構體一定能看懂吧 , 在程序中就是對號入座就好了  


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved