Ein kleiner ‚Crack‚

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

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 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 🙂 .

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

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‚.

 
Nun ‚legen‚ wir das Image mit <ALT-8> in WinVICE ein und laden mit  LOAD"*",8 das erste Programm von der Diskette („BOOT„, dabei handelt es sich übrigens um ein BASIC-Programm). Ihr solltet auch noch die „präzise Diskettenemulation„ aktivieren. Sobald das Programm geladen ist, wird es mit  RUN gestartet und die dann erscheinende Frage mit Nein beantwortet. 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. Wählt „PLAY GAME„ aus und die Passwortabfrage erscheint.

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
Snapshot

 

Wenn 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 ein zweites Mal 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

 

Also werfen wir 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 oder fünfmal 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, in dem 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 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 <RETURN> und der Monitor sollte sich automatisch öffnen und im Disassembler seht ihr wieder unseren bedingten Sprung.

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 <RETURN>. Wie ihr seht, haben wir es geschafft, das Programm läuft weiter.

Wie waren erfolgreich, das Spiel läuft.
Wie waren erfolgreich, das Spiel läuft.

 

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 jedesmal 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. Unser neuer Text sollte aber vor dem „WRONG !!!„ enden, da wir nicht wissen ob es evtl. noch für etwas Anderes benutzt wird. Speichert eure Änderung dann am Besten in einer neuen Datei und öffnet dieses neue D64-Image dann mit VICE.

Endlich geschafft, unser Crack funktioniert.
Endlich geschafft…

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 dass 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...


 

<<< zurück |

 

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

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


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

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

Protected by WP Anti Spam