Spiele knacken - mit Freezern 0 Problem
So ein Freezer ist wirklich eine feine
Sache. Auf Knopfdruck killt er die
Spritekollisionen oder verschafft uns
unendliche Leben. Was machen wir aber, wenn diese Funktionen versagen oder wir
etwas Spezielleres benötigen? Dann
kramen wir unsere Assemblerbücher hervor
und erledigen die Sache per Hand.
Wie so etwas gemacht wird, zeigt der
folgende Text:
Wir bearbeiten Manfred Trenz' Meisterwerk namens " Turrican II" mit dem Action
Replay 6( Natürlich sind alle Schritte
locker auf einen anderen Freezer übertragbar) . Zuerst laden wir das Spiel
ein. Wie beginnen wir nun, wenn wir zum
Beispiel die Lebensanzahl ändern wollen?
64 kB einzeln durchzusehen, ist gewiß
nicht die günstigste Variante. Nutzen wir deshalb die Schwäche jedes Spieles
aus: die Bildschirmanzeige. Denn durch
sie können wir leicht die ganze Sache
zurückverfolgen.
Betrachten wir dazu den Bildschirmaufbau: im oberen Teil herrscht die
große Action, und im unteren Bereich
können wir die aktuellen Spielstandswerte ablesen. Dort finden wir auch die
Lebensanzahl, der es jetzt ja an den
Kragen gehen soll. Drücken wir doch
einfach mal den Freezerknopf und schauen
uns mit " F7" das Bild an. Huch!
Wir erkennen nur einen Teil ordentlich!
Das liegt an der Umschaltung durch den
Rasterstrahl und soll uns nicht weiter
kümmern. Das einzige Problem dabei: wir
müssen jetzt solange zwischen Spiel und
Freezer wechseln, bis wir den unteren
Teil erwischt haben. Ist das dann
gemeistert, wird es ernst. Wir springen
mit " T" in den Texteditor und bewegen den Cursor ein bißchen hoch, ein bißchen
nach unten, oder mal nach rechts und
links. Was stellen unsere geschulten
Augen dabei fest?
Die Positionstionsangaben des Texteditors sind höchst unleserlich. Eigentlich auch logisch, da ein anderer Zeichensatz verwendet wird. So kommen wir
also erst einmal nicht weiter. Wir
machen einen Abstecher in den Sprite-Editor (" V") . Er verrät uns, daß Bank
Numero 3 eingeschalten ist. Bekanntlich
ist der C64 in vier Banken von 0 bis 3 eingeteilt. Bank 3 wurde desweiteren ein
Originalzeichensatz spendiert. Da wir
uns schon in diesem Bereich befinden, nutzen wir diese Spende natürlich schamlos aus: Wir verlassen flugs mit " Q" den
Editor und stürzen uns mit " M" in den
Monitor.
Wie wir in der Anleitung unseres Freezer
hoffentlich gelesen haben, zeigt der" IO"- Befehl die aktuellen VIC-Werte. Was
steht da in $ D018, dem Zeichensatzregister? Eine $11, die wir auf schnellstem Wege in den Wert $15 wandeln, damit
wir den begehrten Originalzeichensatz
erhalten. Ein erneuter Blick in den
Texteditor läßt uns hoffen: die Positionsangaben sind zur Hälfte leserlich.
Warum nur zur Hälfte? Ganz klar, das
Problem ist 100%- ig ein verschobener
Bildschirm. Doch wir beherrschen ja den
" IO"- Befehl und entlasten so Adresse
$ D011( setzen sie auf $00) . Nun schalten
wir hurtig in den Texteditor. Wir fahren
auf die Stelle, wo der Einer der Lebensanzahl steht ( wir waren doch so klug und
haben sie im Originalbild mit einem
Buchstaben markiert, nicht wahr?) . Unten
lesen wir ab:$0776 . Werfen wir doch mal
einen Blick in den Monitor, ob es da
eine Verbindung gibt. Der Befehl
" H0000 FFFF7607"( Suche von $0000 bis
$ FFFF nach $76+$07) bringt es ans Licht.
Es erscheint $4 B95 . Was mag wohl in ihr Geheimnisvolles darin gespeichert sein?
Wir disassemblieren den Bereich mit
D4 B94( nicht mit D4 B95, da ja immer ein
Befehl vor einer Adresse steht) . Aha:
STA $0776 erscheint. Scrollen wir weiter
hinunter, gesellen sich noch ein ADC
#$0 A, ein STA $079 E und ein RTS hinzu.
Letztere Befehle dienen allein der
Darstellung der übergroßen Zahl und
haben mit dem Inhalt der Lebensmenge
nichts mehr am Hut. Nunja, stellen wir
ersteinmal das STA $0776 ruhig, indem
wir ein LDA $0776 draus machen. Nun
nehmen wir wieder den Joystick in die
Hand und zerstören mutwillig einige
Leben unseres Helden. Unser Unternehmen
scheint geglückt zu sein: die Lebenszahl
bleibt gleich . . .
Schreck! Ein " Continue Yes/ No" erscheint
( wir wählen natürlich " Yes") . Was haben
wir falsch gemacht? Nun, wir haben
lediglich die Bildschirmausgabe unter- drückt und mehr noch nicht. Also listen
wir erneut Adresse $4 B94( schärfen sie
wieder mit einem STA) und scrollen diesmal hinauf, immer auf der Suche nach
einem Verringerungsbefehl wie DEC, SBC
u. ä. . Bei $4 B67 werden wir fündig:
SBC #$01, darüber ein LDA $ FFFC. Begutachten wir mit MFFFC den Inhalt dieser
Adresse. Schön, er entspricht unserer
Lebensanzahl. Verändern wir ihn einfach
mal. Zurück im Spiel scheint sich nichts
getan zu haben; unsere alte Lebenshanzahl steht noch wacker da. Argh!
Vor Wut stürzen wir uns in den Abgrund
( im Spiel natürlich)- und siehe da! Wir
haben ganze Arbeit geleistet, Wir
erinnern uns an das SBC #$01 zurück und
ersetzen es durch ein SBC #$00 . Nun
werden wir kein Leben mehr flöten hören!
Widmen wir uns jetzt der Energie. Durch
die gleiche Prozedur wie bei der Lebensanzahl erhalten wir die Bildschirmadresse $0768( gemessen am Anfang des Energiebalkens) . Suchen wir den Speicher
nach ihr durch ( H0000 FFFF6807), werden
uns diesmal mehrere Werte geliefert. Wir
disassemblieren jede der Adressen
( D4 C0 C, D4 C15 usw.) und erhalten einen
STA, zwei LDAs, einen INC und einen DEC
$0768, X. In Frage für eine Manipulation
kommen nur die Speicherstellen $4 C0 C
( STA) und $4 C52( DEC), da allein sie die
Adresse $0768 verringern ( können) .
Probieren wir es zuerst mit dem DEC-Befehl bei $4 C52 aus ( DEC wird in
solchen Fällen häufiger eingesetzt; STA
ist jedoch flexibler { Energieerhöhung
z. B.}) . Wir wandeln ihn in einen LDA
$0768, X. Zurück im Spiel probieren wir
durch Dauerbelastung unseres Heldens
aus, ob vielleicht wieder nur die Bildschirmausgabe unterdrückt ist . . .
Nein, diesmal klappts! Also können wir
uns getrost der Zeit zuwenden. Als Bildschirmadresse bekommen wir $07 A4 . Ein
Durchsuchen ( H0000 FFFFA407) bringt Adresse 4 BFA ans Licht. Wir disassemblieren sie ( D4 BF9) und scrollen ein
Stückchen nach oben. Wir können ein LDA
$080 F, X und ein ADC #$ A2 lesen. Ins
Deutsche übersetzt, bedeutet das: der
Inhalt aus der Zelle ($080 F+ Wert des
X-Register) wird mit $ A2 addiert ( und in
$07 A4 plus dem Y-Register abgelegt.)
Puh! Falls man das einigermaßen verstanden hat, merkt man, daß Adresse $080 F
die Quelle des Übels ist. Flugs durchsuchen wir den Speicher nach $080 F
( H0000 FFFF0 F08) und erhalten mehrere
Adressen. Schauen wir sie uns kurz an.
In D0 C0 D strahlt uns ein gefährlicher
DEC-Befehl entgegen. Schnell ersetzen
wir ihn durch ein harmloses LDA. Der
Test gibt uns recht: das Unternehmen ist
geglückt. Von nun an können wir unseren
Helden beliebig lang nach Geheimräumen
u. ä. suchen lassen.
Die Sache mit den Continues sollte jeder nun selbst knacken können. Hier die
Kurzform: Die Bildschirmadresse lautet
$0778 . Die Speicherdurchsuchung läßt ein
4 BE7 erscheinen. Durch ein Hochscrollen
entlarven wir die Quelle $ DBFF. Wir
suchen nach ihr ( H0000 FFFFFFDB) und
disassemblieren alle erschienen Adressen
und stoßen bei $4 F6 b auf einen DEC-Befehl. Diesen wandeln wir wie immer
in einen LDA um.
Bei den SPACE-Tasten- Waffen wollen
( müssen) wir andere Wege gehen. Hierzu
ist mehr Theorie erforderlich. Zuerst
müssen wir wissen, wie man die SPACE-Taste abfragen kann: Da ist z. B. Adresse
$ DC01, in der auch Joystickport Nr.1 seine Werte abspeichert. Durchsuchen wir
den Speicher nach ihr. Wir bekommen
einige Adressen geliefert; zu viele, würde ich meinen. Deshalb gehen wir
anders an das Problem heran: Auf welche
Weise fragt man die SPACE-Taste
überhaupt ab? Im Basic checkt man meistens nach 239 . In Assembler kümmert
man sich eher um die einzelnen Bits. Bis
auf Bit 4 sind alle gesetzt (%11101111=239=$ EF) . Bit 4 hat den Wert $10 . Die
Wahrscheinlichkeit ist groß, daß der
Programmierer die Abfrage deswegen so
gestaltet hat: LDA $ DC01 AND #$10 . . .
Wenn wir nun den Speicher nach dieser
Möglichkeit durchsuchen wollen, müssen
wir irgendwie die hexadezimalen Wert
kennen. Entweder wir schauen in ein
kluges Buch oder wir nutzen einen
genialen Trick ( schon deshalb ist dieser
Artikel lesenswert) und geben Mxxxx ein
( xxxx = beliebige vierstellige Zahl) .
Nun schalten wir den Assembler mit
" A"+" der Zahl von vorhin"+" dem LDA $ DC01 ein" . Ein Beispiel gefällig?
Nehmen wir für " xxxx"$5000 . Also tippen
wir M5000, eine Zeile " Zahlen" erscheint. Nun geben wir A5000 LDA $ DC01 ein. Daraufhin tippen wir noch AND #$10 .
Wir erhalten die Hexzahlen
AD,01, DC,29,10 . Wir bewegen den Cursor
nun auf die Stelle, an der die Reihe von
dem Mxxxx-Befehl steht und drücken
Return. Damit erhalten wir den Originalzustand. Puh!
Jetzt checken wir den Speicher nach den
gefundenen Hexwerten:
H0000 FFFFAD01 DC2910 . Wir bekommen zwar
wieder mehrere Adressen serviert, aber
lange noch nicht zu viele wie vorhin.
Wir testen die Adresse $119 B, indem wir
das LDA $ DC01 durch ein LDA #$00 NOP
ersetzen. Zurück im Spiel scheint sich
nichts getan zu haben: die SPACE-Taste
funktioniert noch einwandfrei. Also
schreiben wir den Originalwert in $119 B
zurück und wenden uns der zweiten
Adresse,$2 F9 D, zu. Erneut ändern wir
ein LDA #$00 NOP daraus. Dann schalten
wir zum Spiel.
Schreck! Unsere Manipulation simuliert einen Dauerdruck der SPACE-Taste! Wir
setzen darum die Adresse $2 F9 D auf ihren
Originalwert zurück und scrollen etwas
weiter nach unten. Da fällt plötzlich
ein JSR $4 BA9 ins Licht der Manipulationen. Hatten wir nicht fast die ganze
Zeit im $4000 Bereich ' rumgefuscht? Wir
listen also ein Stück von $4 BA9 . Häufig
sehen wir die Adresse $0737 . Wahrscheinlich steht dort irgenwo die Strahlenzahl drin. Außerdem stört uns ein SBC
#$01, das wir schnellstens entschärfen.
Nun hat die Simulation des " DauerSPACE" s
aber alle unsere Strahlen verbraucht . . .
Kurzum, wir müssen diesmal noch die
Anzahl hochsetzen. Wir erinnern uns:
nach dem häufigen Wert $0737 stand ein
", X"($0737, X) . Für X können Werte von
$00 bis $ FF stehen. Deshalb ist es
durchaus möglich, daß wir erst bei $0826 fündig werden. Glücklicherweise steht
die Strahlenanzahl aber schon bei $0738 .
Die nachfolgende Zahl ($0739) beinhaltet die Superweapon.
Wir manipulierten: Setzten, auf Wertadr.
Bemerkungen
Leben: $4B68 ,$00 $FFFC (Poke) 19304 , 00 Energie: $4C52 ,$BD $0768 (Poke) 19538 ,189 Zeit: $0C0D ,$AD $080F (Poke) 3058 ,173 Continue: $4F6B ,$AD $DBFF Wertadresse (Poke) 20331 ,173 nicht ohne Weiteres zu ändern Weapon: $4BB2 ,$00 $0738 (Poke) 19378 , 00
Super-Weapon:$430 D ,$2 C $0739( Poke)17165,44
Einige Schmankerle noch zum Schluß:
Nextlevel: G( O)5469
Waffe:$0702 den JMP-Befehl verändern:
Grün:$35 CF ( Stärke in $07 EF)
Rot :$3182( Stärke in $07 EE)
Lila:$4493
(cj/wk)