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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  C++ Winsockets como reconectar un cliente al server
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: C++ Winsockets como reconectar un cliente al server  (Leído 5,584 veces)
Grado 33

Desconectado Desconectado

Mensajes: 36


Para ser 1 pregunta a 1


Ver Perfil
C++ Winsockets como reconectar un cliente al server
« en: 21 Agosto 2017, 18:35 pm »

Muy buenas, he estado aprendiendo algo de sockets en windows, y trasteando, me he dado cuenta de como podría hacer un RAT (remote administration tool) a base de comandos.

Pero, me gustaría saber como puedo hacer que el CLIENTE, estando conectado al servidor, detecte si el servidor de repente ha cortado la comunicación con el cliente (bien porque yo haya manualmente cerrado el servidor, o por ejemplo porque apague el PC), y de ser así, que el cliente intente RECONECTARSE al servidor hasta que lo consiga.

Se me ha ocurrido hacer un thread que, en paralelo al main, haga una especie de ping y si el servidor no responde, el cliente intenta reconectarse al servidor tras un sleep o el intervalo de tiempo que sea. El "problema", es que no se como hacer ese ping (olvidense de system ping) o si hay otra manera de hacerlo más eficiente...

perdonad si la pregunta es muy obvia, muchas gracias...
En línea

Yuki

Desconectado Desconectado

Mensajes: 80


El error es una muestra de la incompetencia.


Ver Perfil WWW
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #1 en: 21 Agosto 2017, 22:44 pm »

Ese es uno de los problemas mas generales al usar sockets, en Windows cuando un socket se cierra por lo general se puede detectar de varias maneras, como por ejemplo cuando se deja de recibir datos de una conexión o estos son inválidos.

Si estas usando un lenguaje de alto nivel (como VB.NET, C#, Java, Python) podrías llegar a encontrar un evento especifico para este trabajo (socket_close).

Y por tu mensaje puedo entender que estas escribiendo un RAT de conexión directa, te recomendaría hacerlo de conexión inversa, pero cada quien con sus gustos.

También te dejo un poco de información extra.
En línea

Grado 33

Desconectado Desconectado

Mensajes: 36


Para ser 1 pregunta a 1


Ver Perfil
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #2 en: 21 Agosto 2017, 23:11 pm »

Estoy en C++ compilando con Dev C++, y estoy haciendo uno de conexion inversa... (o eso creo lol)
ahora miro el link y te comento, gracias
En línea

fary
Moderador
***
Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #3 en: 22 Agosto 2017, 21:36 pm »

Aquí te dejo un pequeño escrito de E0N, seguramente te servirá de ayuda.

http://foro.elhacker.net/analisis_y_diseno_de_malware/creando_un_troyano_en_vb6_c-t177919.0.html

Código sacado del enlace que te eh adjuntado:

Código
  1. while (len!=0) //Mientras que permanezcamoos conectados
  2.   {
  3.      len = recv(sock,Buffer,1023,0); //Recibimos los datos que envie
  4.  
  5.      if (len>0)  //Si seguimos conectados...
  6.  {
  7.  
  8. Buffer[len]=0; //Ponemos los datos recibidos al final de la cadena
  9.  
  10.            //Aki hay q poner el conjunto de if's para las acciones
  11.  
  12.          }
  13.    }

saludos.
En línea

Un byte a la izquierda.
Grado 33

Desconectado Desconectado

Mensajes: 36


Para ser 1 pregunta a 1


Ver Perfil
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #4 en: 26 Agosto 2017, 03:22 am »

Código
  1.  
  2.  
  3. int recv_size;
  4.  
  5.  
  6.  
  7.  
  8.      while(1)
  9.     {
  10.     comando = 0;
  11.    //Recibir respuesta del servidor
  12.    if((recv_size = recv(s , (char*)&comando , sizeof(int) , 0)) == SOCKET_ERROR)
  13.    {
  14.        puts("recv fail, reconectando");
  15.        closesocket(s);
  16.        if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  17.    {
  18.        printf("No se pudo crear el socket : %d" , WSAGetLastError());
  19.    }
  20.         while (connect(s , (struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
  21.    {
  22.        puts("Conexion fallida. Reconectando");
  23.        closesocket(s);
  24.        if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  25.        connect(s , (struct sockaddr *)&server , sizeof(server));
  26.        Sleep(3000);
  27.  
  28.    }
  29.    }
  30.     else
  31.    {
  32.    puts("Comando recibido\n");
  33.    }  
  34.  
  35.  
  36.    std::cout << comando;
  37.  
  38.    switch(comando)
  39.    {
  40.  
  41.    case 1: funcion();
  42.    break;
  43.    case 2: funcion2();
  44. //etc...
  45.    break;
  46.    default: break;
  47.    }
  48. }



Que les parece... esto me ha servido
« Última modificación: 26 Agosto 2017, 19:40 pm por Grado 33 » En línea

Yuki

Desconectado Desconectado

Mensajes: 80


El error es una muestra de la incompetencia.


Ver Perfil WWW
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #5 en: 26 Agosto 2017, 03:44 am »

Lo ideal seria (en Cramel):

Código
  1. Var hSock:Entero
  2. Repetir
  3.    hSock = TCPConectar("ip/host",666)
  4.    Si hSock Entonces
  5.        Repetir
  6.            Var Datos:Cadena
  7.            Datos = TCPRecibir(hSock,1024)
  8.            Seleccionar Datos
  9.                Caso "mostrar mensaje"
  10.                    Mensaje("Se ha recibido un mensaje del cliente!")
  11.                Caso Otro ' Si los datos son equivocados o nulos salimos del bucle.
  12.                   TCPDesconectar(hSock) ' Cerramos por si las moscas...
  13.                   Salir Repetir
  14.             FinSeleccionar
  15.        PorSiempre
  16.    FinSi
  17. PorSiempre

Creo que es obvio, pero por si no se entendió, intentamos conectar desde un bucle infinito, si se conectó recibimos datos hasta que estos sean equivocados o nulos, si esto ultimo sucede, salimos del segundo bucle y se intentará conectar automáticamente.

De esta manera no vas a necesitar que el cliente este enviando o verificando si el servidor sigue vivo ya que el estado es absoluto.
En línea

Grado 33

Desconectado Desconectado

Mensajes: 36


Para ser 1 pregunta a 1


Ver Perfil
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #6 en: 26 Agosto 2017, 04:13 am »

Puedes comentar mi codigo??
« Última modificación: 26 Agosto 2017, 19:37 pm por Grado 33 » En línea

Grado 33

Desconectado Desconectado

Mensajes: 36


Para ser 1 pregunta a 1


Ver Perfil
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #7 en: 26 Agosto 2017, 04:15 am »

Lo ideal seria (en Cramel):

Código
  1. Var hSock:Entero
  2. Repetir
  3.    hSock = TCPConectar("ip/host",666)
  4.    Si hSock Entonces
  5.        Repetir
  6.            Var Datos:Cadena
  7.            Datos = TCPRecibir(hSock,1024)
  8.            Seleccionar Datos
  9.                Caso "mostrar mensaje"
  10.                    Mensaje("Se ha recibido un mensaje del cliente!")
  11.                Caso Otro ' Si los datos son equivocados o nulos salimos del bucle.
  12.                   TCPDesconectar(hSock) ' Cerramos por si las moscas...
  13.                   Salir Repetir
  14.             FinSeleccionar
  15.        PorSiempre
  16.    FinSi
  17. PorSiempre

Creo que es obvio, pero por si no se entendió, intentamos conectar desde un bucle infinito, si se conectó recibimos datos hasta que estos sean equivocados o nulos, si esto ultimo sucede, salimos del segundo bucle y se intentará conectar automáticamente.

De esta manera no vas a necesitar que el cliente este enviando o verificando si el servidor sigue vivo ya que el estado es absoluto.

Oye y los troyanos son """"simplemente"""" eso?? enviar un comando, que no es mas que un numero o una string (en definitiva un dato/variable) y dependiendo de cual sea, el cliente ejecuta una acción u otra??
En línea

dapz

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Re: C++ Winsockets como reconectar un cliente al server
« Respuesta #8 en: 28 Agosto 2017, 16:33 pm »

Oye y los troyanos son """"simplemente"""" eso?? enviar un comando, que no es mas que un numero o una string (en definitiva un dato/variable) y dependiendo de cual sea, el cliente ejecuta una acción u otra??

a muy grosso modo si, son eso, una aplicación cliente-servidor. Sin embargo hoy en día las cosas no son tan simples. El cliente del troyano tiene que esconderse por razones obvias. Tiene que esconder llaves del registro, archivos, procesos etc, y eso se consigue con dlls que al fin y al cabo son una forma de ejecutable, necesarios para hacer hooks en windows
En línea

C/C++ ASM
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como transmitir webcam desde un server a su cliente « 1 2 3 4 »
Programación Visual Basic
goodbye 31 37,994 Último mensaje 15 Mayo 2010, 02:45 am
por Sancho.Mazorka
web cam vb server y cliente
Programación Visual Basic
crauss 8 3,750 Último mensaje 17 Diciembre 2007, 22:42 pm
por crauss
[VB] ¿Qué son sockets o winsockets?
Programación Visual Basic
avmiitxe 2 4,553 Último mensaje 18 Abril 2011, 23:05 pm
por BlackZeroX
FAX server / cliente
Software
OssoH 0 1,293 Último mensaje 19 Julio 2011, 19:01 pm
por OssoH
sockets C cliente&server error en cliente.... :huh:
Programación C/C++
kotora 1 3,008 Último mensaje 2 Noviembre 2013, 20:14 pm
por kotora
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines