Autor
|
Tema: Inyeccion de DLL para obtener acceder a parametros de una funcion (Leído 3,175 veces)
|
GonzaFz
|
Ya hace mucho que vengo jodiendo con querer hacer un server emulator de un juego online (no existe ningun emulador). Cada vez que empiezo lo dejo al tiempo, aunque siempre avanzo un poquitito mas. Hoy se repite la historia...
Cuando arranque (a comienzo de año) me habia dado cuenta que los paquetes estan cifrados, y con el OllyDBG pude encontrar el algoritmo de encriptacion (muy simple).
Cuando me conecto al servidor, el mismo envia una clave de 16 bytes que todavia no se como se genera pero no importa. Cada vez que el cliente tiene que enviar un mensaje, realizar una operacion XOR entre una DWORD del mensaje y una DWORD de la clave, la DWORD de la clave se elige mediante un algoritmo tonto que ahora no lo recuerdo. Luego de cifrar el mensaje se suma a cada DWORD de la clave la longitud del mensaje cifrado. (En realidad no es la totalidad de la longitud, si el mensaje tiene una longitud de 0x38, entonces suma 0x30, no se como llamarlo)
Y se repite todo por cada mensaje enviado. Entonces lo siguiente que debia hacer era desencriptarlos e interpretarlos.
En ese momento se me habia ocurrido (debido a mis pocas capacidades pensativas) hacer un programa en el cual al ingresar la clave, el numero del mensaje (ej, mensaje 5) y el mensaje, este me devuelva el mismo descifrado. Me dispuse a hacerlo pero me frustro perder tanto tiempo teniendo que convertir datos para poder tratarlos, para poder ponerlos en los componentes de la GUI, etc, asi que deje todo a la *****.
Hoy retomando me di cuenta que lo mejor que podria hacer es interceptar la funcion que lo cifra (o descifra) y guardar el mensaje en un log antes de encriptarlo, asi puedo tomar muchisimas muestras y analizarlas facilmente.
Estuve leyendo sobre la inyeccion de DLLs pero hay cosas que no me quedan muy en claro. La funcion a la que quiero acceder (basicamente para extenderla) no son del sistema, son del juego sobre el cual estoy trabajando. Leyendo un par de cosas en google se me ocurrio que lo ideal seria obtener la direccion de memoria donde esta la funcion (creo que es fija) y luego sustituir alguna instruccion con un jump a la DLL que yo inserto. Ya dentro de mi funcion tendria que acceder a los parametros (un buffer y la longitud del buffer) de la funcion la cual intercepte y es eso lo que no se como tengo que hacer. Segun tengo entendido los parametros, en assembler, se pasan por el Stack y luego son recuperados por la funcion que se ejecuta, entonces yo deberia saltar a mi funcion en la primera instruccion, sacar todos los parametros, procesarlos y despues volver a volcarlos en el Stack, eso es correcto?
Y algo relacionado pero a parte, mi idea es ir capturando ese buffer cada vez que se va a mandar un mensaje e ir guardandolo en un log (xml). Como tendria que hacerlo? Porque si lo hago en mi funcion cada vez que llegue tendria que abrir el log, escribir el buffer y algunos datos mas, y despues cerrar el archivo, creo que no seria lo optimo teniendo en cuenta que haria esto todo el tiempo que se envian paquetes.
Saludos.
|
|
|
En línea
|
|
|
|
crack81
Desconectado
Mensajes: 222
|
Si no sabes el nombre y parametros de las funciones de la dll sera muy complicado hacer lo que estas pensando me imagino que es una dll hecha en c++
Hay programas que permiten obtener el nombre de la funcion pero no asi sus parametros asi lo que te queda es revisar si hay documentacicon oficial sobre las funciones de la dll.
Saludos....
|
|
|
En línea
|
Si C/C++ es el padre de los lenguajes entonces ASM es dios.
|
|
|
MCKSys Argentina
|
Estuve leyendo sobre la inyeccion de DLLs pero hay cosas que no me quedan muy en claro. La funcion a la que quiero acceder (basicamente para extenderla) no son del sistema, son del juego sobre el cual estoy trabajando. Leyendo un par de cosas en google se me ocurrio que lo ideal seria obtener la direccion de memoria donde esta la funcion (creo que es fija) y luego sustituir alguna instruccion con un jump a la DLL que yo inserto. Ya dentro de mi funcion tendria que acceder a los parametros (un buffer y la longitud del buffer) de la funcion la cual intercepte y es eso lo que no se como tengo que hacer. Segun tengo entendido los parametros, en assembler, se pasan por el Stack y luego son recuperados por la funcion que se ejecuta, entonces yo deberia saltar a mi funcion en la primera instruccion, sacar todos los parametros, procesarlos y despues volver a volcarlos en el Stack, eso es correcto?
Si los parámetros son pasados por stack o registros, no son problemas. Unas vez que coloques el hook al inicio de la función y saltes a tu código, sólo deberás preocuparte por dejar todo como estaba al salir de la misma. Por supuesto, ya deberías saber cuántos son los parámetros y qué son cada uno (valores o punteros). Y algo relacionado pero a parte, mi idea es ir capturando ese buffer cada vez que se va a mandar un mensaje e ir guardandolo en un log (xml). Como tendria que hacerlo? Porque si lo hago en mi funcion cada vez que llegue tendria que abrir el log, escribir el buffer y algunos datos mas, y despues cerrar el archivo, creo que no seria lo optimo teniendo en cuenta que haria esto todo el tiempo que se envian paquetes.
Si quieres loguear todo, entonces deberás guadar el buffer en algún lado (memoria o disco). Sinó, deberás filtrar la data de acuerdo a lo que quieras loguear. Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
GonzaFz
|
Si no sabes el nombre y parametros de las funciones de la dll sera muy complicado hacer lo que estas pensando me imagino que es una dll hecha en c++
Hay programas que permiten obtener el nombre de la funcion pero no asi sus parametros asi lo que te queda es revisar si hay documentacicon oficial sobre las funciones de la dll.
Saludos....
La DLL la voy a hacer yo, lo que quiero es inyectarla a un juego en una funcion de dicho juego, conozco los parametros porque la abri con OllyDBG. Si quieres loguear todo, entonces deberás guadar el buffer en algún lado (memoria o disco). Sinó, deberás filtrar la data de acuerdo a lo que quieras loguear.
No pense eso de guardarlo en la RAM. Como voy a capturar todos los mensajes que se encripten pense que seria mucho aunque no lo es (muchos tienen menos de 50 bytes de largo). Estaba pensando la posibilidad de hacer un archivo xml e ir añadiendo un nodo cada vez que se cifra un mensaje, el tema es que cada vez voy a tener que abrir el archivo xml, escribir y cerrarlo, no se si es optimo.
|
|
|
En línea
|
|
|
|
Holamundo001
Desconectado
Mensajes: 5
|
En mi caso tengo yo tengo hook las funciones send y recv de un juego online y los datos están cifrados, si me ayudarías a encontrarlo podría ayudarte con la dll. espero tu respuesta. Saludos comunidad elhacker.
|
|
|
En línea
|
|
|
|
Miseryk
Desconectado
Mensajes: 225
SI.NU.SA U.GU.DE (2NE1 - D-Unit)
|
Ya hace mucho que vengo jodiendo con querer hacer un server emulator de un juego online (no existe ningun emulador). Cada vez que empiezo lo dejo al tiempo, aunque siempre avanzo un poquitito mas. Hoy se repite la historia...
Cuando arranque (a comienzo de año) me habia dado cuenta que los paquetes estan cifrados, y con el OllyDBG pude encontrar el algoritmo de encriptacion (muy simple).
Cuando me conecto al servidor, el mismo envia una clave de 16 bytes que todavia no se como se genera pero no importa. Cada vez que el cliente tiene que enviar un mensaje, realizar una operacion XOR entre una DWORD del mensaje y una DWORD de la clave, la DWORD de la clave se elige mediante un algoritmo tonto que ahora no lo recuerdo. Luego de cifrar el mensaje se suma a cada DWORD de la clave la longitud del mensaje cifrado. (En realidad no es la totalidad de la longitud, si el mensaje tiene una longitud de 0x38, entonces suma 0x30, no se como llamarlo)
Y se repite todo por cada mensaje enviado. Entonces lo siguiente que debia hacer era desencriptarlos e interpretarlos.
En ese momento se me habia ocurrido (debido a mis pocas capacidades pensativas) hacer un programa en el cual al ingresar la clave, el numero del mensaje (ej, mensaje 5) y el mensaje, este me devuelva el mismo descifrado. Me dispuse a hacerlo pero me frustro perder tanto tiempo teniendo que convertir datos para poder tratarlos, para poder ponerlos en los componentes de la GUI, etc, asi que deje todo a la *****.
Hoy retomando me di cuenta que lo mejor que podria hacer es interceptar la funcion que lo cifra (o descifra) y guardar el mensaje en un log antes de encriptarlo, asi puedo tomar muchisimas muestras y analizarlas facilmente.
Estuve leyendo sobre la inyeccion de DLLs pero hay cosas que no me quedan muy en claro. La funcion a la que quiero acceder (basicamente para extenderla) no son del sistema, son del juego sobre el cual estoy trabajando. Leyendo un par de cosas en google se me ocurrio que lo ideal seria obtener la direccion de memoria donde esta la funcion (creo que es fija) y luego sustituir alguna instruccion con un jump a la DLL que yo inserto. Ya dentro de mi funcion tendria que acceder a los parametros (un buffer y la longitud del buffer) de la funcion la cual intercepte y es eso lo que no se como tengo que hacer. Segun tengo entendido los parametros, en assembler, se pasan por el Stack y luego son recuperados por la funcion que se ejecuta, entonces yo deberia saltar a mi funcion en la primera instruccion, sacar todos los parametros, procesarlos y despues volver a volcarlos en el Stack, eso es correcto?
Y algo relacionado pero a parte, mi idea es ir capturando ese buffer cada vez que se va a mandar un mensaje e ir guardandolo en un log (xml). Como tendria que hacerlo? Porque si lo hago en mi funcion cada vez que llegue tendria que abrir el log, escribir el buffer y algunos datos mas, y despues cerrar el archivo, creo que no seria lo optimo teniendo en cuenta que haria esto todo el tiempo que se envian paquetes.
Saludos.
Si sabés donde empieza la función, fiajte en el ret, ahí te dice la cantidad de bytes de parámetros, sinó luego del ret vá a ir a parar debajo de un call, arriba están los pushes de la función.
|
|
|
En línea
|
Can you see it? The worst is over The monsters in my head are scared of love Fallen people listen up! It’s never too late to change our luck So, don’t let them steal your light Don’t let them break your stride There is light on the other side And you’ll see all the raindrops falling behind Make it out tonight it’s a revolution
CL!!!
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Inyección de Parametros Sqlmap
Bugs y Exploits
|
Owl-City
|
9
|
7,666
|
6 Febrero 2014, 08:15 am
por BlackM4ster
|
|
|
Pasar 2 parámetros en inyección de código
ASM
|
Vaagish
|
9
|
5,272
|
17 Julio 2014, 21:43 pm
por Eternal Idol
|
|
|
MOVIDO: Inyeccion de DLL para obtener acceder a parametros de una funcion
Hacking
|
.:UND3R:.
|
0
|
2,154
|
25 Octubre 2015, 18:12 pm
por .:UND3R:.
|
|
|
Inyeccion DLL para extender una funcion
Ingeniería Inversa
|
GonzaFz
|
3
|
2,883
|
28 Octubre 2015, 16:52 pm
por GonzaFz
|
|
|
Acceder al programa de facturas .mdb para cambiar una función
Ingeniería Inversa
|
Nucleorion
|
4
|
4,034
|
16 Diciembre 2019, 11:53 am
por Nucleorion
|
|