Magic Disk 64

home to index

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)