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

lunes, 19 de agosto de 2013

Logo de Nintendo en GBA y NDS

No hace mucho, @Nitehack me preguntó si sabía cómo podría extraer una imagen a partir de unos datos. No era la primera vez que me enfrentaba a este reto en concreto y ahora, con más experiencia adquirida quería volver a intentarlo.

¿Objetivo?


Todos los juegos para GameBoy Advance (GBA) y Nintendo DS tienen unos datos al principio del archivo (header) que los usa la consola para la inicialización del juego como el nombre, el código del desarrollador, las posiciones de memoria donde va el código, el punto de inicio del sistema de archivos... Sorprende ver entre estos datos un conjunto de bytes sin significado en ese contexto pero que, mirando en GBATEK parece ser el "Logo de Nintendo". Teóricamente, a partir de esos bytes se podría recrear esa imagen y es más, así lo hacen las consolas. En en juego para GBA estos datos se encuentran a partir de la posición 0x04 mientras que en uno de la DS en 0xC0, en ambos dispositivos este logo debe ocupar 0x9C bytes.

Logo de Nintendo en GBA.
En el archivo solo aparece el de Nintendo, no el de GAME BOY.

Lo primero que intento es comprobar si puedo ver ya directamente el logo. Para ello creo un archivo con los bytes 00 00 FF 7F que al abrir como paleta serán los colores negro y blanco respectivamente codificados en BGR555. A continuación usando Tinke abro los dos archivos, la paleta seleccionándola y pulsando 'P' y luego los datos del logo, igual y pulsando 'T'. El resultado final es este:

Datos en bruto, nada visible
La imagen está configurada como 1bpp y tiled (horizontal). Como se puede apreciar tendremos que hacer operaciones con esos bytes para obtener la imagen original y ese será el objetivo de la entrada, conseguir obtener la imagen y analizar todo lo relacionado con ella. El porqué de hacer esto no tiene respuesta, cuando a uno le gusta la ingeniería inversa y se le propone un reto no se pregunta para qué quiere el resultado, solo quiere disfrutar investigando ;).