jueves, 12 de septiembre de 2013

Cómo depurar juegos de NDS con IDA Pro

Con esta entrada me gustaría comenzar una serie dedicada a la depuración de juegos para Nintendo DS. Mi objetivo es mostrar y explicar algunos de los análisis en ensamblador que hago para encontrar o modificar código de un juego. En esta primera entrada, explicaré cómo iniciar un entorno de depuración usando el desensamblador y depurador IDA Pro junto con el emulador DeSmuME.

Captura 1: Entorno de depuración completo


Requisitos


Necesitaremos tres cosas: IDA Pro, la versión dev de DeSmuME y un juego de Nintendo DS.

IDA Pro. Este programa, considerado como uno de los mejores (si no el mejor) de los existentes a día de hoy, soporta múltiples plataformas y entre ellas ARM. En contra, es un programa privativo con una licencia muy cara (la básica cuesta 450€) y que aunque cuenta con una versión freeware, ésta no trae soporte para ARM luego no nos sirve... Recomiendo usar una versión 6.x que será compatible con el loader.
La única configuración que hay que realizar una vez instalado es descargar este pequeño archivo y copiarlo en la carpeta loaders del programa. Ese archivo servirá para que automáticamente detecte las ROMs como juegos de NDS y cargue el ARM9 en las posiciones de memoria correctas. Funciona sin problemas con Wine.

DeSmuME. Desde mi punto de vista el emulador más completo y con mayor compatibilidad que existe por el momento. Su mayor ventaja es que su código está bajo licencia GPL y por tanto lo podemos analizar, modificar (muy útil para poner algunos printf de más) y compilar para cualquier plataforma. Para depurar juegos necesitamos tener una versión especial que traiga el depurador GDB.
Para Windows y Mac OS X esta versión especial está incluida en el zip que se puede descargar desde su web, en concreto el ejecutable con sufijo “_dev” es el que buscamos.

En el caso de GNU/Linux, habrá que compilar su código como sigue:
1. Descargar código desde aquí o desde el SVN.
2. tar -xzvf
3. cd desmume-0.9.9
4. ./configure --enable-gdb-stub
5. make
6. sudo make install
Con esto, ya deberíamos de tener instalado la versión con GDB de DeSmuME.


Enlazar programas


Enlazar estos dos programas es sencillo, aunque la primera vez parezca largo y lioso. En primer lugar ejecutamos DeSmuME desde una consola o terminal de esta manera:
desmume --arm9gdb=Puerto RutaDelJuegoNds
El parámetro arm9gdb le indica que queremos depurar el código que se encuentra en el ARM9 con GDB usando el puerto indicado, por ejemplo 23946. De esta forma se podrá manejar el depurador implementado en el emulador de manera remota conectándose a ese puerto del ordenador. Una vez hecho esto, el juego no se iniciará, estará esperando a que le enviemos un comando GDB para continuar.

Recordemos que todo el código de cualquier juego lo ejecuta siempre el ARM9, estando el otro dedicado a tareas de reproducir sonido, capturar la pantalla táctil, botones X e Y y algunas operaciones básicas. De hecho, Nintendo no permite el uso directo del ARM7 a los desarrolladores de juegos oficiales (en homebrews obviamente es otra cosa).

A continuación iniciamos IDA Pro. En la ventana que se abre hacemos clic en New ya que es la primera vez que depuramos el juego. Se abrirá un explorador para seleccionar el archivo a desensamblar, abrimos por tanto el mismo que le especificamos a DeSmuME. A continuación, se deberá de abrir otra ventana en la que nos pide que seleccionemos el tipo de ejecutable que queremos abrir. Si hemos puesto el loader correctamente debe de estar seleccionado “Nintendo DS ROM [nds.ldw]” así que simplemente hacemos clic en Ok. Comenzará a ejecutarse el script y aparecerá un diálogo que nos preguntará si queremos cargar el ARM9 o el ARM7, hacemos clic en “Yes” para especificar ARM9.

Captura 2: Detectará que es una ROM de NDS

Si todo ha ido bien, IDA comenzará a hacer un autoanálisis de código. Si el AMR9 está encriptado como suele pasar, no podremos ver todavía la mayoría del código (sólo el inicial que desencripta el resto) y el autoanálisis durará poco. En cualquier caso esperamos a que termine éste para continuar. Sabréis que ha terminado porque en la ventana de salida (Output window) aparecerá: “The initial autoanalysis has been finished.”.

Ahora enlazaremos IDA Pro con GDB de DeSmuME. Para ello en IDA Pro nos vamos al menú Debugger->Process options... y en el diálogo nuevo escribiremos en “Hostname: localhost” y en “Port: 23946” es decir, el puerto especificado al ejecutar DeSmuME. Le damos a Ok y ya estará todo listo.


Nos aseguramos que esté marcado “Remote GDB Debugger” en la barra superior y haciendo clic en la flecha verde de la barra superior o en Debugger->Start process o pulsando F9, tendremos un entorno final de depuración como se muestra (aunque primero deberemos obviar una ventana de advertencia y darle a que sí queremos enlazar IDA Pro).



Con F9 ejecutaremos el juego, con F7 saltaremos a la siguiente línea de código y con F8 lo mismo pero sin entrar en llamadas de funciones. ¡Al igual que en cualquier IDE de programación! Realmente es sencillo de usar y permite grandes funciones como comentar cualquier línea de código (con la tecla ':' o pulsando al final de una línea de código con el botón derecho del ratón y luego Enter comment), renombrar funciones (con 'N' o con el botón derecho sobre el nombre de cualquier función), crear funciones (si es que IDA no la ha detectado bien) e introducir puntos de ruptura ya sean de “hardware”, es decir de lectura o escritura en la RAM, o de ejecución, es decir en una línea de código; entre muchas cosas más.

Para mi gusto la mejor vista de ventanas para IDA es la que he puesto en la captura inicial. Para obtenerla deberemos abrir una ventana de Puntos de interrupción (botón al lado del cuadrado azul para parar), algunos Visores Hexadecimales (View->Open subviews->Hex dump), y un visor de código desensamblado (View->Open subviews->Dissambly). Para abrir una ventana en un sitio concreto, primero deberemos de tener el foco en ese sitio haciendo clic con el ratón y luego le daremos al botón de abrir dicha ventana.

Para terminar, decir que la próxima vez que queráis depurar ese mismo juego, no le deis a New en la ventanita inicial, si no abrid la base de datos .idb que IDA Pro creará cuando salgáis. Además, la configuración de Debugger->Process options sólo hay que hacerla una vez.

Espero que haya sido útil y para la próxima espero encontrar un programa alternativo a IDA Pro que sea software libre (lo estoy intentando con Insight).

Screencast / Video tutorial de la entrada:

No hay comentarios:

Publicar un comentario