En anteriores posts sobre MAME hemos visto como buscar cadenas (strings) ASCII para posteriormente alterarlas. Vimos por ejemplo como cambiar el nombre de uno de los fantasmas de PACMAN.
El problema es que no vamos a encontrar en muchos juegos las cadenas en ASCII mostrado con un editor hex en su representación hexadecimal.
Juegos viejunos como space invaders requieren de algo más para sacar la posición en la que se encuentran las cadenas que queremos buscar.
A la forma de encontrar esas cadenas la he llamado AHDD (ASCII-HEX-DEC-DIFF) ya que es el proceso que hemos de realizar para conseguir encontrar la posición.
Lo que si sabemos es que las letras que busquemos estarán una tras otra normalmente.
Posiblemente viendo esas imágenes aún no entiendas la forma. Pero para eso estamos aquí, para intentar explicar el proceso.
ASCII STANDARD – EN INGLÉS
Si contamos los caracteres que se ven en esa imagen nos salen unos 95 (se ha e contar el espacio en blanco). Esos son los 95 caracteres ASCII-STANDARD imprimibles. Luego se les ha de sumar 32 no imprimibles y nos da un total de 127 caracteres en total.
Lo que quiero decir con esto es que no vamos a poder representar la Ñ por ejemplo.
DESCARGAR LA ROM DE SPACE INVADERS Y CARGARLA CON EL EMULADOR MAME
Parto de la base de que tienes instalado mame en tu sistema. En debian puedes instalarlo así:
# apt install mame
Vamos a trabajar en /tmp por lo que nos moveremos a ese directorio y bajaremos con wget la rom. Crearemos 2 directorios. Uno con la rom original y otro con la rom descomprimida para poder alterarla.
$ mkdir /tmp/space_invaders
$ mkdir /tmp/space_invaders/original
$ mkdir /tmp/space_invaders/alterada
$ cd /tmp/space_invaders/original
$ wget "https://56k.es/wp-content/uploads/2021/05/invaders.zip"
$ unzip invaders.zip -d /tmp/space_invaders/alterada/
Una vez tenemos la rom original y la rom descomprimida en el directorio /tmp/space_invaders/alterada vamos a cargar la original para ver la palabra CREDIT
$ mame invaders -rompath /tmp/space_invaders/original/
La palabra CREDIT es la que queremos sustituir. Y no es tan sencillo como con PACMAN en el que se podían encontrar en ASCII cada uno de los caracteres.
VISUALIZAR EN QUE ARCHIVOS SE ENCUENTRA EL JUEGO «maincpu»
$ mame invaders -rompath /tmp/space_invaders/original -listxml | grep "maincpu"
Para este posts nos interesa solamente conocer en que archivos hemos de buscar. El tema de size y offset es importante pero no para este posts. Lo he dejado señalado pero no es importante.
La palabra CREDIT estará en uno de esos archivos:
- invaders.h
- invaders.g
- invaders.f
- invaders.e
Da la casualidad de que son todos los que tiene la rom pero no siempre es así y por tanto -listxml nos sirve para limitar en que archivos mirar.
LA MANDANGA
El proceso que he llamado AHDD (ASCII-HEX-DEC-DIFF) consiste en primero saber que cadena queremos buscar. En nuestro caso CREDIT.
Eso estará representado en ASCII.
Convertimos de ASCII a HEXADECIMAL cada una de las letras de esa cadena de texto:
Ahora convertiremos de HEXADECIMAL a DECIMAL:
Una vez tenemos cada una de las letras en su representación decimal hemos de saber que lo que vamos a buscar no es en absoluto la palabra. Lo que vamos a buscar es la diferencia entre la siguiente letra y la actual.
No sabemos si en el juego la letra C la representan como 32 o 02 o como sea en HEX pero sabemos que toda la cadena irá seguida y sabemos la diferencia numérica decimal entre cada una de esas palabras.
El juego está programado para ir buscando unos valores que le indiquen lo que tiene que sumar para obtener la siguiente letra y la muestra. De esta forma nosotros más que cambiar un valor lo que hacemos es buscar en todos los archivos esa secuencia.
Esto se realiza obteniendo chunks consecutivos, convirtiendo a decimal y restando el siguiente con el anterior. De esa forma cuando se detecta que existe una diferencia de 15 se entra en un loop para comparar si la siguiente diferencia es de -13 y si es pues sigue comparando si es -1, si luego es 5 y finalmente 11.
Finalmente se tendría que conocer la posición de las palabras ya que se ha ido examinando todo el archivo o archivos.
POR SUERTE HE ENCONTRADO UN SCRIPT QUE HACE ESTO POR TI
Puedes programarte un script en bash para esto tirando de dd por ejemplo o puedes usar este en python (sacado de esta url):
$ cd ..
$ wget "https://56k.es/wp-content/uploads/2021/05/findString.zip"
$ unzip findString.zip
$ python findString.py "CREDIT" alterada/invaders.e
En la captura se ve que he buscado en todos los archivos pero solamente ha macheado en invaders.e . Ese archivo contiene lo que buscamos en la posición 0x7a9
Abrimos el editor «le» con el argumento -h (si no lo tenemos lo instalamos o usamos otro editor hexadecimal que nos de más rabia).
$ le -h alterada/invaders.e
Convertimos de hex a decimal para comprobar que estamos ante la cadena CREDIT
0x02 = 2
0x11 = 17
0x04 = 4
0x03 = 3
0x08 = 8
0x13 = 19
Y ahora hacemos los cálculos para que salga lo que se ve en esta imagen:
17-2 = 15
4-17 = -13
3-4 = -1
8-3 = 5
19-8 = 11
Estamos ante la cadena CREDIT. Todo cuadra y es hora de alterar el contenido pulsando insert y luego grabar con control + x y darle a save.
VAMOS A ESCRIBIR EN VEZ DE CREDIT FANTAS
02 en hexadecimal (0x02) es la letra C según el juego.
01 será en hexadecimal la letra B según el juego.
00 será en hexadecimal la letra A según el juego.
03 será en hexadecimal la letra D según el juego.
04 será en hexadecimal la letra E según el juego.
05 será en hexadecimal la letra F según el juego.
Ya tenemos la letra F de FANTAS = 05
Si la A es 0 podemos contar usando esa imagen de caracteres ASCII para no caer en contar la Ñ que no existirá.
FANTAS = 05 00 13 19 00 18
Guardamos cambios y comprimimos la rom con un nuevo nombre: invaders_hack.zip
$ cd alterada/
$ zip invaders_hack.zip *
$ mv invaders_hack.zip ..
$ cd ..
$ mv invaders_hack.zip invaders.zip
$ mame invaders -rompath /tmp/space_invaders/
Y tenemos un bonito FAIL:
Me he confundido en algo. No lo he convertido todo a HEXADECIMAL y ha dado la casualidad de que 05 y 00 se representan igual.
FANTAS = 05 00 13 19 00 18
Sería esto otro lo bueno:
FANTAS = 05 00 0D 13 00 12
Y eso es todo.
Puedes bajar la rom alterada desde aquí: invaders(1)
Saludos cordiales.