Step 9

Shared code

 

Bei manchen Spielen kann es passieren, dass sich die hacks nicht nur auf den Spieler auswirken, sondern auch auf alle Gegner.
Macht man sich also Unsterblich, dann können die Gegner auch nicht getötet werden.
Das liegt daran, dass sich beide Einheiten den selben Code teilen!
In diesem Step, werden wir einen Weg finden um dies zu umgehen :-)

Wir haben hier eine Art Mini Spiel. Es wurde so programmiert, dass wir auf normalem Wege nie gewinnen können.
Es besteht aus zwei Teams mit jeweils zwei Spielern und die Gegner haben dazu auch noch das 5fache an Energie wie wir.

Dann lasst uns beginnen :-)

 

 

Wir bekamen den Tipp, dass die Energie ein "Float" Wert ist...
daher stellen wir bei der Suche um auf "Float" und suchen nach dem Wert "100"
Wir finden 3 Adressen!

 

 

Um die Energie von "Player 1" herauszufinden, klicken wir einfach mal auf den Button "Attack" von "Player 1"

 

 

"Player 1" hat also die Adresse "001BBC1C"

 

 

Wir doppelklicken diese nach unten und benennen sie gleich "Player 1".
Nun einen Rechtsklick darauf und "Find out what writes to this address".

 

 

Das Debugger öffnet sich wie gewohnt!

 

 

Mit einem Klick auf "Attack" bei "Player 1"...

 

 

...erscheint im Debugger die Instruktion
"00427DA6 - 89 43 04 - mov [ebx+04],eax"
Wir markieren die Zeile und klicken rechts auf "Show disassembler"

 

 

Hier wieder einen Rechtsklick auf unseren Code und wählen
"Find out what addresses this instruction accesses"

 

 

Ein neues Fenster erscheint.
Dieses Fenster arbeitet wie unser gewohnter Debugger... mit dem Unterschied, dass er uns Adressen rausfiltert,
die die Instruktion "00427DA6 - 89 43 04 - mov [ebx+04],eax" verwendet.

Wir schalten zunächst unten um auf "Float", da wir ja Float Wert verwenden :-)

 

 

In der "Tutorial.exe" klicken wir bei jedem Spieler der Reihe nach auf den Button"Attack"

 

 

Nun erscheinen pro klick alle unsere Spieler in der Liste.
Mit einem Doppelklick auf eine Adresse werden diese in unserer Liste gespeichert.

 

 

Diese benennen wir gleich wieder um, damit wir uns besser zurecht finden :-)

 

 

Nun markieren wir alle 4 Adressen und wählen "Open dissect data with selected addresses"
oder markieren alle und drücken "STRG+D"

 

 

Wieder öffnet sich ein neues Fenster... das "Structure dissect" Fenster.
Hier können wir Gruppen von Adressen bilden und Gemeinsamkeiten herausfinden.
Momentan sind alle 4 Adressen (Energie von allen 4 Spielern) in "Group 1"
Zunächst werden wir eine neue Gruppe erstellen und diese umbenennen.

"Hinweis"
Wer hier aufgepasst hat, der wird merken, dass in dem Fenster nun die Adressen nicht mehr stimmen.
Alle Adressen haben einen Offset von "-4"
Dies ist kein Fehler

 

 

Dazu rechtsklicken wir oben links "Group 1" und wählen "Rename"
Wir nennen diese Gruppe "Player"

 

 

Als nächstes Erstellen wir eine neue Gruppe. Dazu klicken wir oben auf "File" und wählen "Add new group"
oder drücken einfach "STRG+G" und benennen die Gruppe "C. Player"

 

 

Nun sieht unser Fenster folgendermaßen aus.

Unsere 4 Adressen sind nun alle in der Gruppe "Player"
Diese müssen wir nun trennen... und zwar "Player 1 + Player 2" gehören in die Gruppe "Player"... was sie ja schon ist.
"C. Player 3 + C. Player 4" gehören in die Gruppe "C. Player"

Zur Übersicht hier nochmal alle Speicheradressen aller Spieler.

"Player 1 = 001BBC18"
"Player 2 = 04FBA030"
"C. Player 3 = 04FD23D0"
"C. Player 4 = 06AB0078"

Als wir die neue Gruppe erstellt haben wurde automatisch eine Adresse hinzugefügt... diese werden wir am Ende noch löschen!

 

 

Wir machen also einen rechtsklick auf die Adresse "04FD23D0" und wählen "Change Group"

 

 

...und wählen die Zielgruppe "C. Player".
Das selbe machen wir auch mit der Adresse "06AB0078"

 

 

Um die automatisch erstellte Adresse zu löschen, rechtsklicken wir darauf und wählen "Delete Address"

 

 

Unser Fenster sollte und muss nun so aussehen!

 

 

Wir klicken oben auf "Structures" und wählen "Define new structure" oder drücken einfach "STRG+N"
Wir bestätigen alle folgenden Fenster mit "OK" und "Yes"

 

 

Folgendes ist nun passiert.
Es wurden jetzt Gemeinsamkeiten bzw Unterschiede zwischen den Adressen gesucht.
Links sehen wir die Offsets.
Ein Offset von "04" wäre dementsprechend die Energy aller 4 Spieler.
Ein Offset von "15" wäre dagegen die Namen aller 4 Spieler.

Was uns jetzt aber interessiert, ist das "Offset 10"

Bei "Player 1 und Player 2" steht da eine "1" und
bei "C. Player 3 und C. Player 4" steht da eine "2"

Dies sind Teams... also Team 1 und Team 2.
Wir merken uns also den "Offset von 10" bzw lassen wir das Fenster geöffnet :-)

 

 

Wir machen also wieder einen rechtsklick auf "Player 1" aber wählen diesmal
"Find out what accesses this address" bzw drücken wir "F5"

 

 

Das Debuggerfenster öffnet sich wieder wie gewohnt.

 

 

In der "Tutorial.exe" bei "Player 1" wieder auf "Attack" klicken

 

 

Im Debugger erscheinen 5 Instruktionen.
Uns interessiert die 2. Zeile... daher markieren wir diese und klicken rechts auf "Show disassembler"

 

 

Im "Memory Viewer" springen wir direkt zu unserem Code.

 

 

Wir werden das Problem nun mit "Auto Assemble" umgehen... daher klicken wir oben auf "Tools"
und wählen "Auto Assemble" oder drücken "STRG+A"

 

 

Wir klicken oben auf "Template" und wählen "Cheat Table framework code".
Danach noch einmal "Template" und wählen "Code injection".
Geht schneller mit "STRG+ALT+T" und "STRG+I"

 

 

Wir haben nun folgendes Fenster.

In der Sektion "newmem" können wir unseren eigenen Code schreiben.
In der Sektion "originalcode" wird der ganz normale Code ausgeführt.
Der Code in "Zeile 12" ist eine umgekehrte Subtraktion, dies bewirkt, dass Energie abgezogen wird.
Wir erinnern uns aus dem "Dissect Structure" Fenster, dass die Energie im "Offset 04" gespeichert ist.

Alles was wir jetzt nun machen müssen, ist ein Vergleich der Gruppen zu starten,
der unterscheidet ob die Gruppe "Player" oder "C. Player" gemeint ist.
Wenn also die Gruppe "Player" gemeint ist, wird unser eigener Code ausgeführt...
und wenn die Gruppe "C. Player" gemeint ist, wird der "Originalcode" ausgeführt.

Setzen wir das nun in die Praxis um

 

 

In der Sektion "newmem" schreiben wir nun "cmp [ebx+10],1"
Dies vergleicht den Inhalt "EBX" mit dem "Offset 10" ob eine "1" drinsteht.
Wir erinnern uns aus dem "Dissect Structure" Fenster, dass die Teamnummer im "Offset 10" gespeichert ist.

 

 

In die nächste Zeile schreiben wir "jne originalcode".
Dies bewirkt, dass wenn in der "Zeile 11", beim Vergleich, keine "1" enthalten ist, dementsprechend also eine 2 für das Gegnerteam,
dass er dann zum Originalcode springt und dort den Code ausführt.

 

 

Wir kopieren nun noch den Originalcode und fügen diesen unter unserem Code in "Zeile 13 und 14" ein.
Dieser wird augeführt wenn beim Vergleich in der "Zeile 11" das Team "Player" enthalten ist.
Wir müssen die Zeile "fsubr dword ptr [ebx+04]" nur noch abändern, denn sonst passiert im Endeffekt gar nichts,
da ja der selbe Code ausgeführt wird.
Wir nehmen daher das Gegenteil von "fsubr" und schreiben "fadd dword ptr [ebx+04]".
Dies bewirkt also, dass wir das wo wir an Energie abgezogen bekommen einfach dazubekommen :-)
Am Ende noch "jmp exit" schreiben, damit das Programm weiß, dass hier Schluß ist.

 

 

Nun klicken wir oben auf "File" und wählen "Assign to current cheat table" und schließen das Fenster.

 

 

Unten haben wir nun unser Script eingefügt. Aktivieren tun wir es, wenn wir links das Häkchen anschalten.

 

 

Sobald es aktiviert wurde, sehen wir im "Memory Viewer", dass an der vorherigen Stelle nun ein
"JMP" zu "00110000" stattfindet... unserem "Code Cave".
Mit rechtsklick und dann "Follow" springen wir dort hin.

 

 

Hier sehen wir unseren Code.
Man kann an den Pfeilen auch gut erkennen wann gesprungen wird und was ausgeführt wird.
Unser Code sieht doch gut aus... jetzt müssen wir ihn nur noch testen :-)

 

 

Klicken wir nun mehrfach auf alle "Attack Buttons" bemerken wir, dass die Energie von "Player 1 + Player 2" pro klick steigt,
und die von "Player 3 + C. Player 4" sich pro klick verringert :-P
Genau so soll es auch sein... klicken wir nun den Button "Restart game and autoplay"
sollten wir theroretisch gesehen das Spiel gewinnen :-)

 

 

TADAAAAA!

Auch wenn wir nur durch mogeln gewonnen haben, haben wir trotzdem wieder was dazugelernt.

 

 

HERZLICHEN GLÜCKWUNSCH!

Nun haben wir das Tutorial erfolgreich gemeistert :-)
Nun heißt es üben, üben und immer weiter üben.
Am besten so lange, bis du die Tutorials ganz alleine meistern kannst ;-)

 

 

Zurück zur Übersicht