Curso de ingenieria inversa

#2797

Hoy aprenderemos como eliminar la siguiente pantalla del VPinMAME:

01.jpg

Bajamos el VPinMame, ejecutamos el setup.exe, allí escogemos 'Install', y tras ello ya podremos probar las roms con 'Test'. Al probar cualquier rom por primera vez nos saldrá la ventana anterior que queremos eliminar, y para ello debemos localizar el ejecutable que la crea.

Con un editor hexadecimal (yo utilizo Hex Workshop) abrimos el setup.exe y el vpinmame.dll (ya que son los dos únicos ejecutables que hay) y buscamos el texto que aparece en la ventana, por ejemplo 'Please answer'. Resulta que no lo encontramos, por lo que suponemos que alguno (o ambos) de los ejecutables está empacado (una compresión y/o encriptación que nos impide ver el código fuente tal cual).

Bajamos el PEiD, y con él probamos los dos archivos. Para el setup.exe nos indica 'Microsoft Visual C++ 7.0', que es el lenguaje en el que está programado, si lo reconoce es porque no está empacado. Pero con el vpinmame.dll nos muestra 'UPX 0.80 - 1.24 DLL -> Markus & Laszlo'. Vale tenemos suerte, es un compresor de ejecutables gratuito (el que suelo emplear yo como en el MoveRoms), así que sólo tenemos que bajarnos el upx y descomprimir la librería con el comando upx -d vpinmame.dll. Ahora el archivo ocupa 4 veces más y si lo volvemos a probar la búsqueda del texto en el editor hexadecimal, esta vez tendremos suerte, por lo que éste es el archivo que debemos 'retocar'.

Ahora usamos nuestro debugger favorito (en mi caso el OllyDbg) que si lo bajamos de la web de diablo2002, nos viene con unos pequeños retoques y con todos los plugins importantes. Como es una librería, lo mejor que podemos hacer es arrancar un programa que la use, así que desde el OllyDbg arrancamos el setup.exe (File -> Open y buscamos el setup.exe). Esto nos arranca el programa parándose en la primera instrucción del mismo. Como la dll a la que queremos atacar aún no está activa, dejamos actuar al programa normalmente presionando el botón que parece uno de play o F9

El programa arrancará normalmente y podréis acceder a él desde la barra de tareas, allí le dáis al botón 'Test' para que se cargue en memoria nuestra querida vpinmame.dll. Si el programa se queda colgado u os salta directamente al ollydbg es porque éste último no sabe como tratar alguna excepción. Lo podéis ver en la barra de estado del ollydbg. Apretáis SHIFT M F9 tantas veces como excepciones os encontréis hasta que se cargue la siguiente ventana del setup.exe. En ese momento ya debe estar cargado en memoria la librería, así que pulsáis con el ratón en el botón que tiene una 'E' en el ollydbg y que sirve para mostrar los distintos módulos ejecutables que usa el programa que estamos depurando y en la ventana que os aparece veréis que ya está cargado el vpinmame.dll.

02.jpg

Hacéis doble click sobre esa línea y veréis el código en ensamblador de esa librería en el ollydbg. Empezará en la línea 10001000 en mi caso (y en el de la mayoría). En ese momento sobre ese código pulsáis el botón derecho, y en el menú escogéis Analyze This!, para que el debugger intente estructurar un poco los distintos procedimientos (esto puede durar un rato).

03.jpg

Ahora es cuando viene lo más complicado, ¿cómo buscamos lo que queremos? hay diversas formas, y yo al principio intenté unos puntos de ruptura sobre las llamadas a la Api ShowWindow, pero al final sólo me sirvieron para orientar la búsqueda hasta que se me ocurrió otra forma de hacerlo. Otra vez click con el botón de derecho y esta vez Search for -> All constants, en la ventana que aparece escribís '111' en donde pone hexadecimal y aceptáis.

04.jpg

Y en la siguiente ventana marcáis cada línea que ponga 'CMP EAX, 111' y pulsáis F2 (o botón derecho y Toggle Breakpoint):

05.jpg

Bien, y ¿qué es lo que hemos hecho? Pues buscar la constante 111 que para Windows es el equivalente a pulsar un botón (saberse esto lo da la experiencia), y luego poner un punto de ruptura cada vez que compara un puntero del sistema con 111.

Cerramos esta ventana de referencias, y en el programa que tenemos abierto escogemos una mesa que tengamos y que nunca hayamos jugado, para que nos salga la dichosa ventana que queremos eliminar. Vemos que enseguida se queda parado, por lo que volvemos al ollydbg allí desmarcamos con F2 el breakpoint donde está parado y ponemos otro dos líneas más abajo (después del salto) ya que a esta línea sólo podremos acceder al pulsar el botón que sea y no cuando el programa haga la comparación. Pulsamos F9 para que el programa siga corriendo y vemos que se nos para en otro breakpoint de los que pusimos antes, lo que quiere decir que el anterior breakpoint que rectificamos no era el que buscábamos. En este volvemos a hacer los mismo, lo desmarcamos y creamos uno nuevo dos líneas debajo de dónde estaba. Volvemos a pulsar F9 y esta vez nos salta la ventanita que queremos eliminar, marcamos la casilla de 'Yes, I am' y pulsamos el botón de OK.

06.jpg

¡Bingo!, ollydbg salta en el último breakpoint que pusimos, por lo que sabemos que esa es la parte 'buena' del código. De hecho si pulsamos F8 varias veces, vamos viendo lo que el programa va haciendo línea por línea. Incluso que el parámetro bueno de salida que le vamos a pasar a EndDialog es 1 (si marcáis 'No, I'm not' le pasa un 2, y si no se marca ninguna le pasa un 0).

Ahora llega lo que nos gusta, un poco de lógica y programación. Tenemos este código:

07.jpg

Y si nos fijamos la línea dónde teníamos el breakpoint que luego cambiamos, dónde pone CMP EAX, 111 viene de un salto, pues podemos hacer que el salto que llega hasta ahí, llegué hasta un par de líneas más abajo, con lo que no hará falta que nosotros apretemos el botón de OK. Pero claro, además esta función tiene que devolver el valor 1, que es el de estar conforme. Así que justo antes de la llamada a la función 'forzamos' que el valor de ésta siempre sea 1. Para cambiar las instrucciones sólo tenemos que hacer doble click sobre la instrucción a editar y en la ventana que aparezca escribir la nueva:

08.jpg

Así debería quedar la librería parcheada. Cerramos el ollydbg y para que este cambio sea permanente abrimos otra vez el vpinmame.dll en nuestro editor hexadecimal y allí buscamos los bytes que tenemos que cambiar. Buscamos: '3D10010000753683C604' y lo cambiamos por '3D10010000753D83C604' que es el primer cambio. Y luego '1BC083C002508B4604' para cambiar por '1BC0B00190508B4604'. Guardamos y listo. Ya tenemos él vpinmame.dll parcheado.

PeterPunk

Publicidad