10 abril 2015

Resolviendo un Crackme con WinAPIOverride

En el mundo de la informática siempre se ha dicho eso de 'Existen muchas formas de llegar al mismo resultado' y lo cierto es que, en ocasiones, resulta muy divertido e interesante comparar aproximaciones de varias personas frente a un mismo problema / desafío.

El caso de los 'Crackmes' es paradigmático a la hora de ver posibles soluciones a un mismo final. 

Hoy voy a explicar como resolver un -muy- sencillo crackme haciendo hooking empleando la sensacional herramienta WinAPIOverride. El objetivo es resolver el crackme de una forma poco convencional alterando la función lstrcmpi() que, como se puede ver en MSDN, se dedica a comparar dos strings y decir si son iguales o no.

El crackme en cuestión tiene esta pinta:





Y como es fácil intuir, se trata de meter un serial que, en algún punto del programa, se compara con el bueno y en base a eso obtenemos un OK o




Si observamos con Olly donde está la parte interesante:


Podemos ver que se van a comparar dos cadenas y, si son iguales, saltamos a la parte de 'Congrats' y si no lo son, nos vamos a 'Sorry'. 

En este punto la forma más fácil de resolver el crackme es 'tocar' Z para forzar el salto si-o-si pero vamos a salirnos de la forma convencional y a resolverlo de otra forma.

Usando WinAPIOverride vamos a crear una DLL que contenga una función que siempre haga return 0, haremos esto para sobre-escribir lstrcmpi() ya que, esta función devuelve 0 si ... 'If the strings are equal, the return value is zero' con lo que, si nuestra función siempre devuelve 0, el objetivo es que cada vez que sea llamada lstrcmpi(), se ejecute nuestra función y por lo tanto la comparación sea siempre positiva. 

De esta forma, cuando el Crackme use la función, se devolverá un 0 y siempre caerá en la parte 'Congrats'

WinAPIOverride viene con un SDK que nos permite construir DLLs para hooking de una forma muy sencilla, ya que hay varios ejemplos re-utilizables.

En nuestro caso, crear la función 'mágica' ha sido tan fácil como coger uno de los ejemplos y a partir de ahí, crear la nueva función


Una vez compilada nuestra DLL, simplemente tenemos que pedir a WinAPIOverride que se ocupe de cargar la DLL y hacer el hook


De esa forma, una vez WinAPIOverride ejecute el crackme, cualquier llamada a lstrcmpi siempre va a devolver 0. Lo probamos


¡¡ Perfecto !! ha funcionado y hemos conseguido 'engañar' al programa.

Y esto es solo la punta del iceberg de WinAPIOverride, la herramienta tiene bastantes más funcionalidades, como por ejemplo, la posibilidad de 'logear' funciones y sus parámetros al estilo API Monitor. Os animo a todos a descargarla y darle un vistazo !

6 comments :

random dijo...

¿Por dónde anda ese CrackMe? ¿Hay algún link para el que no sea necesario registrarse en ningún lado?

random dijo...

Pues sería estupendo recibirlo en random.inbox at gmail dot com.
Muchísimas gracias, un detalle por tu parte.

random dijo...

Perdón, corrijo: random.inbox.2015

Raul Piseaux dijo...

Gracias, varias herramientas que no conocia.

Chingón dijo...

Que pasaría si el programa utilizara esa misma función en otro lado? Es decir, si ya que entras al programa alguna de sus funciones, para hacer lo que el programa tenga que hacer, necesite comparar otras 2 cadenas. el programa ya no serviría de nada.

Yago Jesus dijo...

Efectivamente, el programa daría un error porque la función no es la correcta. Este ejemplo sirve para ese crackme y sobre todo para mostrar la herramienta