/* Author: Hu Jiaying Date: 2002/07/27 Email: hujiaying@sina.com Function: Denial of Service Attack on web service.To get the performance of your web server. Usage: ./DoS <#children> <#loops/child> Example: ./DoS www.myhost.com 80 /index.html 100 50 100 child process run at the same time,every child fetch 50 times Comment: To be honest,this is not a effective denial-of-service attack tool.I just want to provide a press test tool on web pages to get the performance of my web service.It connects to the web server and fecth a web page. If you want a effective denial-of-service attack tool,please refer to syn.c.It just send syn packet to web server with different source ip. Enjoy! :) */ #include #include #include #include #include #include #define MAXLINE 1024 #define MAXN 102400 //16384 int Socket(int family, int type, int protocol); void Connect(int fd, const struct sockaddr *sa, socklen_t salen); int Tcp_connect(const char *host,const char *port); void Write(int fd, void *ptr, size_t nbytes); ssize_t Readn(int fd, void *ptr, size_t nbytes); ssize_t readn(int fd, void *vptr, size_t n); void Close(int fd); pid_t Fork(void); u_int32_t domain2ip_n(const char *domain) ; main(int argc,char **argv) { int i,j,sd,nchildren,nloops,nbytes; pid_t pid; ssize_t n; char request[MAXLINE],reply[MAXN]; char PagePath[1024]; if(argc!=6) { printf("usage:%s <#children> <#loops/child>\n",argv[0]); exit(0); } memset(PagePath,0,sizeof(PagePath)); memset(request,0,sizeof(request)); strcpy(PagePath,argv[3]); nchildren=atoi(argv[4]); nloops=atoi(argv[5]); nbytes=1024*1024; snprintf(request,sizeof(request),"GET %s HTTP/1.0\r\n\r\n",PagePath); // printf("request=[%s]\n",request); for(i=0;i0);/* finally return 0,no child was available,errno is set to an appropriate value */ if(errno!=ECHILD) /* no child was available */ { printf("wait error"); exit(1); } exit(0); } int Tcp_connect(const char *host,const char *port) { int sd,port_h; u_int32_t ip; struct sockaddr_in srvaddr; struct servent *sv; sd=Socket(AF_INET,SOCK_STREAM,0); bzero(&srvaddr,sizeof(srvaddr)); srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons(atoi(port)); ip=domain2ip_n(host); memcpy(&srvaddr.sin_addr.s_addr,&ip,4); Connect(sd,(struct sockaddr *)&srvaddr,sizeof(srvaddr)); return sd; } void Write(int fd, void *ptr, size_t nbytes) { if (write(fd, ptr, nbytes) != nbytes) { printf("write error"); exit(1); } } ssize_t Readn(int fd, void *ptr, size_t nbytes) { ssize_t n; if ( (n = readn(fd, ptr, nbytes)) < 0) { printf("readn error"); exit(1); } return(n); } ssize_t /* Read "n" bytes from a descriptor. */ readn(int fd, void *vptr, size_t n) { size_t nleft; ssize_t nread; char *ptr; ptr = vptr; nleft = n; while (nleft > 0) { if ( (nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) nread = 0; /* and call read() again */ else return(-1); } else if (nread == 0) break; /* EOF */ nleft -= nread; ptr += nread; } return(n - nleft); /* return >= 0 */ } /* end readn */ void Close(int fd) { if (close(fd) == -1) { printf("close error"); exit(1); } } pid_t Fork(void) { pid_t pid; if ( (pid = fork()) == -1) { printf("fork error"); exit(1); } return(pid); } u_int32_t domain2ip_n(const char *domain) //return network order(binary) { static u_int32_t ip_n; struct hostent *ht; if((ht=gethostbyname(domain))==NULL) { printf("gethostbyname() error for host:%s:%s",domain, hstrerror(h_errno)); exit(1); } memcpy(&ip_n,ht->h_addr,4); return ip_n; } int Socket(int family, int type, int protocol) { int n; if ( (n = socket(family, type, protocol)) < 0) { printf("socket error"); exit(1); } return(n); } void Connect(int fd, const struct sockaddr *sa, socklen_t salen) { if (connect(fd, sa, salen) < 0) { printf("connect error"); exit(1); } }