轉自:http://www.cnblogs.com/laojie4321/archive/2012/04/12/2444187.html
結構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下仿真如下:
這是使用的是Ethernet V2 MAC幀,然後封裝ARP幀。另一台機器會傳回:
這樣兩台PC都知道ip和MAC位址了。
結構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下仿真如下:
這是使用的是Ethernet V2 MAC幀,然後封裝ARP幀。另一台機器會傳回:
這樣兩台PC都知道ip和MAC位址了。