- 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+XXXdé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,SOCCERetADEMVSSFouvrent tous le jeu bonus de football, tandis queAFTJSXOT, commeGYUGYU, 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
GYUcomme initiales, puis, sans appuyer sur End, à saisir de nouveauGYUsuivi 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
- Après avoir saisi une forme du type
- Les entrées spéciales confirmées et leurs effets sont les suivants
GYUGYU+XXX: débloque tous les niveauxSOCCER+XXX: débloque le niveau bonusEXBBERX+XXX: mode invincibleQQRIQ+XXX: affichage du FPSXYZZYX+XXX: affichage de l’heurePOPELY+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 XXXest transformé en9388D627, 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
GYUGYUcompte 6 lettres, et le nombre de combinaisons possibles sur 6 lettres est26^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,SOCCERetADEMVSSFcorrespondent tous à la même valeur et débloquent le jeu bonus de footballAFTJSXOTdébloque tous les niveaux, commeGYUGYU
- En saisissant
SOCCER+XXXcomme initiales, Bonus Game s’ouvre et permet de jouer au football sous-marin- Définit le bit
0x2dans les flags de8c3ac00c
- Définit le bit
EXBBERX+XXXaffiche 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
0x400dans le flag8c3abe48et le bit0x4dans le flag8c3abb00
QQRIQ+XXXaffiche le framerate du jeu et certaines valeurs de débogageXYZZYX+XXXaffiche la valeur actuelle de l’horloge- Ces deux entrées modifient les valeurs aux adresses
8c35659cet8c3565a4
- Ces deux entrées modifient les valeurs aux adresses
- L’effet de
POPELY+XXXn’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
- Il est supposé qu’il devait activer un flag dans
1 commentaires
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
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
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.
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.
Les jeux ont énormément de valeur. J’ai donné la mienne en 2005, et quand je regarde les prix sur eBay aujourd’hui, ça me donne des palpitations.
Il suffit d’en profiter.
https://terraonion.com/en/producto/terraonion-mode/