天天看點

ARP協定的封包格式

轉自:http://www.cnblogs.com/laojie4321/archive/2012/04/12/2444187.html

ARP協定的封包格式

結構ether_header定義了以太網幀首部;結構arphdr定義了其後的5個字段,其資訊

用于在任何類型的媒體上傳送ARP請求和回答;ether_arp結構除了包含arphdr結構外,

還包含源主機和目的主機的位址。

定義常量

#define EPT_IP   0x0800   

#define EPT_ARP   0x0806   

#define EPT_RARP 0x8035   

#define ARP_HARDWARE 0x0001   

#define ARP_REQUEST 0x0001   

#define ARP_REPLY 0x0002   

定義以太網首部

typedef struct ehhdr 

{

unsigned char eh_dst[6];  

unsigned char eh_src[6];  

unsigned short eh_type;  

}EHHDR, *PEHHDR;

定義以太網arp字段

typedef struct arphdr

{

//arp首部

unsigned short arp_hrd;   

unsigned short arp_pro;   

unsigned char arp_hln;   

unsigned char arp_pln;   

unsigned short arp_op;    

unsigned char arp_sha[6];   

unsigned long arp_spa;   

unsigned char arp_tha[6];   

unsigned long arp_tpa;   

}ARPHDR, *PARPHDR;

定義整個arp封包包,總長度42位元組

typedef struct arpPacket

{

EHHDR ehhdr;

ARPHDR arphdr;

} ARPPACKET, *PARPPACKET;

ARP請求包的分析:如下所示為一個ARP請求包

0000   ff   ff    ff    ff   ff   ff 00 0c f1 d4 d9 60 08 06 00 01 ...........`....

0010   08 00 06 04 00 01 00 0c f1 d4 d9 60 c0 a8 01 0f ...........`....

0020   00 00 00 00 00 00 c0 a8 01 02                              ..........

根據定義,頭6個位元組是以太網目的位址 ff ff ff ff ff ff 這是一個廣播位址,全網下的所有終端都能接收到,緊跟着的6個位元組是以太網源位址,即發送者的MAC位址( 00 0c f1 d4 d9 60 是我的MAC位址)。

幀類型0806占兩個位元組,到這裡以太網幀頭就結束了。0806指的是後面的資料是屬于arp包的。

接着分析ARP標頭。頭兩個位元組是硬體類型 00 01,接着兩個位元組是協定類型,即ARP使用的是IP協定代号08 00。硬體位址長度和協定位址長度分别是6和4。這與ARP封包格式是對應的。後面的2個位元組OP訓示目前包是請求包還是應答包,對應的值分别是0x0001和0x0002。原始資料裡是00 01是以這是一個請求包,然後6個位元組又是發送者MAC位址00 0c f1 d4 d9 60 ,後面4個位元組是發送者IP位址c0 a8 01 0f ,轉換成點分十進制格式即192.168.1.15,這是我的IP,接下來的6個位元組留白,00 00 00 00 00 00 在arp請求包裡也可以是其他資料,因為稍後IP位址為c0 a8 01 02 (192.168.1.2)會把自己的MAC位址填充進這6個位元組中。

填充完後,arp包裡的發送者硬體位址|目标硬體位址和以太網首部的以太網目的位址|以太網源位址正好對調。最後把這個封裝好的ARP包發送出去,這樣一個來回就可以讓兩台終端互相知道對方的IP和MAC。

ARP欺騙的3種基本方式:

1. 主機C冒充網關欺騙主機B;

2. 主機c冒充主機B欺騙網關;

3. 主機C同時欺騙主機B和網關,實作資料中轉,并監聽到所有主機B的資料。

PT下仿真如下:

ARP協定的封包格式

這是使用的是Ethernet V2 MAC幀,然後封裝ARP幀。另一台機器會傳回:

ARP協定的封包格式

這樣兩台PC都知道ip和MAC位址了。

ARP協定的封包格式

結構ether_header定義了以太網幀首部;結構arphdr定義了其後的5個字段,其資訊

用于在任何類型的媒體上傳送ARP請求和回答;ether_arp結構除了包含arphdr結構外,

還包含源主機和目的主機的位址。

定義常量

#define EPT_IP   0x0800   

#define EPT_ARP   0x0806   

#define EPT_RARP 0x8035   

#define ARP_HARDWARE 0x0001   

#define ARP_REQUEST 0x0001   

#define ARP_REPLY 0x0002   

定義以太網首部

typedef struct ehhdr 

{

unsigned char eh_dst[6];  

unsigned char eh_src[6];  

unsigned short eh_type;  

}EHHDR, *PEHHDR;

定義以太網arp字段

typedef struct arphdr

{

//arp首部

unsigned short arp_hrd;   

unsigned short arp_pro;   

unsigned char arp_hln;   

unsigned char arp_pln;   

unsigned short arp_op;    

unsigned char arp_sha[6];   

unsigned long arp_spa;   

unsigned char arp_tha[6];   

unsigned long arp_tpa;   

}ARPHDR, *PARPHDR;

定義整個arp封包包,總長度42位元組

typedef struct arpPacket

{

EHHDR ehhdr;

ARPHDR arphdr;

} ARPPACKET, *PARPPACKET;

ARP請求包的分析:如下所示為一個ARP請求包

0000   ff   ff    ff    ff   ff   ff 00 0c f1 d4 d9 60 08 06 00 01 ...........`....

0010   08 00 06 04 00 01 00 0c f1 d4 d9 60 c0 a8 01 0f ...........`....

0020   00 00 00 00 00 00 c0 a8 01 02                              ..........

根據定義,頭6個位元組是以太網目的位址 ff ff ff ff ff ff 這是一個廣播位址,全網下的所有終端都能接收到,緊跟着的6個位元組是以太網源位址,即發送者的MAC位址( 00 0c f1 d4 d9 60 是我的MAC位址)。

幀類型0806占兩個位元組,到這裡以太網幀頭就結束了。0806指的是後面的資料是屬于arp包的。

接着分析ARP標頭。頭兩個位元組是硬體類型 00 01,接着兩個位元組是協定類型,即ARP使用的是IP協定代号08 00。硬體位址長度和協定位址長度分别是6和4。這與ARP封包格式是對應的。後面的2個位元組OP訓示目前包是請求包還是應答包,對應的值分别是0x0001和0x0002。原始資料裡是00 01是以這是一個請求包,然後6個位元組又是發送者MAC位址00 0c f1 d4 d9 60 ,後面4個位元組是發送者IP位址c0 a8 01 0f ,轉換成點分十進制格式即192.168.1.15,這是我的IP,接下來的6個位元組留白,00 00 00 00 00 00 在arp請求包裡也可以是其他資料,因為稍後IP位址為c0 a8 01 02 (192.168.1.2)會把自己的MAC位址填充進這6個位元組中。

填充完後,arp包裡的發送者硬體位址|目标硬體位址和以太網首部的以太網目的位址|以太網源位址正好對調。最後把這個封裝好的ARP包發送出去,這樣一個來回就可以讓兩台終端互相知道對方的IP和MAC。

ARP欺騙的3種基本方式:

1. 主機C冒充網關欺騙主機B;

2. 主機c冒充主機B欺騙網關;

3. 主機C同時欺騙主機B和網關,實作資料中轉,并監聽到所有主機B的資料。

PT下仿真如下:

ARP協定的封包格式

這是使用的是Ethernet V2 MAC幀,然後封裝ARP幀。另一台機器會傳回:

ARP協定的封包格式

這樣兩台PC都知道ip和MAC位址了。

繼續閱讀