2 Punkte von GN⁺ 2024-11-08 | 1 Kommentare | Auf WhatsApp teilen
  • 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+XXX wurden 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, XYZZYX und POPELY mit Bonus-Stufe, Unsterblichkeitsmodus, FPS-Anzeige und Zeitanzeige verknüpft sind
  • Eingaben mit demselben Effekt sind nicht auf genau eine Form festgelegt; NNSET, SOCCER und ADEMVSSF öffnen alle das Bonus-Fußballspiel, und AFTJSXOT schaltet wie GYUGYU alle 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 GYU eingeben, dann ohne End zu drücken erneut GYU und beliebige drei weitere Buchstaben eingeben
    • Nach der Eingabe in der Form GYU GYU XXX und dem Verlassen des Menüs lassen sich unter Load game alle Stufen auswählen
  • Die bestätigten speziellen Eingaben und ihre Effekte sind wie folgt
    • GYUGYU+XXX: alle Level freischalten
    • SOCCER+XXX: Bonus-Stufe freischalten
    • EXBBERX+XXX: Unsterblichkeitsmodus
    • QQRIQ+XXX: FPS anzeigen
    • XYZZYX+XXX: Zeit anzeigen
    • POPELY+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 8cfffb34 gespeichert wird
  • Bei weiterer Eingabe werden die zuvor eingegebenen Zeichen in den Puffer 8c3abf18 geschoben; dieser Bereich wird für die Cheat-Erkennung verwendet
  • Nach dem Laden des Snapshots in Ghidra wurde gefunden, dass die Funktion an Position 8c0334d8 diesen Puffer liest
  • Diese Funktion wandelt den Puffer um und prüft, ob das Ergebnis einem der 6 Spezialwerte in einer Liste entspricht
    • GYU GYU XXX wird zu 9388D627 umgewandelt 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

  • GYUGYU ist 6 Zeichen lang, und es gibt 26^6 = 308,915,776 mö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, SOCCER und ADEMVSSF stimmen alle mit demselben Wert überein und schalten das Bonus-Fußballspiel frei
    • AFTJSXOT schaltet wie GYUGYU alle Stufen frei
  • Wenn SOCCER+XXX als Initialen eingegeben wird, wird Bonus Game geöffnet, und es kann Unterwasserfußball gespielt werden
    • Im Flag bei 8c3ac00c wird das Bit 0x2 gesetzt
  • EXBBERX+XXX zeigt im Options-Bildschirm Immortality Enabled an
    • Solange es aktiv ist, kann man weder ertrinken noch sterben
    • Es setzt das Bit 0x400 im Flag 8c3abe48 und das Bit 0x4 im Flag 8c3abb00
  • QQRIQ+XXX zeigt die Framerate des Spiels und einige Debug-Werte an
  • XYZZYX+XXX zeigt den aktuellen Uhrwert an
    • Beide Eingaben verändern die Werte an den Adressen 8c35659c und 8c3565a4
  • Der Effekt von POPELY+XXX konnte nicht bestätigt werden
    • Vermutlich sollte damit ein Flag an 8c3b0e44 aktiviert werden, aber dieses Flag zeigt offenbar nur die Meldung Cheats Enabled an und hat keinen weiteren sichtbaren Effekt

1 Kommentare

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

    • Bist du sicher, dass du moderne Features wie Pflicht-Netzwerkverbindung und Mikrotransaktionen nicht vermisst?
    • Ich weiß nicht, was mit dem Auto passiert ist. Ich habe es weder im Artikel noch in den Kommentaren gesehen
  • 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

    • Es ist ähnlich wie Debugging. Du hattest bestimmt schon einmal eine fremde Codebasis vor dir, die du verstehen musstest; nur dass du statt des Quellcodes eben ein Binary hast

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.

Damit ist man gewissermaßen schon zur Hälfte dort, und wenn man mit Assembly-Code vertraut ist, hilft das natürlich.
  • 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_ints sieht 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.