2 puntos por GN⁺ 2024-11-08 | 1 comentarios | Compartir por WhatsApp
  • 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, SOCCER y ADEMVSSF abren el juego bonus de fútbol, y AFTJSXOT desbloquea todos los niveles igual que GYUGYU

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 GYU como iniciales y, sin presionar End, volver a ingresar GYU y tres letras arbitrarias
    • Tras ingresarlo en la forma GYU GYU XXX y salir del menú, en Load game se pueden seleccionar todos los niveles
  • Las entradas especiales confirmadas y sus efectos son los siguientes
    • GYUGYU+XXX: desbloquea todos los niveles
    • SOCCER+XXX: desbloquea el nivel bonus
    • EXBBERX+XXX: modo inmortal
    • QQRIQ+XXX: muestra los FPS
    • XYZZYX+XXX: muestra la hora
    • POPELY+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 8c0334d8 lee 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 XXX se transforma en 9388D627, 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

  • GYUGYU tiene 6 letras, y hay 26^6 = 308,915,776 combinaciones 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, SOCCER y ADEMVSSF hacen match con el mismo valor y desbloquean el juego bonus de fútbol
    • AFTJSXOT desbloquea todos los niveles igual que GYUGYU
  • Al ingresar SOCCER+XXX como iniciales, se abre Bonus Game y se puede jugar fútbol submarino
    • Establece el bit 0x2 en el flag de 8c3ac00c
  • EXBBERX+XXX muestra Immortality Enabled en la pantalla Options
    • Mientras está activo, Ecco no se ahoga ni muere
    • Establece el bit 0x400 del flag 8c3abe48 y el bit 0x4 del flag 8c3abb00
  • QQRIQ+XXX muestra el framerate del juego y algunos valores de depuración
  • XYZZYX+XXX muestra el valor actual del reloj
    • Ambas entradas cambian los valores de las direcciones 8c35659c y 8c3565a4
  • 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

1 comentarios

 
GN⁺ 2024-11-08
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

    • ¿Seguro que no extrañas las funciones modernas como la conexión obligatoria a la red y los micropagos?
    • No sé qué le pasó al auto. No lo vi en el artículo ni en los comentarios
  • 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

    • Es parecido a la depuración. Seguramente alguna vez te tocó encargarte de una base de código desconocida y entenderla; solo que en vez del código fuente tienes un binario

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.

En cierto sentido, ya estás a medio camino, y si estás familiarizado con código ensamblador, obviamente ayuda.
  • 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.