EXE reciba algo de DLL y se piense que lo ha enviado el servidor

Iniciado por SnakeDrak, 21 Mayo 2010, 02:51 AM

0 Miembros y 1 Visitante están viendo este tema.

SnakeDrak

Hola,

¿Perdona? Desde que empezaste a responder en el tema sabía que no podías resolverme mi duda principal (o tal vez no lo entendiste) y no te he faltado el respeto en ningún momento, al contrario, te lo he agradecido y te lo agradezco de nuevo por intentar ayudarme.

A y si te interesa te explico por qué no se puede hacer lo que dices: El hook que he hecho (bueno es básicamente lo que es un hook) lo que hace es cambiar la función recv que lee el EXE del winsock por la mía del DLL, con esto puedo recibir, modificar lo que recibe el EXE, leer lo que recibe.. etc, pero no puedo hacer que reciba algo nuevo al EXE..

Ahora mi duda es como enviar al EXE algo, o hacer que reciba algo nuevo :), eso no sé hacerlo, aunque ejecute el recv original este está en el winsock y el EXE no se interpone.. es decir no le llega nada al EXE.

De nuevo gracias por tu ayuda, no soy ningún experto pero sé perfectamente lo que he hecho y hago (para eso me costó aprender).

bizco

#11
yo tampoco te he faltado el respeto.

Citar
int recv(
 __in   SOCKET s,
 __out  char *buf,
 __in   int len,
 __in   int flags
);

aun piensas que no puedes hacer llegar lo que tu quieras al exe? yo creo que si.

Citar
con esto puedo recibir, modificar lo que recibe el EXE, leer lo que recibe.. etc, pero no puedo hacer que reciba algo nuevo al EXE..

tu mismo te contestas.

CitarDesde que empezaste a responder en el tema sabía que no podías resolverme mi duda principal

pues te conteste lo mas logico, si la funcion esta en el cliente lo mas logico es un puntero a funcion. esto implica, localizar la funcion, parametros que acepta y poco mas, esta es la forma correcta de hacer lo que pides. pero si te empeñas en hacerlo desde el socket, poder se puede.

SnakeDrak

Hola ctlon,

Sé que esa es la forma correcta, de hecho lo comento en mi primer post, pero no sé hacerla y como me urge prisa pensé hacerlo de esa manera.

A ver ctlon es que no me estás entendiendo, si lees mi primer post lo entenderás, la única manera que hay para hacer llegar al EXE lo que yo quiera es SACRIFICANDO un packet, es decir, cuando reciba algo modificarlo antes de finalizar la función hook y entonces le llegará lo que yo quiera, pero NO quiero esto, quiero que directamente reciba algo del DLL sin necesidad de que le llegue algo.

Si después de esta explicación aún insistes en que se puede, ¿podrías explicarme cómo?

Saludos.

bizco

En la misma msdn tienes este codigo:


do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );



recv en tu caso llama a tu dll, solo tienes que copiar los datos al buffer y hacer return sin llamar a la funcion original.

SnakeDrak

Hola ctlon,

Ya me rindo en explicártelo, así no se puede, no se puede porque aunque ejecutas el recibir del EXE (el hookeado) EL BUFFER RESULTANTE no lo LEERÁ el EXE porque has ejecutado la función desde otra función en el DLL, la única manera de hacerlo como he dicho 10 veces es que cuando SE EJECUTE el recibir, modifiques el buffer y así el buf resultante pase al EXE.

Ese código que me pusiste me resulta un poco tonto, tengo poco nivel de ingeniería inversa pero sé leer la documentación de msdn y ejecutar recv.. de hecho sin eso nunca podría haber hecho un hook.

Ya que me has "explicado" tu manera de hacerlo y he he explicado que eso NO se puede así hacer lo que yo digo, te doy las gracias por tu ayuda pero si no puedes aportar más esperaré a que alguien más responda, de verdad es que insistes en lo mismo, que ya había llegado a pensar que era otra cosa y por eso te pregunté cómo hacerlo pero tu manera no es más que la que te dije que no me sirve.

Saludos y gracias!!

bizco

CitarYa me rindo en explicártelo, así no se puede, no se puede porque aunque ejecutas el recibir del EXE (el hookeado) EL BUFFER RESULTANTE no lo LEERÁ el EXE porque has ejecutado la función desde otra función en el DLL

No sabes ni que estas diciendo,me rindo contigo.


[Zero]

Y si haces un send al puerto que está escuchando el exe  :huh: . Si no funciona porque el exe utiliza algo para comprobar si el servidor es realmente el servidor, hookea ese algo.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

SnakeDrak

Hola,

¿Mm pero imagino que si no es por el mismo socket no funcionará no? No lo sé pero voy a probar como dices, tal vez funcione la verdad, muchas gracias por tu respuesta Hacker_Zero.

Saludos!

bizco

#18
Hookeas socket = Guardas el manejador.

setsockopt activas SO_RCVTIMEO = Ya no queda "enganchado" y te llamara todo el rato. esta funcion tiene que estar escrita perfectamente para evitar fallos de conexion.

hookeas recv = copias al buffer los datos y retornas el numero de caracteres copiados.

Y no me digas que no funciona pq lo he probado aproposito. esto haciendolo simple, para mas detalles te lees la documentacion.

Citar
Ya me rindo en explicártelo, así no se puede, no se puede porque aunque ejecutas el recibir del EXE (el hookeado) EL BUFFER RESULTANTE no lo LEERÁ el EXE porque has ejecutado la función desde otra función en el DLL, la única manera de hacerlo como he dicho 10 veces es que cuando SE EJECUTE el recibir, modifiques el buffer y así el buf resultante pase al EXE.

de primeras tu no ejecutas nada, es el programa el que llama a la funcion y no tiene que leer nada, es la funcion la que copia los datos en el buffer.

CitarEse código que me pusiste me resulta un poco tonto, tengo poco nivel de ingeniería inversa pero sé leer la documentación de msdn y ejecutar recv.. de hecho sin eso nunca podría haber hecho un hook.

El codigo es precisamente de la MSDN. a mi me sorprende que como no sabiendo usar punteros a funciones seas capaz de hacer un hook.


SnakeDrak

#19
Hola ctlon,

Cita de: ctlon
Hookeas socket = Guardas el manejador.

No he dicho que no tenga el manejador, el manejador lo tengo la cosa es como enviar al cliente por el socket ya abierto puesto que send envía al servidor.

Cita de: ctlon
setsockopt activas SO_RCVTIMEO = Ya no queda "enganchado" y te llamara todo el rato. esta funcion tiene que estar escrita perfectamente para evitar fallos de conexion.

Esta función no la conocía.

Cita de: ctlon
Y no me digas que no funciona pq lo he probado aproposito. esto haciendolo simple, para mas detalles te lees la documentacion.

No sé como dices que de la manera que explicas te funcione, posiblemente sigues sin entender el problema que tengo.

Cita de: ctlon
de primeras tu no ejecutas nada, es el programa el que llama a la funcion y no tiene que leer nada, es la funcion la que copia los datos en el buffer.

Vuelves a no entenderlo o tal vez soy yo, te hago un apunte :p:


/*********************************************************************
* Hook a la función "RECV", aquí es donde haremos todo el proceso del antibot
*********************************************************************/
int WINAPI __stdcall recibir(SOCKET s, char* buf, int len, int flags)
{
int RecvBytes = (!announce)?_recv(s, buf, len, flags):Kami(buf);
if(RecvBytes == SOCKET_ERROR) return RecvBytes;
if((*(unsigned short*)buf)==0x283) CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Kami, 0, 0, 0);
if((*(unsigned short*)buf)==0x0041) RecvBytes=antibot(s, buf, RecvBytes, len, flags); // Si el packet recibido es del antibot lo ejecutamos
return RecvBytes;
}


Este es la función hookeada, el packet 0x283 es el de cuando el jugador accede al juego, lo que hace es crear otro thread para enviar el broadcast una vez que ha entrado al juego (esto es lo que hice rápido a tu manera pero de la forma que yo quiero).

Tu lo que dices es que ahí modifique el BUF, el cual luego obtiene el EXE, pero entonces el packet 0x283 no será recibido (ya que lo modifico por el 0x9a) por el EXE así que lo que yo quiero es que cuando entre al juego el DLL envíe un nuevo packet al EXE por eso te comenté lo de ejecutar recibir (que obviamente no funciona así) porque habrá que ejecutar la función (la cual no sé cómo será, tal vez estoy hoy espeso) para enviarle los datos al EXE.

Ese recibir es el que he hecho rápido según tu manera (sin modificar el BUF de ningún packet) y obviamente no funciona porque la función no es ejecutada por el EXE, aquí te dejo la función kami:

/**********************************************************************
* La función Kami envía al cliente un mensaje
**********************************************************************/
int Kami(char* buf){
char msg[] = "Mensaje de prueba";
int len = 4+sizeof(msg);

if(!announce){
char* almacen = (char*)malloc(len);
Sleep(1000); // Esperar 1 segundo una vez entrado al juego antes de enviar el mensaje
announce = 1;
recibir((SOCKET)NULL, (char*)almacen, len, 0);
free(almacen);
ExitThread(0);
return 0;
}

announce = 0;
*(unsigned short*)buf = 0x9a; // Packet broadcast
*(unsigned short*)(buf+2) = len; // Tamaño del packet
memcpy(buf+4, msg, sizeof(msg)); // Añadimos el mensaje
return len;
}


Tal vez con las funciones entiendas por qué no funciona tu manera.

Cita de: ctlon
El codigo es precisamente de la MSDN. a mi me sorprende que como no sabiendo usar punteros a funciones seas capaz de hacer un hook.

Tal vez porque la función recv sé que se encuentra en Ws2_32.dll y que se llama recv, entonces puedo llamar a la dirección de memoria con GetProcAddres y el handle GetModuleHandle y así modificar los primeros 5 bytes para que apunte a mi función. No hay que ser un genio para hacer esto... si sé hacer punteros a funciones, en todo caso no sé como saber cual es la función que el EXE ejecuta cuando envía un broadcast :p.

Puedes seguir pensando que soy un idiota, la verdad es que me da igual pero creo que si no lo pensases tal vez avanzaríamos más rápido, más que nada porque el hecho de demostrarte que sé utilizar la función recv (que con mirar la doc basta) es una pérdida de tiempo, gracias por tu ayuda y espero que entiendas con ese código rápido que hice por qué es que no funciona lo que dices (o tal vez yo no te entiendo a ti).

P.D: Para que me entiendas, yo no quiero modificar lo que recibe el EXE (esto ya lo hago para otras cosas), lo que quiero es enviar algo nuevo al EXE desde el dll.
Saludos!