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 ;).


domingo, 30 de septiembre de 2012

Again, again and again!

Esto es como hacer una casa y abandonarla hasta que un día te da por echar un vistazo y, ¡anda! sí hasta te apetece comenzar a vivir allí. Bueno, algo así creo yo. Ya veremos cuánto dura.

Este blog lo hice cuando me entró la curiosidad por el romhacking, ya veréis: la primera (y única) entrada es del 22 de diciembre del 2010, el primer commit de Tinke fue el 23 de diciembre del 2010. Espera, ¿Tinke? Tinke es el programa que empecé a hacer por curiosidad cuando empecé a interesarme en este tema. La idea era de crear un programa que podría ir adaptando para las diferentes situaciones que me surgieran, ya fueran soportar imágenes, texto, audio...

Todo empezó cuando un día raro me pregunté
¿Cómo será un archivo .NDS por dentro? ¿Cuál será su estructura?
 Rápidamente fui a Google y comencé a buscar, llegué (como no) a GBATEK donde está toda la documentación pública sobre GBA y NDS que se ha podido obtener mediante ingeniería inversa. Concretamente, buscaba como era la cabecera de estos archivos, algo que encontré en DS Cartridge Header. Al principio me costó bastante asimilar toda esa información sobre todo porque no tenía conocimientos básico (como que era Little Endian). Pero poco a poco con paciencia conseguí ir viendo como funciona cada cosa, así que dije
¿Por qué no crear una aplicación que lea ésta información? De esa forma podré obtener las cosas que yo quiera sin depender de nadie.
Esa es la maldita pregunta que nunca debí de formular... Comencé, comencé y no pude parar. Justo al poco de comenzar creé este blog y publiqué la entrada anterior.

Lo que en un principio era mostrar información de la cabecera se convertió en un gestor del sistema de archivos de la DS donde se puede actualmente exportar / importar imágenes, audio, texto, tipografías, modelos 3D, archivos comprimidos y en general todo tipo de archivo por el que me entre curiosidad.

La última versión pública de Tinke data de Noviembre de 2011, pero queda poco para que la siguiente salga a la luz, mientras tanto y si tenéis curiosidad descargad la última versión alfa que dispongo: Tinke rev147.zip

¿Futuro del blog?


Iré publicando artículos donde explico las últimas cosas que voy descubriendo y lo más importante, el cómo lo hago. En un principio quería convertirlo en algo así como un manual del romhacking, pero después de leer varios sé que eso es muy difícil y creo que la única forma de aprender esto es intentándolo por uno mismo ya que cada juego es un mundo. No existen métodos generales que es lo que al final la gente suele ir buscando así que, desde mi punto de vista, lo mejor es explicar como consigo cada cosa y animaros a intentarlo por vosotros mismos y ver que no es muy complicado, sólo necesitas tiempo.

miércoles, 22 de diciembre de 2010

Hello World!

Hello Word!, no hay mejor inicio xD.

Buenas, me presento como pleoNeX y tras haber reflexionado sobre esto he decido que sí vale la pena continuar o eso espero notar en los comentarios. Todo este conocimiento no se puede perder, de otra forma mi trabajo sería en vano y con que a una persona le guste me sobra ;)

El objetivo de este blog o espacio de información es el estudio de la ingeniería inversa. Se puede definir como el campo que abarca el estudio de los componentes que forman un producto, un ejemplo es coger un videojuego, investigarlo y obtener imágenes, audio, vídeos, textos e incluso un poco de código de fuente. En el contexto de este blog serán archivos relacionados con videojuegos de consolas de Nintendo (NDS, GBA) y archivos estándar en Windows (BitMaP, WAVE...).

Profundizando en este aspecto, lo que recogeré será la estructuras de los archivos, sus peculiaridades, qué podemos sacar de ellos y cómo obtenerla. Para ello me basaré en editores hexadecimal (para Windows podéis usar HxD 100% gratuito) y en la programación que será en C# (muy parecida a C++).

A modo de introducción y para que veáis qué podremos llegar a logar, os dejo un programa que realicé hace un año y que abre archivos que contiene el juego para Nintendo DS "El profesor Layton y la villa misteriosa"; junto al programa vienen varios de esos archivos para que comprobéis cual es el resultado final. La imagen que acompaña el final de la primera entrada está sacada directamente del juego, con otro programa que actualmente estoy desarrollando y que pronto os presentaré.

¿Por qué hago y hacer todo esto? Sinceramente no lo sé, muchas personas lo hacen para traducir videojuegos y se puede aplicar para ello, otras para modificarlos y sacar sus propias versiones; pero yo lo hago porque me gusta, no necesito más motivos :)

Sprite 0.1 + archivos de prueba => Descargar
Imagen sacada directamente del Profesor Layton


NOTA: Mi propósito era informar de esto en una especie de web que tengo alojada usando uCoz, pero dado que es más difícil para los buscadores, mi comienzo será aquí aunque siempre podremos usar el foro que se encuentra allí: http://pleonet.dmon.com

NOTA2: Ahora que pienso de nuevo ponerlo en marcha he decidido que mejor olvidar esa página y concentrarse en este blog ;)