Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: .:UND3R:. en 8 Febrero 2012, 21:24 pm



Título: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 8 Febrero 2012, 21:24 pm
Hola a todos, bueno poseo una aplicación en la cual hookeo una DLL más o menos de la siguiente manera (seudocodigo):

Push midll.dll
call LoadLibraryA
or eax,eax
je cerrar
jmp entry point
cerrar:
push 0ff
call ExitProcess

Carga muy bien, pero el problema que me surge es de que manera, que API podría llamar o que función podría realizar para que una vez ejecutada la aplicación verifique si está cargada.

La dll es para la detección de cheat's para un juego por lo que si una persona con pequeños conocimientos podría simplemente nopear desde push midll.dll hasta je cerrar y no cargaría la DLL (el proceso funcionaría correctamente, pero sin un "sistema de seguridad").

Mi idea es hacer un injerto que verifique si está cargada en memoria, pero ese es mi duda como y con qué API usarla?

INFO adicional: La DLL se conecta a un servidor para corroborar su integridad a través de CRC por lo que no me preocupa que alguien agregue una DLL con el nombre de midll.dll ya que sería detectada. Por lo que en palabras simples solo me gustaría saber de que manera el proceso puede verificar si la dll está cargada.

el seudocódigo sería así
injertar una función en donde el proceso pase seguidamente.
verificar si hay si la DLL está cargada y retomar normalmente.

Espero su ayuda.

Efectivamente eso es más ASM pero creo que se puede integrar a Ing inversa al ser un tema que involucra la seguridad

(si alguien se ha topado con un programa que haga algo parecido)

PD: Solución simple no compleja jeje


Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 8 Febrero 2012, 21:36 pm
Probaré con GetModuleBaseNameA o GetModuleFileNameA

Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: x64core en 9 Febrero 2012, 03:05 am
Que yo sepa con la api Getmodulehandle podes comprobar si un modulo esta cargado
mas que todo te devuelve el handle...
Y eso de hookear una dll? no seria hookeas una funcion/procedimiento de una dll?


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 9 Febrero 2012, 09:41 am
Que yo sepa con la api Getmodulehandle podes comprobar si un modulo esta cargado
mas que todo te devuelve el handle...
Y eso de hookear una dll? no seria hookeas una funcion/procedimiento de una dll?

También es un buen método, en fin se me ocurrió para no complicarme demasiado cifrar las instrucciones comentadas con un simple xor, luego de eso lo empaqueté (además de eso realice un injerto que verifica el tamaño de la aplicación y si es mayor al tamaño de la aplicación comprimida es por que lo más probable es que lo hayan desempaquetado, al detectar eso cierra el proceso, La protección no es difícil de romper, pero de alguna u otra forma imposibilita a la media de usuarios. ya que entre nopear y revertir un XOR para alguien que no conoce de OllyDbg sería unas buenas horas (Demorándose uno no más de 5 minutos)

Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Иōҳ en 9 Febrero 2012, 16:18 pm
Podes implementarle algún algoritmo de verificación de integridad, pero no uno si no varios y hacerlo en diferentes lugares y diferentes tiempos.

Eso si que es tedioso, y de cuando en cuando provoca alguna excepción para ir borrando los HBPs si es que hubiera, si no puedes usar la api que te devuelve la structure contex y hacer lo mismo.

pd: Creo que deberías tomar lo que te dice RHL, no había dado cuenta que lo mencionó XD, si está cargado te debe devolver el handle, si no está cargado pues error, y también puedes usar la api GetLastError.

Ahora porque no quieren que cargue esa dll?, que NO es fundamental para el desenvolvimiento correcto del game? XD


Nox,


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 9 Febrero 2012, 18:22 pm
Esa DLL se usa como anticheat, es buena me detecta incluso a OllyDBG y muchos cheat que he usado para el juego, el problema es que con simples NOP se puede quitar y fin sistema de seguridad xD, por eso la idea era implementar "un poco mas de seguirdad". Cuando tenga todo listo lo subiré para ver quien se anima a nopear la .dll, en si creo que es muy fácil para el nivel que hay acá, pero si lo ves para jugadores que buscan en google cheat juego x o alguien que leyó las instrucciones para instalar el anticheat y las realiza al reves (NOPEA), Se llevará una gran sorpresa partiendo como un molebox ( a mi criterio fácil), luego con inline patch a través de cifrado xor y entre medio una comprobación de tamaño.


Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: MCKSys Argentina en 9 Febrero 2012, 20:36 pm
Fijate esto: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx)

Este es el campo interesante: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx)

De ese array (InMemoryOrderModuleList) sale el listado de modulos cargados (el mismo que usa Olly)

Ni te digo si te pones a jugar con eso...  ;)

Saludos!


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: TruenoCaos en 9 Febrero 2012, 21:56 pm
como ya sabeis de esto no se mucho, pero lo normal para comprobar que algo existe es volver intentar abrirlo.

una pregunta si no se carga el dll, y se intenta usar una funcion de esa dll, no saltaria un error?

Un saludo


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Иōҳ en 9 Febrero 2012, 22:15 pm
Fijate esto: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx)

Este es el campo interesante: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx)

De ese array (InMemoryOrderModuleList) sale el listado de modulos cargados (el mismo que usa Olly)

Ni te digo si te pones a jugar con eso...  ;)

Saludos!

 ;-)

verdad, muy buen dato y recordatorio ya se me había pasado el peb ni por aca  :silbar:


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 10 Febrero 2012, 03:00 am
Fijate esto: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx)

Este es el campo interesante: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx)

De ese array (InMemoryOrderModuleList) sale el listado de modulos cargados (el mismo que usa Olly)

Ni te digo si te pones a jugar con eso...  ;)

Saludos!

:O Excelente muy buena Info, Muchas gracias :D

como ya sabeis de esto no se mucho, pero lo normal para comprobar que algo existe es volver intentar abrirlo.

una pregunta si no se carga el dll, y se intenta usar una funcion de esa dll, no saltaria un error?

Un saludo

Efectivamente por eso se suele comprobar si una vez que se intenta cargar (LoadLibrary) retorna algún handle, en caso que no devuelva se dirige a un procedimiento encargado de mostrar algún tipo de mensaje, el problema radica que la DLL cargada en mi ejecutable es anexa al programa, por lo que si no está no influye en nada por eso debía integrar una que otra API o método para hacer que la dll y la aplicación se amen  y se hagan dispensables uno para el otro ;D

Saludos y muchas gracias a todos por comentar, opinar y ayudar :D


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Hendrix en 10 Febrero 2012, 11:55 am
Fijate esto: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706(v=vs.85).aspx)

Este es el campo interesante: http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx)

De ese array (InMemoryOrderModuleList) sale el listado de modulos cargados (el mismo que usa Olly)

Ni te digo si te pones a jugar con eso...  ;)

Saludos!

Este método es utilizado por algunos Rootkits. Al eliminar el modulo de la lista de módulos, la librería no se puede descargar de memoria. Te lo digo por si te interesa darle más protección :)

Te comento que la opción del CRC comprobado en modo servidór no es la mejor opción. Alguien que te quiera modificar la libreria, sencillamente tiene que sniffar el tráfico de tu libreria, copiarse el CRCR (aunque sea cifrado), modificar tu libreria, poner un hook a tu función de envio de datos y enviar siempre ese CRC.

Las tareas de ofuscación de código son realmente tediosas, pero sería una buena opción. Ofuscar lo más que puedas el código y al detectar modificaciones, sencillamente crashear el proceso y/o juego. Como te han dicho, pon varias funciones de comprobación de código, lo más enrevesadas posible. Por ejemplo, si lo programas en C puedes agregarle basura en ensamblador...

Y como has comentado antes, espero que lo subas para que podamos trastear un poco :D es un tema realmente interesante :D

Saludetes!!


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Pinkof en 22 Febrero 2012, 18:05 pm
bueno ya que esta el tema me uno para preguntar algo ya que supongo que estamos hablando del mismo juego..

el juego tiene dentro un serial el cual verifica el servidor si es correcto para entrar.
se podria modificar el servidor y cliente para que envien un serial falso a la hora de pasar por un sniffer pero cuando llegue al servidor diga q es verdadero
pero que solo funcione con ese cliente? o injertos se podria hacer para mentir a los sniffer y alos que abren el cliente con un editor hexadecimal que muestre un serial para la vista huamana pero que sea otro para el trafico de datos..

espero que me hayan entendido salu2

PD: ejemplo.
Serial Cliente : 123456789
Serial en el servidor 987654321 >> transforma 123456789 a 987654321

quizas me este faltando algo que no puedo darme cuenta


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 22 Febrero 2012, 22:20 pm
bueno ya que esta el tema me uno para preguntar algo ya que supongo que estamos hablando del mismo juego..

el juego tiene dentro un serial el cual verifica el servidor si es correcto para entrar.
se podria modificar el servidor y cliente para que envien un serial falso a la hora de pasar por un sniffer pero cuando llegue al servidor diga q es verdadero
pero que solo funcione con ese cliente? o injertos se podria hacer para mentir a los sniffer y alos que abren el cliente con un editor hexadecimal que muestre un serial para la vista huamana pero que sea otro para el trafico de datos..

espero que me hayan entendido salu2

PD: ejemplo.
Serial Cliente : 123456789
Serial en el servidor 987654321 >> transforma 123456789 a 987654321

quizas me este faltando algo que no puedo darme cuenta

Si mal no me equivoco el cliente envía el serial en texto plano, en este caso si se utiliza un sniffer sería muy fácil detectarlo, una manera para ocultarlo de manera visual sería que el serial no contenga palabras, sino alguna secuencia de códigos hexadecimales, esto lo hace más difícil visualmente. Claro que si el atacante sabe más o menos como trabaja el cliente no nos serviría mucho.

En cuanto a mi caso, aparte de empaquetar el ejectuable realicé un injerto dentro de una función del juego que se encarga de descifrar el serial. Es decir que si en mi caso si alguien lograra desempaquetarlo (muy fácil a mi criterio el packer que utilicé, se asimila a UPX) si utilizara main cracker (para los que no saben es una aplicación encargada de mostrar el offset en donde se almacena el serial, versión, IP), no verían el serial correcto ya que en el Entry Point el serial sigue cifrado, Luego de esto en mi cliente calcula el tamaño de la aplicación, si este excede el peso del .exe empaquetado (por lo general su peso es menor), el cliente se cierra.

Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: x64core en 22 Febrero 2012, 23:12 pm
UND3R esperamos la dll o el project para jugar  :rolleyes:


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: MCKSys Argentina en 23 Febrero 2012, 00:05 am
Luego de esto en mi cliente calcula el tamaño de la aplicación, si este excede el peso del .exe empaquetado (por lo general su peso es menor), el cliente se cierra.

Podrias pasar el EXE a ver si es "anti-crackers"...  ;D


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 23 Febrero 2012, 01:04 am
por el momento les dejo la web de los programadores de la dll por si quieren observarla.

http://www.tdagameguard.com.ar/ (http://www.tdagameguard.com.ar/)

Saludos


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Иōҳ en 23 Febrero 2012, 15:24 pm
Estás ayudando con el anticheat?

Podemos chitiar un rato con el game y "malograr las partidas" coff coff.... y... así ayudarte?  :xD

PD: No me di cuenta XD, es un sistema anticheat jee.. pensé que era un game con el sistema anticheat u.u

Nox.


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: .:UND3R:. en 23 Febrero 2012, 21:54 pm
Estás ayudando con el anticheat?

Podemos chitiar un rato con el game y "malograr las partidas" coff coff.... y... así ayudarte?  :xD

PD: No me di cuenta XD, es un sistema anticheat jee.. pensé que era un game con el sistema anticheat u.u

Nox.

El sistema anticheat lo incluí en el servidor de juegos que estoy trabajando jeje :B


Título: Re: Verificar si una dll está cargada en un ejectuable?
Publicado por: Иōҳ en 24 Febrero 2012, 21:09 pm


A entonces me cito

Podemos chitiar un rato con el game y "malograr las partidas" coff coff.... y... así ayudarte?  :xD



x;D

Nox