Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SnakeDrak en 21 Mayo 2010, 02:51 am



Título: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 02:51 am
Hola,

Explico un poco la situación, tengo un DLL inyectado hexadecimalmente que se ejecuta en un EXE para hookear las funciones de winsock y así leer todo lo que envía, recibe y además enviar y recibir por su misma conexión.

Mi problema surge cuando quiero utilizar una función determinada del EXE, como aún no sé cómo hacerlo así, pensé en hacerlo por un packet, es decir, quiero que el EXE reciba algo del DLL y se piense que lo ha enviado el servidor. Lo necesito así ya que conozco el servidor y sé que packet debo enviar para ejecutar una determinada función en el cliente, pero quiero hacerlo sin tocar nada del servidor con lo cual he pensado en la manera más simple: hacer que el cliente "reciba" un determinado packet pero enviándolo desde el DLL.

Tengo hookeadas las funciones del winsock pero aún así esto no me sirve para eso, tendría que sacrificar un packet recibido para colocar el que yo quiero y no me vale esa manera (obviamente), lo que necesito es que reciba un nuevo packet como si fuese del servidor.

Ojalá me hayan entendido y puedan ayudarme, saludos!!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 02:59 am
creo que te estas complicando mas de la cuenta, la funcion como tu dices esta en el cliente, un puntero a funcion soluciona tus problemas y la podras llamar siempre que quieras con los datos que necesites.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 03:02 am
Hola ctlon,

Pero no tengo ni idea, ni del nombre de la función, ni de su utilización, ni de como llamar a la dirección de memoria donde se encuentra etc.. sé muy poco de ingeniería inversa así que tu manera no me sirve, a mi me resulta más fácil hacer que el cliente "reciba" algo como si lo hubiese enviado el servidor, bueno creo tal vez es más complicado de lo que yo imagino.

Si puedes ayudarme con la función también podría intentarlo, imagino que debo debugear y ver que función se ejecuta pero ahí me quedaría me parece, no creo que sea tan sencillo como un hook al send y recv del winsock.

Saludos y gracias!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 03:05 am
que programa es? que funcion te interesa?. no me cuadran cosas de tus respuestas, pero bueno da mas informacion.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 03:10 am
Hola,

Es un juego al cual le he creado un AntiBot por DLL que se comunica con el servidor, con unos algoritmos y tal.

Es una función propia del juego, la función en concreto lo que hace es enviar un mensaje global a si mismo, sale de un color especial no como el texto normal. Sinceramente no creo que esto ayude jaja xD.

El juego cuando recibe el packet (0x9A por si te interesa) automáticamente ejecuta esa función con el texto enviado en el mismo packet, por eso pensé hacer como un envío al cliente pero desde la DLL.

Haciendo debug imagino que puedo ver cual es la función que ejecuta al recibir 0x9A pero después no sabría como llamarla desde el DLL, como obtener la dirección de memoria.

Saludos!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 04:25 am
creas un puntero a funcion, del mismo modo que has tenido que hacer para los hooks.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 04:52 am
Hola,

Pero la dirección de memoria de los hook es muy simple con GetProcAddress y GetModuleHandle ya que sé que se encuentran en Ws2_32.dll y se el nombre de la función (recv, send, connect..). Bueno supongo que una vez sepa cual es el nombre de la función (si es que usa una función, porque si está por ejemplo en un case ya sí que estaré perdido) ¿debería acceder a la dirección de memoria pasándole el handle del proceso y el nombre de la función? no creo que sea algo tan fácil pero lo probaré mañana.

Aún así sigo esperando mi consulta de cómo enviar algo desde la DLL al cliente como si fuese el servidor.

Saludos.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 05:12 am
dale un ojo recv.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 21:58 pm
Hola,

¿? Qué tiene que ver la función recv con esto?, por mucho que la ejecute no envía al cliente los datos recibidos.. bueno supongo que no puedes ayudarme más en mi problema, gracias por tu ayuda :D esperaré a que alguien pueda echarme un cable.

Saludos!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 22:10 pm
Citar
¿? Qué tiene que ver la función recv con esto?

programa original -> recv hookeada (tu dll) -> recv original

si aun crees que no tiene nada que ver con lo que pides es que sinceramente no sabes ni que estas haciendo, ni que es lo que quieres.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 21 Mayo 2010, 22:28 pm
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).


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 21 Mayo 2010, 22:32 pm
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.

Citar
Desde 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.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 22 Mayo 2010, 00:24 am
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.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 22 Mayo 2010, 00:36 am
En la misma msdn tienes este codigo:

Código:
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.


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 22 Mayo 2010, 00:43 am
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!!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 22 Mayo 2010, 00:51 am
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

No sabes ni que estas diciendo,me rindo contigo.



Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: [Zero] en 22 Mayo 2010, 01:29 am
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


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 22 Mayo 2010, 01:46 am
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!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 22 Mayo 2010, 02:13 am
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.

Citar
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.

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.



Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 22 Mayo 2010, 08:45 am
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:

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

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:
Código
  1. /**********************************************************************
  2.  * La función Kami envía al cliente un mensaje
  3. **********************************************************************/
  4. int Kami(char* buf){
  5. char msg[] = "Mensaje de prueba";
  6. int len = 4+sizeof(msg);
  7.  
  8. if(!announce){
  9. char* almacen = (char*)malloc(len);
  10. Sleep(1000); // Esperar 1 segundo una vez entrado al juego antes de enviar el mensaje
  11. announce = 1;
  12. recibir((SOCKET)NULL, (char*)almacen, len, 0);
  13. free(almacen);
  14. ExitThread(0);
  15. return 0;
  16. }
  17.  
  18. announce = 0;
  19. *(unsigned short*)buf = 0x9a; // Packet broadcast
  20. *(unsigned short*)(buf+2) = len; // Tamaño del packet
  21. memcpy(buf+4, msg, sizeof(msg)); // Añadimos el mensaje
  22. return len;
  23. }
  24.  

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!


Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: bizco en 22 Mayo 2010, 14:48 pm
y dale.

Citar
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.

pero repetimos, el cliente te llama a ti y una leve ojeada a la documentacion:

Citar
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

No he dicho que uses send logicamente, tienes que copiar los datos al buffer y devolver el numero de bytes, tal como si llegasen desde el socket (esto no lo sabe el cliente).

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

perdona, el que no esta entendiendo eres tu.

Citar
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).

eso no es ni por asomo como te digo, si fuese como te digo eso volveria al cliente aun sin que llegasen datos y es eso lo que tienes que controlar tu.

Citar
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.

No hay que ejecutar nada, lee la definicion de la funcion otra vez.

Citar
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.

hijo mio, es precisamente lo que te estoy explicando. para que lo entiendas, pilla el codigo de la msdn y compilalo tal cual y observa que espera hasta que el servidor responde. ahora bien aplicale lo que te digo y veras que no espera y que deja la espera retornando WSAETIMEDOUT una vez obtienes el timeout si quieres puedes hacer creer al cliente que le a llegado informacion..... y repito copias los datos al buffer y le devuelves el numero de bytes copiados.

Cuando hay timeout quiere decir que el servidor no envio nada, por eso logicamente no pierdes datos. siendo esto asi, tu eres el encargado de decirle al cliente cuando se a cerrado la conexion. para mas datos http://msdn.microsoft.com/en-us/library/ms740668%28v=VS.85%29.aspx


Despues te queda otra que es hacer que el cliente pase por tu aplicacion para conectarse (a modo proxy local) de esta forma tienes mas facil enviarle cuando quieras datos al cliente ya que para el tu eres el servidor.



Título: Re: EXE reciba algo de DLL y se piense que lo ha enviado el servidor
Publicado por: SnakeDrak en 22 Mayo 2010, 17:10 pm
Hola ctlon,

Vale ahora sí creo que te he entendido, con esta línea:

Cita de: ctlon
hijo mio, es precisamente lo que te estoy explicando. para que lo entiendas, pilla el codigo de la msdn y compilalo tal cual y observa que espera hasta que el servidor responde. ahora bien aplicale lo que te digo y veras que no espera y que deja la espera retornando WSAETIMEDOUT una vez obtienes el timeout si quieres puedes hacer creer al cliente que le a llegado informacion..... y repito copias los datos al buffer y le devuelves el numero de bytes copiados.

Pensaba que siempre esperaba, fallo mío, es decir mi fallo era la función que te dije que no conocía y es la que debía aplicar. Pues muchas gracias =D ahora si que me cuadra todo, luego probaré y te comentaré aunque imagino que si funcionará si no espera como yo pensaba (no sabía eso del WSAETIMEDOUT).

Tu idea del Proxy también me ha parecido bastante interesante xD, si en un futuro necesito hacer muchas más operaciones utilizaré al dll como proxy.

Saludos y gracias!