2 points par GN⁺ 2024-11-08 | 1 commentaires | Partager sur WhatsApp
  • Dans Ecco the Dolphin: Defender of the Future sur Dreamcast, des cheats cachés s’activaient via la saisie des initiales dans le fichier de sauvegarde ; outre le GYUGYU+XXX déjà connu, plusieurs entrées spéciales ont été confirmées
  • L’analyse a consisté à charger un instantané mémoire de flycast dans Ghidra, à trouver le tampon de saisie et la fonction de traitement, puis à suivre la structure dans laquelle le résultat de la transformation est comparé à six valeurs spéciales
  • La détection des cheats ne se fait pas sur la chaîne saisie elle-même, mais sur une valeur obtenue après déchiffrement d’une clé avec une phrase secrète et calcul de checksum, ce qui la rend difficile à trouver par simple lecture des chaînes
  • Une recherche exhaustive en Python sur des entrées de 1 à 8 caractères a confirmé que SOCCER, EXBBERX, QQRIQ, XYZZYX, POPELY, entre autres, sont liés à un niveau bonus, au mode invincible, à l’affichage du FPS et à l’affichage de l’heure
  • Les entrées produisant le même effet ne sont pas uniques : NNSET, SOCCER et ADEMVSSF ouvrent tous le jeu bonus de football, tandis que AFTJSXOT, comme GYUGYU, débloque tous les niveaux

Cheats cachés activés par le nom du fichier de sauvegarde

  • Ecco the Dolphin: Defender of the Future est le dernier jeu Ecco officiellement sorti, et sa suite a été annulée
  • Le cheat déjà connu consistait, sur l’écran VMU, à choisir New Game, à saisir GYU comme initiales, puis, sans appuyer sur End, à saisir de nouveau GYU suivi de trois lettres quelconques
    • Après avoir saisi une forme du type GYU GYU XXX, puis quitté le menu, il devient possible de sélectionner tous les niveaux dans Load game
  • Les entrées spéciales confirmées et leurs effets sont les suivants
    • GYUGYU+XXX : débloque tous les niveaux
    • SOCCER+XXX : débloque le niveau bonus
    • EXBBERX+XXX : mode invincible
    • QQRIQ+XXX : affichage du FPS
    • XYZZYX+XXX : affichage de l’heure
    • POPELY+XXX : effet inconnu

Suivi de la routine de traitement de la saisie avec Ghidra

  • Dans un instantané mémoire de l’émulateur flycast, il a été confirmé qu’une partie des initiales affichées à l’écran était stockée dans le tampon 8cfffb34
  • En continuant la saisie, les caractères précédemment entrés sont poussés dans le tampon 8c3abf18, et c’est cette zone qui est utilisée pour la détection des cheats
  • Après avoir chargé l’instantané dans Ghidra, la fonction située à l’adresse 8c0334d8, qui lit ce tampon, a été trouvée
  • Cette fonction transforme le tampon, puis vérifie si le résultat correspond à l’une des six valeurs spéciales d’une liste
    • GYU GYU XXX est transformé en 9388D627, ce qui correspond à la première valeur spéciale de la liste

Méthode de transformation et structure du checksum

  • Le flux de la fonction de transformation, confirmé par la décompilation Ghidra, est le suivant
    • Lire la phrase secrète
    • Déchiffrer une clé de 1 024 octets avec la phrase secrète
    • Calculer le checksum du tampon de saisie à l’aide de la clé
    • Chiffrer de nouveau la clé
  • Comme le checksum est une fonction à sens unique, il est difficile de déduire directement à l’œil les entrées produisant les valeurs spéciales
  • Dans une mise à jour ultérieure, metalliczx et SideQuark ont confirmé qu’après déchiffrement, la structure correspondait au polynôme de checksum CRC32 standard
    • Il existe donc une méthode plus efficace que la recherche exhaustive pour obtenir les valeurs cibles

Entrées trouvées par recherche exhaustive en Python

  • GYUGYU compte 6 lettres, et le nombre de combinaisons possibles sur 6 lettres est 26^6 = 308,915,776
  • Avec 7 lettres, on passe à 8 milliards de combinaisons, et avec 8 lettres à 208 milliards, ce qui devient lourd pour un ordinateur portable
  • L’implémentation Python teste les entrées selon la procédure suivante
    • Copier le bloc mémoire contenant le tampon de saisie non initialisé, la phrase secrète et la clé
    • Déchiffrer la clé avec la phrase secrète
    • Placer les séquences de 1 à 8 lettres dans le tampon de saisie
    • Calculer le checksum de chaque entrée
    • Comparer le résultat calculé avec les valeurs cibles
  • Le code complet est publié sur gist
  • La version mono-thread a suffi à produire les résultats nécessaires, et les résultats étaient déjà sortis pendant l’écriture d’une version parallèle

Correspondances découvertes et effets réels

  • La dernière colonne des résultats indique à quelle valeur spéciale correspond chaque entrée
    • NNSET, SOCCER et ADEMVSSF correspondent tous à la même valeur et débloquent le jeu bonus de football
    • AFTJSXOT débloque tous les niveaux, comme GYUGYU
  • En saisissant SOCCER+XXX comme initiales, Bonus Game s’ouvre et permet de jouer au football sous-marin
    • Définit le bit 0x2 dans les flags de 8c3ac00c
  • EXBBERX+XXX affiche Immortality Enabled dans l’écran Options
    • Tant que l’effet est actif, on ne se noie pas et on ne meurt pas
    • Définit le bit 0x400 dans le flag 8c3abe48 et le bit 0x4 dans le flag 8c3abb00
  • QQRIQ+XXX affiche le framerate du jeu et certaines valeurs de débogage
  • XYZZYX+XXX affiche la valeur actuelle de l’horloge
    • Ces deux entrées modifient les valeurs aux adresses 8c35659c et 8c3565a4
  • L’effet de POPELY+XXX n’a pas été confirmé
    • Il est supposé qu’il devait activer un flag dans 8c3b0e44, mais ce flag ne fait qu’afficher le message Cheats Enabled, sans autre effet visible

1 commentaires

 
GN⁺ 2024-11-08
Commentaires sur Hacker News
  • Le hash est simplement un CRC32, et plus précisément il utilise ce polynôme (0x77073096, le code est erroné)

    https://web.mit.edu/freebsd/head/sys/libkern/crc32.c

    Les entiers déchiffrés dans l’article sont des constantes de ce CRC32. Si l’on sait qu’il s’agit d’un CRC32 ainsi que le polynôme, on peut remonter au résultat en temps logarithmique plutôt qu’en temps exponentiel en utilisant l’arithmétique modulaire sur l’anneau des polynômes

    • Il paraît que Binwalk reconnaît les tables de polynômes CRC ; je me demande s’il pourrait aussi retrouver cette table

      Quelqu’un devrait intégrer Binwalk et Ghidra. Les deux vont incroyablement bien ensemble

    • Je me demande s’il existe des astuces pour déterminer qu’une valeur est un résultat de CRC32, ou pour identifier le polynôme / la valeur initiale utilisés

  • Quand l’Ecco original est sorti sur Megadrive (Genesis), je l’ai acheté en y consacrant toutes mes économies durement gagnées. Le jeu était absurdement difficile, et, furieux, j’ai passé tout un après-midi avec un stylo et du papier à finalement décrypter d’une manière ou d’une autre le système de mots de passe

    Je me suis téléporté au niveau final et je l’ai terminé le lendemain, puis j’ai été rongé par la culpabilité d’avoir dépensé tout mon argent pour un jeu bouclé en deux jours

    • Décrypter un système de mots de passe avec un stylo et du papier, c’est impressionnant ; j’aimerais en entendre plus si tu t’en souviens

    • D’un point de vue philosophique, on peut considérer que tu n’as pas vraiment terminé ce jeu

      Tu as sauté plusieurs niveaux et n’as vu qu’une partie du contenu, du gameplay et de l’histoire prévus. Dans Ecco the Dolphin comme dans beaucoup de jeux, le voyage compte généralement plus que la destination. Tu es passé à côté de thèmes et d’expériences comme l’isolement, le fait de se lier d’amitié avec l’altérité, la préservation, le voyage temporel, la communion avec les dinosaures et, bien sûr, le voyage spatial

      Donc tu n’avais pas à te sentir si coupable

    • Cela dit, le niveau final était formidable. Je me demande si ça t’a surpris de le voir après avoir sauté une si grande partie du jeu

    • Avec ou sans triche, tu es peut-être la seule personne au monde à avoir fini ce jeu

  • QQRIQ est une contraction phonétique de « kukuriku » et signifie le chant du coq en hongrois ainsi que dans plusieurs autres langues. On peut citer par exemple le polonais « kukuryku » ou l’hébreu « קוקוריקו »

    Ça donne envie de savoir comment le choix des mots de passe s’est fait

    • Gyugyu est peut-être aussi une référence au film hongrois « The Fifth Seal »

      « Imagine que tu es face à la mort et que tu vas te réincarner en l’un de deux hommes : un esclave et son riche maître. L’esclave souffre sous son maître, perd sa langue et un œil, et sa femme ainsi que ses enfants sont assassinés. Il continue de vivre en croyant être un homme bon, puisqu’il n’a jamais infligé aux autres les actes terribles et sadiques de son maître. Le riche maître, lui, n’a aucun scrupule moral. Il ne pense pas que ce qu’il a fait soit mal, et estime que l’esclave méritait son châtiment. Tu dois choisir entre être l’esclave pauvre mais juste, ou le maître riche mais corrompu. »

      Gyugyu est le nom de cet esclave

      https://www.imdb.com/title/tt0075467

    • Les programmeurs de ce jeu étaient à Budapest, donc c’est une hypothèse assez plausible

    • Popely, avec le « ly » hongrois, était aussi un indice

    • En français, c’est « Cocorico », donc c’est très proche

    • Ça fait aussi penser au village Kakariko de Zelda, où il y a toujours des poules

  • Anecdote intéressante : le développeur d’Ecco, Ed Annunziata, a répondu à une question sur ses inspirations par : « Je n’ai jamais pris de LSD, mais j’ai beaucoup lu John C. Lilly. » Lilly est connu pour ses travaux pionniers sur l’intelligence animale, la psychothérapie à la kétamine, les cuves d’isolation sensorielle et l’exploration de la conscience

    Le nom « Ecco » est une référence à l’ECCO (Earth Coincidence Control Office) de Lilly. John supposait l’existence d’une base surnaturelle / extraterrestre sur la face cachée de la Lune pour coordonner toutes les « coïncidences » sur Terre. Il fut l’un des premiers à reconnaître l’intelligence des dauphins, et il était obsédé par l’idée de découvrir comment communiquer avec eux, au point d’inonder la moitié de sa maison dans les Caraïbes pour vivre avec eux. Et ce n’est que la partie émergée de l’iceberg ; si le sujet vous intéresse, je recommande vivement son autobiographie The Center of the Cyclone. C’est un personnage vraiment fascinant

  • Je me demande s’il existe des ressources pour se lancer dans la rétro-ingénierie de jeux Dreamcast. Il y a des choses que j’aimerais tenter sur Skies of Arcadia, et j’aimerais des techniques un peu plus systématiques que « regarder quelles valeurs changent entre deux snapshots mémoire »

    • Pour trouver l’emplacement d’une valeur en RAM, cette méthode est en pratique presque une technique standard. En fait, elle fonctionne plutôt bien

      Certains émulateurs, comme Dolphin, intègrent ce type d’outils. D’anciens outils de hack de jeux comme Gameshark sur N64 utilisaient aussi la même technique avec une interface console. Je ne sais pas si des émulateurs Dreamcast proposent ce genre d’outils

      J’ai écrit un billet sur cette technique avec Dolphin, et le billet suivant porte aussi sur le hack de jeux console avec Ghidra : https://www.smokingonabike.com/2021/01/17/hacking-super-monk...

    • J’ai déjà un peu regardé ce jeu. L’astuce essentielle consiste à dumper des snapshots mémoire dans des fichiers, puis à les importer dans Ghidra. Il existe plusieurs façons de faire le dump, et beaucoup de gens aiment Cheat Engine

      Ghidra peut analyser nativement le code machine du processeur SuperH, donc rien qu’en lançant l’analyse automatique, un grand nombre de fonctions apparaissent

  • Ces dernières années, je me sens bien plus attiré par les vieux jeux, et, je ne sais pas si l’expression convient, mais ils donnent davantage l’impression d’avoir une âme

    Et pour la voiture, c’est triste. Merci pour l’avertissement, je ne la laisserai plus tourner au ralenti sur l’allée à l’avenir

    • Tu es sûr que des fonctionnalités modernes comme la connexion réseau obligatoire et les microtransactions ne vont pas te manquer ?
    • Je ne sais pas ce qui est arrivé à la voiture. Je ne l’ai pas vu dans l’article ni dans les commentaires
  • Je me suis toujours demandé par où commencer pour apprendre la rétro-ingénierie. La plupart des gens disent qu’il faut d’abord apprendre l’assembleur, mais après ça, il semble y avoir peu d’informations concrètes en ligne

    Je ne sais pas si c’est surtout une question d’apprendre lentement, par essais et erreurs, les motifs courants sur x86, arm et les plateformes d’arcade. Il est difficile de trouver en ligne des discussions qui entrent dans les détails

    • C’est similaire au débogage. Tu as probablement déjà dû prendre en main une base de code inconnue et comprendre son fonctionnement, sauf qu’ici, au lieu du code source, tu n’as qu’un binaire

Avec des outils comme Ghidra, on peut rapprocher peu à peu le code de la source, mais au final il faut raisonner de la même manière que lorsqu’on essaie de comprendre une base de code inconnue. La différence ici, c’est qu’il n’y a absolument aucun commentaire, mais c’est aussi assez fréquent dans des projets dont le code source est public.

On est déjà à moitié du chemin, et être à l’aise avec le code assembleur aide évidemment.
  • Comme exemple plus proche de la réalité, ça vaut le coup d’essayer http://microcorruption.com ou https://crackmes.one/.

  • Personnellement, j’ai énormément appris en bidouillant Cheat Engine. Je l’utilisais surtout quand j’étais plus jeune puis je n’y ai plus retouché, donc je ne m’en rendais pas compte, mais c’était un outil bien plus puissant que je ne l’imaginais.

    Le désassembleur est tout à fait correct, et on peut écrire ce qu’ils appellent des « assembly scripts », ce qui est idéal pour apprendre les bases des patchs mémoire en assembleur x86. À partir de là, on peut commencer à créer ses propres utilitaires pour patcher les jeux comme on veut.

    Rien qu’avec Cheat Engine, on peut patcher des jeux et créer des cheats complètement délirants.

  • J’en ai un peu fait à l’école, mais exécuter pas à pas au débogueur des jeux vidéo dont je me souvenais enfant m’a bien plus appris l’informatique que les cours.

  • J’aimerais voir une vidéo du cheat de football sous-marin en action.

  • C’est intéressant de voir que des jeux similaires vérifient les sommes de contrôle avec des entiers à virgule fixe. Pitfall: The Lost Expedition utilisait une méthode très proche, en convertissant les entrées des boutons en chaîne ASCII représentant les boutons pressés, puis en calculant un CRC.

    L’approche consistait elle aussi à extraire le tout en Python presque par force brute, puis à comparer avec le hachage du cheat. On voit aussi une table CRC32 cachée dans decrypted_ints. Les tables pré-générées se retrouvent trop facilement par recherche. Je me demande pourquoi on tombe si souvent sur des versions obfusquées, probablement pour compliquer l’analyse, au lieu de générer une nouvelle table à partir d’un polynôme maison.

  • Je suis surpris qu’il existe un blog centré sur la Sega Saturn.

    J’ai trouvé il y a peu une Saturn et un petit lot de CD de jeux dans un placard chez mes parents. Je ne me souvenais pas en avoir eu une, donc je suppose que mon frère ou ma sœur l’a récupérée après mon départ pour l’université. Quoi qu’il en soit, je l’ai branchée et tous les jeux fonctionnaient encore. Mais à part ça, je ne sais absolument pas quoi en faire. La jeter n’est évidemment pas une option.