Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: while en 30 Septiembre 2010, 20:46 pm



Título: enviar paquetes por socket que ya existe
Publicado por: while en 30 Septiembre 2010, 20:46 pm
Hola, expongo mi caso:
Tengo un ejecutable (hace de cliente)(no dispongo del código fuente).
Para añadirle funcionalidades al mismo, uso una dll que inyecto al propio ejecutable.
Tengo un servidor.

Entonces:
(Desde la DLL) Quiero enviar un paquete al servidor, por un socket ya existente.
Ese socket lo crea el propio cliente en el momento que el usuario escribe su usuario y contraseña y le da a enviar. (y se establece la conexión con el servidor)

Entonces,
para enviar el paquete, primero debo saber cuando se ha establecido la conexión.
Deberia hacer un hook a recv?
una vez pillo que se ha enviado el paquete 0x01, como envio yo el buf "hola" por el mismo socket?
Deberia hacer: ?

int bytesSent;
char sendbuf[32] = "hola";

bytesSent = send( ConnectSocket, sendbuf, strlen(sendbuf), 0 );
ahora bien, necesito sacar el ConnectSocket ya existente, ya que si hiciese SOCKET ConnectSocket; estaria creando uno nuevo y no es lo que busco.
Busco usar uno ya existente. (y como siempre cambia, no se como podria pillarlo ¿algun ejemplo?)

Saludos y muchas gracias.


Título: Re: enviar paquetes por socket que ya existe
Publicado por: bizco en 30 Septiembre 2010, 22:16 pm
lo mejor es que depures el programa y veas donde guarda el descriptor del socket, despues solo tienes que enviar los datos.


Título: Re: enviar paquetes por socket que ya existe
Publicado por: while en 30 Septiembre 2010, 23:07 pm
hola ctlon, muchas gracias por responder.

Edito:
Bueno, he programado un cliente y un servidor sencillos para comprobar comportamientos, y asi poder entender mejor si me explicais:

Comun en el cliente y el servidor:
Código:
static char bufrecibir[2048];
char *bufenviar;


Servidor:
Código:
// enviar bienvenida.
bufenviar = "bienvenido al servidor";
send (comunicacion,bufenviar, strlen(bufenviar), 0);

// recibir gracias.
recv(comunicacion,bufrecibir,sizeof(bufrecibir), 0);
memset (bufrecibir, 0, sizeof (bufrecibir));

// enviar de nada.
bufenviar = "de nada";
send (comunicacion,bufenviar, strlen(bufenviar), 0);


Cliente:
Código:
// recibir bienvenida.
recv(comunicacion,bufrecibir,sizeof(bufrecibir), 0);
memset (bufrecibir, 0, sizeof (bufrecibir));

// enviar gracias.
bufenviar = "gracias";
send (comunicacion,bufenviar, strlen(bufenviar), 0);

// recibir de nada.
recv(comunicacion,bufrecibir,sizeof(bufrecibir), 0);
memset (bufrecibir, 0, sizeof (bufrecibir));

Aqui por ejemplo haciendo un cout << comunicacion;
este me devuelve 120, por lo este es el decriptor (rectificarme si me equivoco)

Ahora bien, y si yo quito del cliente la parte 2 (enviar gracias)
// enviar gracias.
bufenviar = "gracias";
send (comunicacion,bufenviar, strlen(bufenviar), 0);

como hago para que esto, lo envie la dll inyectada?
quizas con:
send (120,"gracias", strlen("gracias"), 0);
?
y como puedo saber en la dll, que el cliente ha recibido la bienvenida? (para saber en que momento ha de enviar la dll claro)


Edito de nuevo:

he puesto en el cliente:
// enviar gracias.
LoadLibrary( "dll.dll" );

y en la dll tengo:
send (112,"gracias desde la dll", strlen("gracias desde la dll"), 0);
printf("Mensaje enviado\n");
y se envia.

Ahora, como puedo cargar el LoadLibrary( "dll.dll" );
al inicio del programa, y hacer que el dll sepa cuando enviar las gracias?

Edito otra vez:
Como podria ver el descriptor con wireshark?