Erstellt: 5. Juni 2013 (zuletzt geändert: 1. November 2021)

Ein kleiner „Crack“

Wie man eine Sicherheitsabfrage per „Crack“ entfernt

AD&D Pool of Radiance
AD&D Pool of Radiance

Da habe ich am Wochenende extra mein Advanced Dungeons & Dragons: Pool of Radiance von SSI rausgekramt und muss dann feststellen, dass ich in der Schachtel nur noch die Disketten finde. Die Handbücher sind wahrscheinlich irgendwo untergemüllt. Nach dem Start wurde ich dann ganz traurig 🙁 , da es eine Passwortabfrage gibt, aber ohne Codewheel wird das schwierig.
Ich möchte das Spiel aber unbedingt mal wieder einlegen, also was tun?
Ich könnte nun natürlich den einfachen Weg gehen und mir entsprechende D64-Images im Netz suchen oder nach einer Kopie des Codewheels Ausschau halten. Da wir aber eigentlich hier sind um, das Programmieren auf dem C64 zu erlernen und einem die Untersuchung von Programmen unter Windows, dank WinVICE, sehr einfach gemacht wird, dachte ich, wir versuchen selbst einmal die Passwortabfrage zu entfernen. Außerdem nervt die einen dann später beim Spielen auch nicht mehr 🙂 .

Vorbereitung

por_dsk01Zunächst habe ich mir mit dem Turbo Chameleon 64 ein D64-Image der ersten Diskette erzeugt. Wer die Schritte nachvollziehen möchte, findet ein abgespecktes Image dieser ersten Diskette hier:

Dort fehlen aber einige Dateien, das Image taugt also nur dazu, diesem Beitrag zu folgen, außerdem besteht das Spiel eh aus mehreren Disketten. Wer ein vollständiges Image oder das ganze Programm besitzt, kann natürlich auch damit „arbeiten“. Legt dann aber zur Sicherheit eine Kopie an, die ihr verwendet!

Los gehts…

Ihr solltet zur Sicherheit die „präzise Diskettenemulation“ unter VICE aktivieren. Anschließend legen wir das Image mit <ALT-8> in WinVICE ein und laden mit LOAD“*“,8 das erste Programm von der Diskette (dies nennt sich BOOT, dabei handelt es sich übrigens um ein BASIC-Programm). Sobald das Programm im Speicher gelandet ist, wird es mit RUN gestartet. Die dann erscheinende Frage DISABLE FASTLOADER (Y/N) beantwortet ihr mit Nein. Wer mag, kann den Turbo-Modus (ALT-W) von WinVICE aktivieren, dann wird das Titelbild bereits nach wenigen Sekunden angezeigt. Nach dem Titelbild sollte unter den Credits PLAY GAME auftauchen, sobald das Laden beendet ist. Wenn ihr dann PLAY GAME anwählt, erscheint die Passwortabfrage:

Die Passwortabfrage
Die Passwortabfrage

Um es uns noch einfacher zu machen, speichern wir den aktuellen Zustand von WinVICE als Snapshot. Wir können so auch mal etwas probieren und dann schnell wieder den alten Zustand herstellen, falls es nicht so klappt, wie wir uns das vorgestellt haben.

Snapshot erstellen
Snapshot erstellen

Sobald wir RETURN drücken und so eine falsche Eingabe provozieren, erscheint die Meldung WRONG !!! ganz unten. Nach wenigen Sekunden verschwindet diese wieder und wir bekommen einen zweiten Versuch. Geben wir erneut etwas Falsches ein, dann bleibt das WRONG !!! einfach stehen und wir müssen den Rechner neustarten.

Falsche Eingabe
Falsche Eingabe

Genau hier haben wir jetzt unseren Einstiegspunkt. Dank WinVICE können wir mit ALT-M den Monitor aufrufen und sehen dann im Disassembler, wo wir gerade stehen. Sollten nicht alle Fenster sichtbar sein aktiviert sie einfach.

Der VICE-Monitor
Der VICE-Monitor

Mach wir uns auf die Suche…

Werfen wir mal einen Blick ins Disassembly-Fenster:

PoolofRadiance_005

Wie ihr seht, stehen wir auf einer Endlosschleife. Der JMP $12F4-Befehl springt immer zu sich selbst. Es könnte sein, dass ihr nicht auf diesem Befehl landet, wenn z. B. gerade ein Interrupt aufgetreten ist. Um solche Stellen zu finden, empfehle ich euch daher ggf. den Monitor einfach drei, vier Mal aufzurufen, um zusehen, wo wir jeweils landen. Befinden wir uns mehrfach in der gleichen Code-Region, dann wird da wohl die aktuelle Schleife sein.
Hier ist nun die Endlosschleife für uns interessant.
Schaut ihr in die Zeile $12EC findet ihr einen bedingten Sprung, der evtl. zur Endlosschleife führt. Hier könnten wir jetzt z. B. für unendlich viele Versuche sorgen, indem wir die Endlosschleife so ändern, dass der Sprung nach $11DF, wie beim davor stehenden führt.

Dazu starten wir im Hauptfenster mit a 12f4 den Assembler und überschreiben dabei den JMP der Endlosschleife mit JMP $11DF. Um den Assembler zu beenden drückt einfach <ENTER> ohne einen Befehl einzugeben. Es ist zwar nicht unser vorrangiges Ziel unendlich viele Versuche zu bekommen, aber wir sollten es trotzdem machen, da wir z. Zt. in der Endlosschleife hängen. Im nächsten Bild seht ihr die Änderung nochmal.

Wenn wir dem Code weiter nach oben folgen finden wir ein RTS. Diese Funktion scheint daher wohl an Speicherstelle $12DF zu beginnen.

Versuchen wir doch mal unser Glück, ob wir einen direkten Sprungbefehl zu dieser Adresse finden. Dazu verwenden wir das Hauptfenster des Monitors. Ihr könnt den virtuellen C64-Speicher unter VICE mit dem „hunt“-Kommando durchsuchen. Leider liefert ein hunt 0 ffff df 12 (hunt <ab Adresse> <bis Adresse> <BYTE-1, BYTE2, BYTE.n> kein Ergebnis, denkt dran, dass Adressen als LSB/MSB im Speicher stehen!

'hunt' & assembler
‚hunt‘ & Assembler

Es scheint also weder einen direkten Sprung JMP $12DF noch ein indirekten Sprung mit JMP ($nnnn) zu geben, sonst hätten wir die BYTE-Kombination finden müssen. Vielleicht gibt es aber einen bedingten Sprung. Da bedingte Sprüngen sich in unmittelbarer Nähe zum Ziel befinden müssen (auf Grund der relativen Adressierung kann der Sprung max. -128 bis +127 BYTES entfernt sein), schauen wir mal ob wir etwas in der Art finden.

Und tatsächlich, wenige Zeilen über der Adresse $12DF finden wir einen solchen bedingten Sprung. Klickt diesen $12D9 einmal an, dann wird er wie auf dem Bild rot hervorgehoben. Dadurch haben wir einen Breakpoint gesetzt und WinVICE wird automatisch den Monitor öffnen, wenn die Adresse mit dem Breakpoint bei der Ausführung erreicht wird. In der blauen Zeile seht ihr die geänderte Endlosschleife, die nun auch zurück zur Eingabe springt.

Der bedingte Sprung (rot)
Der bedingte Sprung (rot)

Sobald ihr den Breakpoint gesetzt habt, könnt ihr das Haupt-Monitorfenster mit dem X schließen. Jetzt sollte das Programm wieder ganz normal laufen und wir können einen weiteren Code eingeben. Drückt einfach wieder <ENTER> und der Monitor sollte sich automatisch öffnen und im Disassembler seht ihr unseren bedingten Sprung von eben.

Schauen wir uns die Befehle davor jetzt mal an. Es wird eine Schleife über das Y-Register gebildet und dann etwas über die Y-nach-indizierte-Adressierung in den Akku geladen. Anschließend wird der Akku-Inhalt per Y-indizierter Adressierung mit dem Speicherinhalt ab $9700 verglichen. Wenn die Daten nicht gleich sind, dann springt das Programm zur Funktion von eben, die evtl. in einer Endlosschleife endet. Sind allerdings alle Werte gleich, dann läuft die Routine einfach zum RTS weiter. Wenn wir hier wirklich an der richtigen Stelle sind, dann sollte es reichen, in Zeile $12D2 ein RTS einzutragen.

Ein RTS an der richtigen Stelle hebelt die Passwortabfrage aus.
Ein RTS an der richtigen Stelle hebelt die Passwortabfrage aus.

Sobald ihr das RTS eingetragen habt, schließt den Montior wieder über das X und drückt erneut <ENTER>. Wie ihr seht, haben wir es geschafft, das Programm läuft weiter.

Es geht weiter...
Es geht weiter…

Falls ihr auch die dritte Disk habt, legt diese jetzt mal ein und ihr seht, dass wir es tatsächlich geschafft haben.

...das Hauptmenü erscheint.
…das Hauptmenü erscheint.

Die Diskette ändern

So, schön und gut, wir wissen jetzt, wo wir ansetzen müssen, um die Passwortabfrage zu umgehen, aber das möchten wir ja nicht jedes Mal machen. Daher öffnen wir jetzt das D64-Image mit einem Hex-Editor. Dort suchen wir nach der Byte-Kombination $A0 $06 $B1 $4C wie wir sie zu Beginn des letzten Disassembly (s. oben) vorfinden.

Die BYTE-Kombination wurde gefunden.
Die BYTE-Kombination wurde gefunden.

Wir haben Glück, die Byte-Kombination wurde genau 1x gefunden! Wäre sie mehrfach gefunden worden, dann hätten wir einfach weitere Bytes aus dem Source für die Suche verwendet. Wenn ihr die Bytes davor und danach mit dem Disassembly vergleicht, werdet ihr feststellen, dass diese auch identisch sind. Schaut noch mal etwas weiter nach oben, da seht ihr u. a. den uns bekannten Text WRONG !!!. Wir können also sehr sicher sein, dass das Programm auf der Disk nicht gepackt ist. Nun überschreiben wir das $A0 mit dem OpCode $60 = RTS. Wer möchte kann oben noch den Text INPUT THE… ändern. Übrigens findet ihr nach dem WRONG !!! die möglichen Lösungswörter für die Passwortabfrage, von BEWARE bis ZOMBIE. Speichert eure Änderung dann am Besten in einer neuen Datei und öffnet dieses neue D64-Image dann mit VICE.

Fertig! Jetzt braucht man nur noch RETURN zu drücken.
Fertig! Jetzt braucht man nur noch RETURN zu drücken.

Wir sind nun am Ziel! Wir können das Programm jetzt jederzeit laden und brauchen dann nur noch RETURN zu drücken.


Dies war ein sehr einfaches Beispiel. Wir hatten Glück, dass es einen so eindeutigen Einstiegspunkt gab und dass alles sehr dicht zusammen im Source stand. Auch der Umstand, dass die Daten auf der Disk nicht gepackt waren hat uns in die Hände gespielt. Als größte Erleichterung muss selbstverständlich WinVICE betrachtet werden. Wenn ihr das direkt am C64 machen müsst, ist es schon einiges aufwendiger. Eine große Hilfe sind dann die bekannten Cartridges z. B. Final Cartridge III.

So richtig schön wäre es natürlich, wenn die Abfrage überhaupt nicht mehr käme. Dies könnt ihr zur Übung aber mal selbst versuchen. Ihr müsst dazu herausfinden, wo die eigentliche Abfrageroutine liegt und von wo dahin gesprungen wird. Ein Ausgangspunkt kann z. B. das von uns eingefügte RTS oder der Beginn bei PLAY GAME sein.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (8 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


Wenn ihr euch z. B. vom "PLAY GAME" etwas durchhangelt, werdet ihr
sehen, dass die uns bekannte Adresse $11DF der Schlüssel zum Erfolg
ist. Durch eine kleine Änderung dort oder direkt beim Aufruf, 
überspringt ihr die komplette Passwortabfrage. 

Nicht vergessen "hunt" ist euer Freund. ;-)
Zurück

Ein Gedanke zu „Ein kleiner „Crack““

  1. Sehr gut nachzuvollziehen. Ich hätte nicht damit gerechnet, dass die Daten unkomprimiert auf der Disk liegen, so lässt sich der temporäre Hack natürlich sehr gut in die Datei übertragen. Hat auf Anhieb geklappt, danke!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Protected by WP Anti Spam