Magic Disk 64

home to index to html: MD9504-KURSE-SPIELE_KNACKEN.html
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'  Meister-
werk namens "Turrican II" mit dem Action
Replay 6 (Natürlich sind  alle  Schritte
locker auf einen anderen  Freezer  über-
tragbar). Zuerst  laden  wir  das  Spiel
ein. Wie beginnen wir nun, wenn wir  zum
Beispiel die Lebensanzahl ändern wollen?
64kB  einzeln  durchzusehen,  ist  gewiß
nicht die  günstigste  Variante.  Nutzen
wir deshalb die Schwäche  jedes  Spieles
aus: die Bild- schirmanzeige. Denn durch
sie können wir leicht  die  ganze  Sache
zurückverfolgen.                        
Betrachten  wir  dazu  den   Bildschirm-
aufbau:  im  oberen  Teil  herrscht  die
große Action,  und  im  unteren  Bereich
können wir  die  aktuellen  Spielstands-
werte 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   Text-
editors sind höchst unleserlich. Eigent-
lich auch logisch, da ein  anderer  Zei-
chensatz 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 scham-
los 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  Zeichensatz-
register? Eine $11, die wir auf schnell-
stem Wege in den Wert $15 wandeln, damit
wir  den  begehrten  Originalzeichensatz
erhalten.  Ein  erneuter  Blick  in  den
Texteditor läßt uns  hoffen:  die  Posi-
tionsangaben 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 Lebens-
anzahl 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
"H0000FFFF7607"  (Suche  von  $0000  bis
$FFFF nach $76+$07) bringt es ans Licht.
Es erscheint $4B95. Was mag wohl in  ihr
Geheimnisvolles darin gespeichert sein? 
Wir  disassemblieren  den  Bereich   mit
D4B94 (nicht mit D4B95, da ja immer  ein
Befehl vor einer  Adresse  steht).  Aha:
STA $0776 erscheint. Scrollen wir weiter
hinunter, gesellen  sich  noch  ein  ADC
#$0A, ein STA $079E 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 $4B94  (schärfen  sie
wieder mit einem STA) und scrollen dies-
mal hinauf, immer  auf  der  Suche  nach
einem Verringerungsbefehl wie  DEC,  SBC
u.ä..  Bei  $4B67  werden  wir   fündig:
SBC #$01, darüber ein LDA $FFFC.  Begut-
achten 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  Lebenshan-
zahl 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 Lebens-
anzahl  erhalten  wir  die   Bildschirm-
adresse $0768 (gemessen  am  Anfang  des
Energiebalkens). Suchen wir den Speicher
nach ihr durch  (H0000FFFF6807),  werden
uns diesmal mehrere Werte geliefert. Wir
disassemblieren   jede   der    Adressen
(D4C0C, D4C15 usw.) und  erhalten  einen
STA,zwei LDAs,einen INC  und  einen  DEC
$0768,X. In Frage für eine  Manipulation
kommen  nur  die  Speicherstellen  $4C0C
(STA) und $4C52 (DEC), da allein sie die
Adresse $0768 verringern (können).      
Probieren wir es  zuerst  mit  dem  DEC-
Befehl  bei  $4C52  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  Bild-
schirmausgabe   unterdrückt   ist    ...
Nein, diesmal klappts! Also  können  wir
uns getrost der Zeit zuwenden. Als Bild-
schirmadresse bekommen  wir  $07A4.  Ein
Durchsuchen    (H0000FFFFA407)    bringt
Adresse 4BFA ans Licht.  Wir  disassemb-
lieren  sie  (D4BF9)  und  scrollen  ein
Stückchen nach oben. Wir können ein  LDA
$080F,X und  ein  ADC  #$A2  lesen.  Ins
Deutsche übersetzt,  bedeutet  das:  der
Inhalt aus  der  Zelle  ($080F+Wert  des
X-Register) wird mit $A2 addiert (und in
$07A4 plus dem Y-Register abgelegt.)    
Puh! Falls man das einigermaßen verstan-
den hat, merkt man,  daß  Adresse  $080F
die Quelle des Übels ist.  Flugs  durch-
suchen  wir  den  Speicher  nach   $080F
(H0000FFFF0F08)  und  erhalten   mehrere
Adressen. Schauen wir sie uns  kurz  an.
In D0C0D 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
4BE7 erscheinen. Durch ein  Hochscrollen
entlarven  wir  die  Quelle  $DBFF.  Wir
suchen  nach  ihr  (H0000FFFFFFDB)   und
disassemblieren alle erschienen Adressen
und stoßen  bei  $4F6b  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"   er-
scheint. 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 Original-
zustand. Puh!                           
Jetzt checken wir den Speicher nach  den
gefundenen                    Hexwerten:
H0000FFFFAD01DC2910. Wir  bekommen  zwar
wieder mehrere Adressen  serviert,  aber
lange noch nicht zu  viele  wie  vorhin.
Wir testen die Adresse $119B, 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  $119B
zurück  und  wenden  uns   der   zweiten
Adresse, $2F9D, 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 $2F9D auf ihren
Originalwert zurück und  scrollen  etwas
weiter nach unten.  Da  fällt  plötzlich
ein JSR $4BA9 ins Licht der Manipulatio-
nen. Hatten wir  nicht  fast  die  ganze
Zeit im $4000 Bereich 'rumgefuscht?  Wir
listen also ein Stück von $4BA9.  Häufig
sehen wir die Adresse $0737. Wahrschein-
lich steht dort  irgenwo  die  Strahlen-
zahl 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: $430D ,$2C  $0739         
       (Poke) 17165 , 44                
Einige Schmankerle noch zum Schluß:     
Nextlevel: G(O) 5469                    
Waffe: $0702 den JMP-Befehl verändern:  
Grün: $35CF (Stärke in $07EF)           
Rot : $3182 (Stärke in $07EE)           
Lila: $4493                             
                                 (cj/wk)



Valid HTML 4.0 Transitional Valid CSS!