Reverse-Engineering-Analyse von Ecco the Dolphin mit Ghidra und Python
(32bits.substack.com)- In Ecco the Dolphin: Defender of the Future für Dreamcast war ein Cheat versteckt, der über die Eingabe von Initialen in der Speicherdatei aktiviert wird; neben dem bekannten
GYUGYU+XXXwurden auch mehrere weitere spezielle Eingaben bestätigt - Die Analyse lud einen Speicher-Snapshot aus flycast in Ghidra, suchte den Eingabepuffer und die Verarbeitungsfunktion und verfolgte die Struktur, in der das Umwandlungsergebnis mit 6 Spezialwerten verglichen wird
- Die Cheat-Erkennung basiert nicht auf dem Eingabestring selbst, sondern auf einem Schlüssel, der mit einer Passphrase entschlüsselt wird, sowie auf einem Wert nach Checksum-Berechnung, wodurch sie sich nicht einfach durch das Lesen von Strings finden lässt
- Mit Python-Brute-Force wurden Eingaben von 1 bis 8 Zeichen geprüft; dabei wurde bestätigt, dass
SOCCER,EXBBERX,QQRIQ,XYZZYXundPOPELYmit Bonus-Stufe, Unsterblichkeitsmodus, FPS-Anzeige und Zeitanzeige verknüpft sind - Eingaben mit demselben Effekt sind nicht auf genau eine Form festgelegt;
NNSET,SOCCERundADEMVSSFöffnen alle das Bonus-Fußballspiel, undAFTJSXOTschaltet wieGYUGYUalle Stufen frei
Versteckte Cheats, die über den Namen der Speicherdatei aktiviert werden
- Ecco the Dolphin: Defender of the Future ist das letzte offiziell veröffentlichte Ecco-Spiel; ein Nachfolger wurde eingestellt
- Der bereits bekannte Cheat funktioniert so: Auf dem VMU-Bildschirm New Game wählen, bei den Initialen
GYUeingeben, dann ohne End zu drücken erneutGYUund beliebige drei weitere Buchstaben eingeben- Nach der Eingabe in der Form
GYU GYU XXXund dem Verlassen des Menüs lassen sich unter Load game alle Stufen auswählen
- Nach der Eingabe in der Form
- Die bestätigten speziellen Eingaben und ihre Effekte sind wie folgt
GYUGYU+XXX: alle Level freischaltenSOCCER+XXX: Bonus-Stufe freischaltenEXBBERX+XXX: UnsterblichkeitsmodusQQRIQ+XXX: FPS anzeigenXYZZYX+XXX: Zeit anzeigenPOPELY+XXX: Effekt unbekannt
Verfolgung der Eingabeverarbeitungsroutine mit Ghidra
- Im Speicher-Snapshot des flycast-Emulators wurde bestätigt, dass ein Teil der auf dem Bildschirm sichtbaren Initialen im Puffer
8cfffb34gespeichert wird - Bei weiterer Eingabe werden die zuvor eingegebenen Zeichen in den Puffer
8c3abf18geschoben; dieser Bereich wird für die Cheat-Erkennung verwendet - Nach dem Laden des Snapshots in Ghidra wurde gefunden, dass die Funktion an Position
8c0334d8diesen Puffer liest - Diese Funktion wandelt den Puffer um und prüft, ob das Ergebnis einem der 6 Spezialwerte in einer Liste entspricht
GYU GYU XXXwird zu9388D627umgewandelt und stimmt mit dem ersten Spezialwert der Liste überein
Umwandlungsverfahren und Checksum-Struktur
- Der in der Ghidra-Decompilierung bestätigte Ablauf der Umwandlungsfunktion ist wie folgt
- Passphrase lesen
- Mit der Passphrase einen 1024-Byte-Schlüssel entschlüsseln
- Mit dem Schlüssel die Checksum des Eingabepuffers berechnen
- Den Schlüssel erneut verschlüsseln
- Da die Checksum eine Einwegfunktion ist, lässt sich die Eingabe, die einen Spezialwert erzeugt, nicht einfach direkt visuell zurückrechnen
- In einem späteren Update bestätigten metalliczx und SideQuark, dass die Struktur nach der Entschlüsselung dem standardmäßigen CRC32-Checksum-Polynom entspricht
- Deshalb gibt es effizientere Wege, Zielwerte zu erhalten, als per Brute Force
Mit Python-Brute-Force gefundene Eingabewerte
GYUGYUist 6 Zeichen lang, und es gibt26^6 = 308,915,776mögliche 6-Zeichen-Kombinationen- Bei 7 Zeichen steigt die Zahl auf 8 Milliarden Kombinationen, bei 8 Zeichen auf 208 Milliarden, was auf einem Laptop eine erhebliche Last darstellt
- Die Python-Implementierung prüft Eingaben in folgenden Schritten
- Einen Speicherblock mit nicht initialisiertem Eingabepuffer, Passphrase und Schlüssel kopieren
- Den Schlüssel mit der Passphrase entschlüsseln
- Sequenzen von 1 bis 8 Zeichen in den Eingabepuffer schreiben
- Für jede Eingabe die Checksum berechnen
- Das Ergebnis mit dem Zielwert vergleichen
- Der vollständige Code ist als gist veröffentlicht
- Schon die Single-Thread-Version lieferte die benötigten Ergebnisse; während an einer Parallelversion gearbeitet wurde, lagen die Resultate bereits vor
Gefundene Zuordnungen und tatsächliche Effekte
- Die letzte Spalte der Ausgabe zeigt an, mit welchem Spezialwert eine Eingabe übereinstimmt
NNSET,SOCCERundADEMVSSFstimmen alle mit demselben Wert überein und schalten das Bonus-Fußballspiel freiAFTJSXOTschaltet wieGYUGYUalle Stufen frei
- Wenn
SOCCER+XXXals Initialen eingegeben wird, wird Bonus Game geöffnet, und es kann Unterwasserfußball gespielt werden- Im Flag bei
8c3ac00cwird das Bit0x2gesetzt
- Im Flag bei
EXBBERX+XXXzeigt im Options-Bildschirm Immortality Enabled an- Solange es aktiv ist, kann man weder ertrinken noch sterben
- Es setzt das Bit
0x400im Flag8c3abe48und das Bit0x4im Flag8c3abb00
QQRIQ+XXXzeigt die Framerate des Spiels und einige Debug-Werte anXYZZYX+XXXzeigt den aktuellen Uhrwert an- Beide Eingaben verändern die Werte an den Adressen
8c35659cund8c3565a4
- Beide Eingaben verändern die Werte an den Adressen
- Der Effekt von
POPELY+XXXkonnte nicht bestätigt werden- Vermutlich sollte damit ein Flag an
8c3b0e44aktiviert werden, aber dieses Flag zeigt offenbar nur die Meldung Cheats Enabled an und hat keinen weiteren sichtbaren Effekt
- Vermutlich sollte damit ein Flag an
1 Kommentare
Meinungen auf Hacker News
Der Hash ist einfach CRC32, genauer gesagt wird dieses Polynom verwendet (0x77073096, der Code ist falsch)
https://web.mit.edu/freebsd/head/sys/libkern/crc32.c
Die im Artikel entschlüsselten Ganzzahlen sind Konstanten dieses CRC32. Wenn man weiß, dass es CRC32 ist und welches Polynom verwendet wird, kann man die Antwort mithilfe modularer Mathematik im Polynomring in logarithmischer Zeit statt in exponentieller Zeit zurückrechnen
Binwalk soll CRC-Polynomtabellen erkennen; ich frage mich, ob es auch diese Tabelle finden könnte
Jemand sollte Binwalk und Ghidra integrieren. Die beiden passen viel zu gut zusammen
Ich frage mich, ob es Tipps gibt, wie man erkennt, dass der Wert ein CRC32-Ergebnis ist, oder wie man das verwendete Polynom/den Initialwert herausfindet
Als das ursprüngliche Ecco für den Megadrive (Genesis) erschien, habe ich all mein mühsam zusammengespartes Geld dafür ausgegeben. Das Spiel war absurd schwer, und weil ich wütend war, saß ich den ganzen Nachmittag mit Stift und Papier da und habe irgendwie das Passwortsystem geknackt
Ich habe mich ins letzte Level teleportiert und es am nächsten Tag durchgespielt, wurde dann aber von Schuldgefühlen geplagt, weil ich mein ganzes Vermögen für ein Spiel ausgegeben hatte, das ich in zwei Tagen beendet hatte
Dass du das Passwortsystem mit Stift und Papier geknackt hast, würde mich interessieren; falls du dich an etwas erinnerst, erzähl gern mehr
Philosophisch gesehen würde ich sagen, du hast das Spiel nicht wirklich durchgespielt
Du hast mehrere Level übersprungen und nur einen Teil der vorgesehenen Inhalte, des Gameplays und der Geschichte gesehen. Bei Spielen, darunter Ecco the Dolphin, geht es im Allgemeinen eher um die Reise als um das Ziel. Du hast Themen und Erfahrungen wie Isolation, Freundschaft mit einer Fremdgruppe, Bewahrung, Zeitreisen, Begegnungen mit Dinosauriern und natürlich Raumfahrt verpasst
Also musstest du dich deswegen gar nicht so schuldig fühlen
Trotzdem war das letzte Level großartig. Ich frage mich, ob es dich überrascht hat, als du es sahst, nachdem du einen großen Teil des Spiels übersprungen hattest
Ob mit Cheats oder ohne: Du bist vielleicht der einzige Mensch auf der Welt, der dieses Spiel durchgespielt hat
QQRIQ ist eine lautliche Kurzform von „kukuriku“ und bezeichnet im Ungarischen und in mehreren anderen Sprachen den Hahnenschrei. Beispiele sind das Polnische „kukuryku“ oder das Hebräische „קוקוריקו“
Da fragt man sich, wie die Passwörter ausgewählt wurden
Gyugyu könnte auch eine Anspielung auf den ungarischen Film „The Fifth Seal“ sein
„Stell dir vor, du stehst kurz vor dem Tod und wirst als einer von zwei Menschen wiedergeboren: als Sklave oder als reicher Herr. Der Sklave leidet unter seinem Herrn, verliert seine Zunge und ein Auge, und auch seine Frau und seine Kinder werden ermordet. Er lebt weiter im Glauben, ein guter Mensch zu sein, weil er anderen nie so schreckliche, sadistische Dinge angetan hat wie sein Herr. Der reiche Herr hat keinerlei moralische Skrupel. Er hält das, was er getan hat, nicht für falsch und meint, der Sklave habe seine Strafe verdient. Du musst wählen, ob du der arme, aber rechtschaffene Sklave oder der reiche, aber verdorbene Herr sein willst.“
Gyugyu ist der Name dieses Sklaven
https://www.imdb.com/title/tt0075467
Da die Programmierer dieses Spiels in Budapest saßen, ist das eine ziemlich plausible Vermutung
Popely mit dem ungarischen „ly“ war ebenfalls ein Hinweis
Auf Französisch heißt es Cocorico, also sehr ähnlich
Ich muss auch an das Dorf Kakariko aus Zelda denken, wo ständig Hühner auftauchen
Als interessante Randnotiz: Ecco-Entwickler Ed Annunziata antwortete auf die Frage nach seinen Inspirationen: „Ich habe nie LSD genommen, aber viel John C. Lilly gelesen.“ Lilly ist für seine Pionierarbeiten zu tierischer Intelligenz, Ketamin-Psychotherapie, Isolationstanks und Bewusstseinsforschung bekannt
Der Name „Ecco“ ist eine Referenz auf Lillys ECCO (Earth Coincidence Control Office). John ging von der Existenz einer übernatürlichen/außerirdischen Basis auf der Rückseite des Mondes aus, die alle „Zufälle“ auf der Erde koordiniert. Er war einer der Ersten, die erkannten, wie intelligent Delfine sind, und war davon besessen, herauszufinden, wie man mit ihnen kommunizieren kann; er flutete sogar die Hälfte seines Hauses in der Karibik, um mit ihnen zusammenzuleben. Das ist nur die Spitze des Eisbergs, und wenn dich das interessiert, empfehle ich seine Autobiografie The Center of the Cyclone sehr. Eine wirklich faszinierende Person
Ich frage mich, ob es Material gibt, mit dem man in das Reverse Engineering von Dreamcast-Spielen einsteigen kann. Es gibt ein paar Dinge, die ich mit Skies of Arcadia ausprobieren möchte, aber es wäre schön, systematischere Methoden zu haben als nur „schauen, welche Werte sich zwischen Speicher-Snapshots ändern“
Um die Position von Werten im RAM zu finden, ist diese Methode praktisch der Standardansatz. Sie funktioniert tatsächlich ziemlich gut
Einige Emulatoren wie Dolphin haben solche Tools eingebaut. Ältere Game-Hacking-Tools wie Gameshark für das N64 nutzten dieselbe Technik über eine Konsolen-UI. Ich weiß nicht, ob Dreamcast-Emulatoren solche Tools haben
Ich habe einen Artikel geschrieben, in dem ich diese Technik in Dolphin verwende, und der Folgeartikel handelt ebenfalls vom Hacken von Konsolenspielen mit Ghidra: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...
Ich habe mir dieses Spiel einmal ein wenig angesehen. Der wichtigste Trick ist, Speicher-Snapshots in eine Datei zu dumpen und sie dann in Ghidra zu importieren. Es gibt verschiedene Wege, das zu tun, und viele Leute mögen Cheat Engine
Ghidra kann Maschinencode für SuperH-Prozessoren nativ analysieren, sodass schon die automatische Analyse viele Funktionen sichtbar macht
In den letzten Jahren fühle ich mich deutlich stärker zu alten Spielen hingezogen; ich weiß nicht, ob das eine sinnvolle Formulierung ist, aber sie wirken viel beseelter
Und die Sache mit dem Auto tut mir leid. Danke für die Warnung; ich werde es künftig nicht mehr in der Einfahrt im Leerlauf laufen lassen
Ich habe mich immer gefragt, wo man mit Reverse Engineering anfangen sollte. Die meisten sagen, man solle zuerst Assembler lernen, aber danach scheint es online nicht viel Konkretes zu geben
Ich weiß nicht, ob man sich die üblichen Muster von x86, ARM und Arcade-Plattformen langsam durch Versuch und Irrtum aneignet. Diskussionen, die ins Detail gehen, sind online schwer zu finden
Mit Tools wie Ghidra kann man den Quellcode Stück für Stück abgleichen, aber am Ende muss man genauso schlussfolgern wie beim Verstehen einer fremden Codebasis. Der Unterschied ist diesmal, dass es überhaupt keine Kommentare gibt – wobei es auch bei Projekten mit offenem Sourcecode ziemlich oft keine Kommentare gibt.
Für realistischere Beispiele lohnt es sich, http://microcorruption.com oder https://crackmes.one/ zu lösen.
Persönlich habe ich viel gelernt, indem ich mit Cheat Engine herumgespielt habe. Ich hatte es als Kind vor allem benutzt und danach nicht mehr angeschaut, daher wusste ich nicht, dass es ein viel mächtigeres Tool ist, als ich dachte.
Der Disassembler ist ausreichend gut, und man kann sogenannte „assembly scripts“ schreiben, was gut ist, um die Grundlagen von Speicher-Patches in x86-Assembly zu lernen. Von dort aus kann man anfangen, eigene Utilities zu bauen, um Spiele nach Wunsch zu patchen.
Allein mit Cheat Engine kann man Spiele patchen und Cheats auf völlig verrücktem Niveau erstellen.
In der Schule habe ich zwar ein wenig gelernt, aber ein Videospiel, an das ich mich aus meiner Kindheit erinnerte, Schritt für Schritt im Debugger auszuführen, hat mir Informatik viel besser beigebracht als der Unterricht.
Ich würde gern ein Video sehen, in dem der Unterwasser-Fußball-Cheat tatsächlich funktioniert.
Interessant ist, dass ähnliche Spiele Checksummen mit festen Ganzzahlen abgleichen. Pitfall: The Lost Expedition verwendete eine sehr ähnliche Methode: Es wandelte die Tasteneingaben in ASCII-Strings der Eingabetasten um und berechnete dann einen CRC.
Der Ansatz bestand ebenfalls darin, per Python nahezu brute-force-artig zu suchen und mit den extrahierten Cheat-Hashes zu vergleichen. In
decrypted_intssieht man auch die versteckte CRC32-Tabelle. Vorab generierte Tabellen lassen sich zu leicht suchen. Statt mit einem eigenen Polynom eine neue Tabelle zu erzeugen, fragt man sich, warum man sie so häufig obfuskiert vorfindet, offenbar um es schwieriger zu machen.Ein Blog, der sich auf den Sega Saturn konzentriert – erstaunlich.
Vor Kurzem habe ich im Wandschrank meiner Eltern einen Saturn und ein kleines Bündel Spiele-CDs gefunden. Ich kann mich nicht erinnern, ihn besessen zu haben, daher vermute ich, dass mein jüngerer Bruder ihn bekommen hat, nachdem ich aufs College gegangen war. Jedenfalls habe ich ihn angeschlossen, und alle Spiele funktionierten einwandfrei. Aber abgesehen davon habe ich keine Ahnung, was ich damit anfangen soll. Wegwerfen kommt natürlich nicht infrage.
Die Spiele sind enorm wertvoll. Ich habe meine 2005 einfach verschenkt, und wenn ich heute die Preise bei eBay nachsehe, wird mir ganz anders.
Einfach Spaß damit haben.
https://terraonion.com/en/producto/terraonion-mode/