SFT Bits: Game Genie

(Exklusiver Content für Patreon/Steady. Die Folge (und 400 weitere) findet ihr in/auf den jeweiligen Apps/Feeds/Webseiten, kostenpflichtige Mitgliedschaft nötig.)

Henner und Fabian sprechen über das berühmte Cheat-Tool.

17 „Gefällt mir“

Schöne Folge, und einer muss es mal sagen: Das Teil sieht aus wie ein Rasierapparat!

2 „Gefällt mir“

wie so oft: ich hätte gar nicht gedacht, daß mich das interessiert, und wie schön, daß ich wieder mal viel freude daran hatte, ein gerät gezeigt zu bekommen, mit dem ich nie irgendwelchen kontakt hatte, und plötzlich war ich richtig gespannt, ob denn wohl ein fünfter genie in reihe auch noch geht und ob henner ES WIRKLICH GETAN hat, die serie transportiert begeisterung an der sache und steckt die hörer*in damit echt an.
Hätte ich das ding bei einer haushaltsauflösungsgerümpelsache gefunden, ich wäre ratlos gewesen, ‚aha adapter von was, das weg ist…!‘

5 „Gefällt mir“

@Henner_Thomsen hast du dir zufällig den möglichen, adressierbaren Speicher angesehen? Bei mir / uns stand das Pro Action Replay (gerade zu 16bit Zeiten) immer höher im Kurs weil man damit tiefer im Spiele-/Programmcode rumwurschteln konnte (so war zumindest das Werbeversprechen, ziemlich sicher war allerdings die Code-Suche in Eigenregie deutlich besser). Erinnere mich da bspw. daran den “Schweiß” in Mortal Kombat 1 auf dem SNES per PAR-Code rot zu färben was auf dem GameGenie so nicht möglich gewesen wäre. Das wäre vielleicht noch ganz spannend gewesen wieso das so war bzw. die Unterschiede zum größten Konkurrenten Action Replay rauszuarbeiten.

1 „Gefällt mir“

Oh, das Action Replay bekommt sicher noch eine eigene Folge, eines Tages.

10 „Gefällt mir“

https://m.youtube.com/watch?v=nJ9zJ_PDatU

Wer etwas tiefer einsteigen möchte, kann sich das Video anschauen. Da wird auch erklärt, wie man neun Startleben an die entsprechende Speicherstelle laden lassen kann und dass der Trick mit den unendlichen vielen Leben etwas anders funktioniert. Ich fand’s sehr spannend, weil es gerade nicht wie POKE-Befehle funktioniert, die ja im RAM manipulieren.

2 „Gefällt mir“

Die Folge war ein ganz großer Spaß! Sympathisch und lustig!

2 „Gefällt mir“

Danke für den Link. Das referenzierte Bild von File:Nesgenieformat.png - NESdev Wiki sagt, ohne Ironie, eigentlich alles :slight_smile: . Das höchste Addressbit steht immer auf 1, da laut CPU memory map - NESdev Wiki dort das ROM gemappt ist und nur Zugriffe darauf überhaupt abgefangen werden können. Das dadurch freigewordene Bit entscheidet dann ob Replace oder Compare & Replace genutzt wird (Heißt auch, 8-stellige Codes haben immer einen der Buchstaben EOXUKSVN an dritter Stelle. Nett. (Was passiert, wenn man versucht eine 6-stelligen mit einem dieser Buchstaben an dritter Stelle einzugeben?)

So ganz kann ich allerdings nicht nachvollziehen, warum die da so eher willkürlich aussehendes Bit-Shuffling genutzt haben. Sieht für mich nach Obfuscation aus. Ob da nach Austauschen (wie in 8:50 im Video) von ein paar Buchstaben was sinnvolles passiert scheint mir sehr unwahrscheinlich.

Auch interessant: Hier ist der Assembly Code des Game Genie selbst: https://codeberg.org/qalle/nes-gamegenie-disassembly/src/branch/main/prg.asm, verantwortlich für das Interface der Codeeingabe.

1 „Gefällt mir“

Ahh, noch viel besser. Da freue ich mich drauf. Aber auch für die Genie-Folge mit maximalen Genie-Piggyback natürlich nichts als Liebe :sparkling_heart:

1 „Gefällt mir“

Schöne Folge.

Ich hatte nie ein Game Genie, wohl aber ein “Action Replay” für den Gameboy (den allerersten). Das ganz besondere an dem Ding war, dass man nicht nur Cheatcodes eingeben, sondern auch tatsächlich sehr schön neue herausfinden konnte.

Es gab dabei verschiedene Methoden, die aber alle einem Grundprinzip gemeinsam unterlagen: Man spielte das Spiel mehrmals so an, dass das Spiel jedes Mal möglichst an der gleichen Stelle mit möglichst gleichem Zustand war, mit Ausnahme der Sache die man verändern wollte. Wollte man zum Beispiel in Mario die Leben beeinflussen, so spielte man Mario an eine bestimmte Stelle (und merkte sich vielleicht z.B. noch wieviel Zeit auf dem Timer verblieb, ob man “groß” war, etc.), drückte dann den Reset-Knopf auf dem Action Replay, und machte das Ganze gleich nochmal… exakt an die selbe Stelle, aber dieses Mal mit unterschiedlichen Leben! Das ganze wiederholte man dann weiter, und nach und nach wurden die möglichen Codes immer weniger, bis irgendwann nur noch 1-3 übrig waren, die man dann einfach durchprobieren konnte. Das ging bei mir oft sehr gut, und hat riesig Spaß gemacht!

Das Modul hat dafür wohl einfach jedes Mal den ganzen Speicherinhalt verglichen. Die verschiedenen Modi machten den Vergleich dabei für viele Situationen allerdings einfacher:

So war der erste Modus hier für “bekannte Werte”, wie z.B. eben Leben, wo man nach jedem Reset jeweils die gerade dagewesene Anzahl Leben (oder was auch immer) eingeben konnte. Das schränkte die in Frage kommenden Speicherstellen deutlich ein. Die letzte Methode, “slow but sure”, war quasi der letzte Rettungsanker. Hier konnte man gar nix eingeben, sondern musste das Spiel wirklich ganz oft so exakt anspielen, dass möglichst nur das zu verändernde auch anders war. Das war wohl wirklich reiner Vergleich.

Der Screenshot ist aus diesem Video, was das Ding auch in Aktion zeigt.

Außerdem finde ich, dass das Modul mit seiner “180-Grad-Winkel”-Lösung deutlich eleganter aussah, das eigentliche Spiel kam dann einfach “von unten” an den Rücken des Gameboys dran:

2 „Gefällt mir“

Ich hatte das Game Genie fürs NES damals mal ausgeborgt und wollte damit endlich Super Mario Bros. 3 durchspielen. Also passende Codes eingegeben, endlich in Welt 8 weiter als zum dritten Level gekommen, am Ende Bowser besiegt, die Tür geht auf … und das Spiel geht von selbst auf Pause und reagiert auf keinen Tastendruck mehr.

Also zurückgesetzt, alles noch mal von vorne, und wieder nur “Pause” und keine Reaktion mehr.

Mein zehnjähriges Ich kam dann nach einigem Grübeln zu zwei möglichen Erklärungen: Entweder das Spiel hat einfach kein richtiges Ende (aber Super Mario Bros. 2 hatte doch so ein tolles Ende, warum sollte es im dritten Teil einfach nur “Pause” sein?), oder das Spiel erkennt irgendwie das Game Genie und friert am Ende absichtlich ein, damit man das Ende mit Game Genie nicht sehen kann – aber warum lässt es einen dann überhaupt mit Game Genie spielen?

Für mich klang keine der beiden Erklärungen wirklich plausibel.

Als Erwachsener habe ich Super Mario Bros. 3 dann schließlich am Emulator durchgespielt (mit Savestates), später die GBA-Version sogar regulär. Die Erklärung für die “Pause”-Sperre habe ich erst vor einigen Jahren gefunden – anscheinend erkennt das Spiel tatsächlich das Game Genie, lässt einen aber bis zum Ende problemlos damit spielen. Richtig fies.

Hmm, das will ich nicht ausschließen, allerdings erschien Mario Bros 3 vor dem Game Genie. Es wäre möglich, dass die Eingriffe durch die Codes zufällig verhindert haben, dass die Endsequenz ausgelöst wird.

Ich habe vor Jahren eine Quelle gefunden, die behauptet hat, dass es explizit so programmiert ist. Anscheinend wird am Ende eine Checksumme überprüft. Ob das stimmt, kann ich nicht beurteilen. Neben SMB 3 waren noch einige weitere Spiele genannt, die solche “Anti-Cheat-Maßnahmen” hätten. Finde die Quelle aber aktuell nicht mehr, könnte auch ein Video gewesen sein.

Nicht in Europa, da erschien SMB 3 erst Ende August 1991. Und Nintendo hat immer wieder stillschweigend neue Revisionen ihrer Spiele aufgelegt, mit kleineren Fixes und Änderungen. Auch bei SMB 3 gab es mehrere Revisionen, die erste US-Version ist hierbei schon eine Revision der japanischen Version und die europäische Version wiederum basiert auf der zweiten Revision der US-Version.

2 „Gefällt mir“

Eine sehr schöne Folge, weil ich als Homecomputer Kind nur die klassischen Freezer Module kenne.

Mich wundert, dass das Game Genie keinen „Pokefinder“ enthält wie die Freezer Module für Homecomputer. Die haben ein kleinen eingebauten RAM Chip um Speicher vom Hauptspeicher des Homecomputers da rein zu kopieren um selber Hauptspeicher nutzen zu können. Zur Menüanzeige, etc.

Der Speicher wird auch vom „Pokefinder“ benutzt. Man drückt im Spiel im Modul auf Freeze, aktiviert den Pokefinder, gibt an wie viel Leben man hat. Z.B. 5. Der speichert in dem Extra RAM alle Adressen des Hauptspeichers ab, in denen gerade 5 steht. Dann kehrt man zurück zum Spiel und verliert absichtlich ein Leben. Man drückt wieder Freeze und geht wieder zum Pokefinder und der schaut nach, ob eine der Adressen, die vorher auf 5 stand, nun auf 4 steht. Wenn das bei nur einer Adresse der Fall ist, hat man den Lebenszähler gefunden und konnte da z.B. 99 eingetragen. Manchmal musste man die Prozedur aber auch 2 mal machen, weil andere Adressen zufällig auch von 5 auf 4 gewechselt haben.

Ein NES hat mit 2 KB viel weniger RAM als z.B. der C64 mit 64 KB. Da könnte so ein Extra RAM auch sehr viel kleiner sein. Ich war richtig gehend schockiert, dass anscheinend die Mitarbeiter bis zu 3 Tage brauchten um alle 2048 Adressen (2KB) zu probieren, ob dann eine davon z.B. der Lebenszähler ist.

Da die Entwickler mit der NES Hardware ja anscheinend sehr vertraut waren, wundert es mich, dass sie nicht wenigstens ein internes Entwicklungs-System hatten, was so eine Pokefinder Funktionalität hat.

Und da sie in der Lage waren alles zwischen NES und Modul zu lesen, wundert es mich auch, wieso sie nicht einfach das ROM ausgelesen und im Programmcode nach dem Lebenszähler gesucht haben. Ich war mit der Methode auf dem C64 mit einem Freezer-Modul ohne einen Pokefinder immer sehr schnell.

Henner und Fabian erwähnen es im Podcast, aber wenn man nicht aufpasst, überhört man es vielleicht. Das Game Genie arbeitet nicht mit dem RAM des NES. Es wird also nicht auf den veränderlichen Speicher zugegriffen. Das Game Genie manipuliert nicht den Speicher während der Ausführung.

Was macht das Game Genie? Beim Start eines Spiels werden Daten vom ROM des Moduls geladen. Das ist der Festspeicher, in dem das Spiel enthalten ist. Das Game Genie manipuliert diese Daten. Ein Beispiel: Wenn Mario ein Leben verliert, wird eine Zeile ausgeführt, die in etwa so aussieht:

DEC Adresse der Speicherstelle im RAM, in der die Leben verwaltet werden

Das Game Genie fuscht nicht im RAM rum, sondern ändert beim Laden des Spiels die gerade beschriebene Zeile zu:

INC Adresse der Speicherstelle im RAM, in der die Leben verwaltet werden

Wenn Mario einen Gegner falsch berührt oder in einen Abgrund stürzt, wird der Spielcode normal ausgeführt. Im RAM des NES liegt aber nicht die erste Zeile mit dem DECrease-Befehl, um ein Leben abzuziehen. Durch das Game Genie hat das NES die falsche Zeile mit dem INCrease-Befehl geladen und eröht Marios Lebenanzahl bei jedem Tod um eins.

Aus diesem Grund gab es auch keine Funktionen, um das RAM zu manipulieren, weil das Game Genie nicht auf das RAM zugreift.

Aus diesem Grund half eine RAM-Analyse auch nicht bei der Entwicklung der Codes für das Game Genie, weil nicht die Adresse im Speicher relevant war, sondern die beim Laden des ROMS. Aus diesem Grund gab es so viele Codes, die Zahl der Startleben erhöht haben, aber keine Codes, die mittendrin die Lebensanzahl auf 99 gesetzt haben. RAM-Pokes funktionieren grundlegend anders als die ROM-Manipulation des Game Genies.

5 „Gefällt mir“

Danke Dir für die Erklärung. Das habe ich gerade trotz Kopfhörer nicht herausgehört. Das heißt beim Durchschleifen wird ein Befehl aus dem ROM für die CPU in einen anderen Befehl umgewandelt. Völlig verrückt. Das Castlevania III ROM ist 386 KB groß. Da ist die Suche ja noch viel schwerer!

Das ROM ist tatsächlich größer, die Manipulationsmethode aber simpler, weil man nicht ins RAM hineinlangen muss, sondern sich beim Laden zwischenschalten kann. Hier nochmal eine kleine Analogie, die es hoffentlich verdeutlicht und nicht erschwert.

Christian möchte Apfelkuchen machen, Gunnar kennt das Rezept. Also schreibt Gunnar das Rezept auf ein Blatt Papier. Das Papier ist das ROM: groß, speichert Informationen dauerhaft, aber auch langsam, wenn man zugreifen möchte. Christians Gehirn ist das RAM. Schnell im Zugriff, aber flüchtig. Nach einer Woche ist das Rezept weg, weswegen Christian bei jedem Kuchenbacken das Rezept nochmal lesen muss.

Fabian mag keinen Apfelkuchen, er bevorzugt Kirschkuchen. Wie kann er sich also Kirschkuchen ercheaten?

Methode Game Genie: Christian greift zum Rezept mit dem Apfelkuchen, aber kurz vorher klebt Fabian einen Zettel mit dem Wort Kirschen auf die Stelle, wo im Rezept das Wort Äpfel steht. Christian liest den Zettel, merkt nichts von der Manipulation und merkt sich das Rezept für den Kuchen mit dem Wort Kirschen. Dann legt er den Zettel weg und backt den Kuchen aus dem Gedächtnis mit den Kirschen.

Methode RAM-POKEs. Fabian lässt Christian den Zettel mit dem Rezept lesen. Christian merkt sich auch das Wort Äpfel. Dann legt er den Zettel weg und fängt an zu Backen - aus dem Gedächtnis. Dann kommt Fabian, pendelt vor Christians Gesicht mit einem Löffel und stoppt so die Abarbeitung. Dann flüstert Fabian Christian ins Ohr, dass das Wort Äpfel Kirschen meint und wenn Fabian mit dem Finger geschnippst hat, backt Christian den Kuchen weiter - denkt jetzt aber an Kirschen und legt diese auf den Teig.

7 „Gefällt mir“

Hmm, aber eine RAM-Analyse würde ja trotzdem helfen, weil man dadurch ja dann weiß, welche Instruktionen man verändern soll, um den gewünschten Effekt zu erzielen.

Ich war sehr überrascht zu hören, dass Codemasters angeblich auch nur beinahe zufällige Codes durchprobiert haben soll. Dass die Methode überhaupt funktionieren könnte, ist dann vielleicht einer besonderen Eigenschaft der CPU im NES, des 6502, zuzuschreiben. Weil sich dort besonders schnell auf die sogenannte “Zero Page”, den ersten 256 Bytes des Speichers, zugreifen ließ, kann ich mir gut vorstellen, dass Spieledaten, die besonders wichtig waren, relativ wahrscheinlich in diesem relativ kleinen Speicherbereich zusammengepfercht aufzufinden waren, und daher leichter “zufällig” zu treffen. (Wie diese Methode der Codefindung dann aber mit dem von dir beschriebenen, durchaus einleuchtendem Prinzip zusammenpasst verstehe ich wiederum weniger… die Instruktionen die die Zero-Page verändern können ja wiederum im ganzen ROM verteilt sein.)

Ob Codemasters allerdings tatsächlich so vorgegangen ist, oder ob das vielleicht nicht doch ein bisschen Marketing war, weil das Modul (anders als mein Action Replay) ja für Spiele ohne schon bekannte Codes sonst praktisch nutzlos erschien, und die In-House-Codes stattdessen mit ein bisschen professionelleren RE-Methoden entwickelt wurden, frage ich mich ja schon.

1 „Gefällt mir“

Das ist nicht genau überliefert, aber ich gehe auch davon aus, dass das Team Abkürzungen gefunden hat und nicht stumpf sämtliche Codes ausprobieren musste. Das wären allein bei den 8-stelligen Codes schließlich über 4 Milliarden pro Spiel. Sie haben aber andererseits auch nicht alle funktionierenden Kombinationen gefunden, sonst wären ja später durch Spieler und Redaktionen keine mehr entdeckt worden.

1 „Gefällt mir“

Bei mir wird die Folge in Overcast nicht angezeigt. Sind da schon Probleme und Lösungen bekannt?

Ich nutze ein IPhone, bin Unterstützer, App ist aktuell und auch schon neu gestartet worden.