一、逐个元素组包
//msg存放arp应答报文
unsigned char msg[]={
/*mac头部(14个字节)*/
0x70,0x5A,0x0F,0x63,0xF5,0x9D, /*目的mac地址(xp的mac))*/
0x00,0x00,0x00,0x00,0x00,0x00, /*源mac地址(伪装的mac)*/
0x08,0x06, /*帧类型*/
/*ARP报文头部(28个字节)*/
0x00,0x01, /*硬件类型*/
0x08,0x00, /*协议类型*/
6, /*硬件地址长度*/
4, /*协议地址长度*/
0x00,0x02, /*ARP应答*/
0x00,0x00,0x00,0x00,0x00,0x00, /*源ac地址(伪装的mac)*/
192,168,0,111, /*源IP(ubuntu的IP地址)*/
0x70,0x5A,0x0F,0x63,0xF5,0x9D, /*目的mac地址(XP的mac)*/
192,168,0,110 /*目的IP*/
};
二、利用结构体方式组包
以太网头部
ARP头部
使用的时候需要在/usr/include/net/if_arp.h
中将arphdr结构体中的#if 0改为1
//组arp应答报文msg(mac头部+arp头部)
unsigned char dst_mac[6]={0x70,0x5A,0x0F,0x63,0xF5,0x9D,};//目的mac地址(xp的mac))
unsigned char src_mac[6]={0x00}; //源mac地址
unsigned char src_ip[4]={192,168,0,111}; //源IP
unsigned char dst_ip[4]={192,168,0,110}; //目的IP
unsigned char msg[1024]="";
//1.组mac头部
struct ether_header *eth_addr = (struct ether_header *)msg;
//赋值mac地址
memcpy(eth_addr->ether_dhost, dst_mac, 6);
memcpy(eth_addr->ether_shost, src_mac, 6);
//赋值帧类型
eth_addr->ether_type = htons(0x0806);
//2.组arp头部
struct arphdr *arp_head = (struct arphdr *)(msg+14); //跳过mac头的空间
arp_head->ar_hrd = htons(1); //硬件类型
arp_head->ar_pro = htons(0x0800); //协议类型
arp_head->ar_hln = 6; //硬件地址长度(一个字节不存在大小端,不需要用htons)
arp_head->ar_pln = 4; //协议地址长度
arp_head->ar_op = htons(2); //arp应答
memcpy(arp_head->__ar_sha, src_mac, 6); //源mac
memcpy(arp_head->__ar_sip, src_ip, 4); //源ip
memcpy(arp_head->__ar_tha, dst_mac, 6); //目的mac
memcpy(arp_head->__ar_tip, dst_ip, 4); //目的ip