- Ecco the Dolphin: Defender of the Future para Dreamcast tenía cheats ocultos que se activaban ingresando iniciales en el archivo de guardado, y además del ya conocido
GYUGYU+XXX, se confirmaron varias entradas especiales - El análisis consistió en cargar snapshots de memoria de flycast en Ghidra para encontrar el búfer de entrada y la función de procesamiento, y seguir una estructura en la que el resultado de la transformación se compara con 6 valores especiales
- La detección de cheats no se hace sobre la cadena ingresada en sí, sino sobre un valor obtenido tras descifrar una clave con una passphrase y calcular un checksum, por lo que es difícil encontrarlos simplemente leyendo cadenas
- Mediante fuerza bruta con Python se probaron entradas de 1 a 8 caracteres y se confirmó que
SOCCER,EXBBERX,QQRIQ,XYZZYX,POPELY, entre otras, están conectadas con un nivel bonus, modo inmortal, visualización de FPS y visualización de la hora - Las entradas que producen el mismo efecto no están fijadas a una sola:
NNSET,SOCCERyADEMVSSFabren el juego bonus de fútbol, yAFTJSXOTdesbloquea todos los niveles igual queGYUGYU
Cheats ocultos activados con el nombre del archivo de guardado
- Ecco the Dolphin: Defender of the Future es el último juego de Ecco lanzado oficialmente, y su secuela fue cancelada
- El cheat conocido hasta ahora consistía en elegir New Game en la pantalla de la VMU, ingresar
GYUcomo iniciales y, sin presionar End, volver a ingresarGYUy tres letras arbitrarias- Tras ingresarlo en la forma
GYU GYU XXXy salir del menú, en Load game se pueden seleccionar todos los niveles
- Tras ingresarlo en la forma
- Las entradas especiales confirmadas y sus efectos son los siguientes
GYUGYU+XXX: desbloquea todos los nivelesSOCCER+XXX: desbloquea el nivel bonusEXBBERX+XXX: modo inmortalQQRIQ+XXX: muestra los FPSXYZZYX+XXX: muestra la horaPOPELY+XXX: efecto desconocido
Seguimiento de la rutina de procesamiento de entrada con Ghidra
- En un snapshot de memoria del emulador flycast, se confirmó que parte de las iniciales visibles en pantalla se guarda en el búfer
8cfffb34 - Al seguir ingresando caracteres, los caracteres ingresados antes se desplazan al búfer
8c3abf18, y esa región se usa para la detección de cheats - Tras cargar el snapshot en Ghidra, se encontró que la función ubicada en
8c0334d8lee ese búfer - Esta función transforma el búfer y comprueba si el resultado coincide con alguno de los 6 valores especiales de una lista
GYU GYU XXXse transforma en9388D627, que coincide con el primer valor especial de la lista
Método de transformación y estructura del checksum
- El flujo de la función de transformación confirmado mediante el decompilador de Ghidra es el siguiente
- Lee una passphrase
- Descifra una clave de 1024 bytes con la passphrase
- Calcula el checksum del búfer de entrada usando la clave
- Vuelve a cifrar la clave
- Como el checksum es una función unidireccional, es difícil calcular a simple vista qué entrada produce un valor especial
- En una actualización posterior, metalliczx y SideQuark confirmaron que, tras el descifrado, la estructura corresponde al polinomio estándar de checksum CRC32
- Por eso existe un método más eficiente que la fuerza bruta para obtener los valores objetivo
Entradas encontradas mediante fuerza bruta con Python
GYUGYUtiene 6 letras, y hay26^6 = 308,915,776combinaciones posibles de 6 letras- Con 7 letras se llega a 8 mil millones de combinaciones, y con 8 letras a 208 mil millones, una escala pesada para una laptop
- La implementación en Python prueba entradas con el siguiente procedimiento
- Copia el búfer de entrada sin inicializar, la passphrase y el bloque de memoria que contiene la clave
- Descifra la clave con la passphrase
- Inserta secuencias de 1 a 8 letras en el búfer de entrada
- Calcula el checksum de cada entrada
- Compara el resultado calculado con los valores objetivo
- El código completo está publicado en gist
- Con la versión de un solo hilo ya se imprimieron los resultados necesarios, y estos aparecieron mientras se preparaba la versión paralela
Mapeos encontrados y efectos reales
- La última columna de la salida indica con qué valor especial hizo match cada entrada
NNSET,SOCCERyADEMVSSFhacen match con el mismo valor y desbloquean el juego bonus de fútbolAFTJSXOTdesbloquea todos los niveles igual queGYUGYU
- Al ingresar
SOCCER+XXXcomo iniciales, se abre Bonus Game y se puede jugar fútbol submarino- Establece el bit
0x2en el flag de8c3ac00c
- Establece el bit
EXBBERX+XXXmuestra Immortality Enabled en la pantalla Options- Mientras está activo, Ecco no se ahoga ni muere
- Establece el bit
0x400del flag8c3abe48y el bit0x4del flag8c3abb00
QQRIQ+XXXmuestra el framerate del juego y algunos valores de depuraciónXYZZYX+XXXmuestra el valor actual del reloj- Ambas entradas cambian los valores de las direcciones
8c35659cy8c3565a4
- Ambas entradas cambian los valores de las direcciones
- No se confirmó el efecto de
POPELY+XXX- Se estima que intentaba activar el flag de
8c3b0e44, pero este flag solo muestra el mensaje Cheats Enabled y no se observa ningún otro efecto
- Se estima que intentaba activar el flag de
1 comentarios
Opiniones en Hacker News
El hash es simplemente CRC32; para ser precisos, usa este polinomio (0x77073096, el código está mal)
https://web.mit.edu/freebsd/head/sys/libkern/crc32.c
Los enteros descifrados en el artículo son las constantes de este CRC32. Si sabes que es CRC32 y conoces el polinomio, puedes calcular la respuesta inversa en tiempo logarítmico, no exponencial, usando aritmética modular en el anillo de polinomios
Dicen que Binwalk reconoce tablas de polinomios CRC; me pregunto si también podría encontrar esta tabla
Alguien debería integrar Binwalk y Ghidra. Encajan demasiado bien
Me pregunto si hay tips para descubrir que el valor es un resultado CRC32, o para identificar el polinomio/valor inicial usado
Cuando el Ecco original salió para Megadrive (Genesis), gasté todo el dinero que me había costado tanto ahorrar para comprarlo. El juego era absurdamente difícil y, de la frustración, pasé toda una tarde con lápiz y papel hasta que de algún modo logré descifrar el sistema de contraseñas
Me teletransporté al nivel final y lo terminé al día siguiente, pero me atormentaba la culpa de haber gastado todo mi dinero en un juego que terminé en dos días
Descifrar el sistema de contraseñas con lápiz y papel suena increíble; si recuerdas algo más, me gustaría escucharlo
Filosóficamente, yo diría que no terminaste el juego
Te saltaste varios niveles y solo viste una parte del contenido, la jugabilidad y la historia previstos. En juegos como Ecco the Dolphin, en general importa más el viaje que el destino. Te perdiste temas y experiencias como el aislamiento, hacerte amigo de grupos externos, la conservación, los viajes en el tiempo, la conexión con dinosaurios y, por supuesto, los viajes espaciales
Así que no hacía falta que sintieras tanta culpa
Aun así, el nivel final era impresionante. Me pregunto si te sorprendió verlo tras saltarte gran parte del juego
Con trampas o no, quizá seas la única persona en el mundo que terminó este juego
QQRIQ es una forma fonética abreviada de “kukuriku”, y en húngaro y en varios idiomas representa el canto del gallo. Hay ejemplos como el polaco “kukuryku” y el hebreo “קוקוריקו”
Me da curiosidad cómo fue el proceso para elegir las contraseñas
Gyugyu también podría ser una referencia a la película húngara “The Fifth Seal”
“Imagina que estás por morir y que vas a reencarnar en una de dos personas: un esclavo o un amo rico. El esclavo sufre a manos de su amo, pierde la lengua y un ojo, y también asesinan a su esposa e hijos. Sigue viviendo creyendo que es una buena persona, porque nunca hizo a otros cosas tan horribles y sádicas como las del amo. El amo rico no tiene ningún escrúpulo moral. No cree que lo que hizo esté mal y piensa que el esclavo merecía ser castigado. Debes elegir si serás el esclavo pobre pero justo, o el amo rico pero corrupto.”
Gyugyu es el nombre del esclavo
https://www.imdb.com/title/tt0075467
Como los programadores de este juego estaban en Budapest, es una conjetura bastante plausible
Popely, con la “ly” del húngaro, también era una pista
En francés es Cocorico, así que es muy parecido
También me recuerda al pueblo Kakariko de Zelda, donde siempre aparecen gallinas
Como dato curioso, cuando le preguntaron por sus inspiraciones, Ed Annunziata, desarrollador de Ecco, respondió: “Nunca probé LSD, pero leí mucho a John C. Lilly”. Lilly es conocido por su trabajo pionero en inteligencia animal, psicoterapia con ketamina, tanques de privación sensorial y exploración de la conciencia
El nombre “Ecco” es una referencia a ECCO (Earth Coincidence Control Office) de Lilly. John postulaba la existencia de una base sobrenatural/extraterrestre en el lado oculto de la Luna para coordinar todas las “coincidencias” de la Tierra. Fue una de las primeras personas en reconocer lo inteligentes que eran los delfines, y se obsesionó tanto con descubrir cómo comunicarse con ellos que llegó a inundar la mitad de su casa en el Caribe y vivir con ellos. Esto apenas es la punta del iceberg; si te interesa, recomiendo mucho su autobiografía The Center of the Cyclone. Es una persona realmente fascinante
Me pregunto si hay recursos para empezar con la ingeniería inversa de juegos de Dreamcast. Hay cosas que me gustaría intentar con Skies of Arcadia, pero quisiera técnicas más sistemáticas que “ver qué valores cambian entre snapshots de memoria”
Para encontrar la ubicación de un valor en RAM, ese método es prácticamente la técnica estándar. En la práctica funciona bastante bien
Algunos emuladores como Dolphin traen herramientas de ese tipo integradas. Herramientas antiguas de hacking de juegos, como Gameshark para N64, usaban la misma técnica con una UI de consola. No sé si algún emulador de Dreamcast tiene una herramienta así
Escribí un artículo usando esta técnica en Dolphin, y el artículo siguiente también trata sobre hacking de juegos de consola con Ghidra: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...
He mirado un poco ese juego. El truco principal es volcar un snapshot de memoria a un archivo y luego importarlo en Ghidra. Hay varias formas de hacer el dump, y a mucha gente le gusta Cheat Engine
Ghidra puede analizar de forma nativa el código máquina de procesadores SuperH, así que con solo ejecutar el análisis automático ya aparecen muchas funciones
En los últimos años me han atraído mucho más los juegos antiguos y, aunque no sé si la expresión tiene sentido, se sienten con mucha más alma
Y qué lástima lo del auto. Gracias por la advertencia; de ahora en adelante no lo dejaré en ralentí estacionado en la entrada
Siempre me pregunté por dónde empezar a aprender ingeniería inversa. La mayoría dice que primero hay que aprender ensamblador, pero después de eso no parece haber mucha información concreta en línea
No sé si se trata de ir aprendiendo poco a poco, por prueba y error, los patrones comunes de x86, ARM y plataformas arcade. Es difícil encontrar discusiones en línea que entren en detalle
Con herramientas como Ghidra se puede ir ajustando el código fuente poco a poco, pero al final hay que inferir las cosas del mismo modo que cuando se intenta entender una base de código desconocida. La diferencia esta vez es que no hay ningún comentario, aunque también hay bastantes proyectos de código abierto sin comentarios.
Para ejemplos más cercanos a la realidad, conviene resolver http://microcorruption.com o https://crackmes.one/.
Personalmente aprendí mucho trasteando con Cheat Engine. Lo usaba sobre todo cuando era chico y luego no lo volví a mirar, así que no sabía que era una herramienta mucho más potente de lo que pensaba.
El desensamblador es bastante decente, y permite escribir lo que llaman “assembly scripts”, así que es bueno para aprender lo básico de aplicar parches en memoria con ensamblador x86. A partir de ahí puedes empezar a crear tus propias utilidades para parchear juegos como quieras.
Solo con Cheat Engine se pueden parchear juegos para crear cheats de un nivel absurdo.
Aprendí algo en la escuela, pero ejecutar paso a paso con un depurador los videojuegos que recordaba de chico me enseñó ciencias de la computación mucho mejor que lo aprendido en clase.
Quiero ver un video donde el cheat de fútbol submarino realmente funcione.
Es interesante cómo juegos similares ajustan la suma de comprobación con enteros fijos. Pitfall: The Lost Expedition usaba un método muy parecido: convertía las entradas de botones en cadenas ASCII de los botones presionados y luego calculaba el CRC.
El enfoque también consistía en hacer casi fuerza bruta con Python y comparar contra los hashes de cheats extraídos. También se ve una tabla CRC32 oculta dentro de
decrypted_ints. Las tablas pregeneradas son demasiado fáciles de buscar. En vez de generar una tabla nueva con un polinomio propio, uno termina preguntándose por qué aparecen tan a menudo ofuscadas para hacerlas más difíciles.Me sorprende que haya un blog centrado en Sega Saturn.
Hace poco encontré un Saturn y un pequeño paquete de CDs de juegos en el clóset de la casa de mis padres. No recuerdo haberlo tenido, así que supongo que mi hermano lo habrá conseguido después de que me fui a la universidad. En cualquier caso, lo conecté y todos los juegos funcionaban bien. Pero, aparte de eso, no tengo la menor idea de qué hacer con él. Por supuesto, tirarlo no es una opción.
Los juegos valen una fortuna. En 2005 regalé los míos sin más, y ahora, cuando busco los precios en eBay, se me acelera el corazón.
Disfrútalos.
[https://terraonion.com/en/producto/terraonion-mode/](https://terraonion.com/en/producto/terraonion-mode/