Fortgeschrittene Trainer erstellen – Teil 1

Wer schon mal einen Trainer für ein Spiel erstellen wollte hat sicherlich nach ein paar Tutorials/Anleitungen gesucht und kaum etwas Gutes gefunden. Es gibt sicher einige Artikel die einem helfen einen einfachen Trainer zu erstellen, aber für fortgeschrittene Trainer gibt es kaum eine Hilfe.
Die Vorgehensweise für einfache Trainer lässt sich so zusammenfassen:

  • 1. Im Spiel eine Zahl bzw. Wert suchen und merken z.B. die Kugeln im Waffenmagazin.
  • 2. Mit einem Memory-Scanner diese Zahl solange suchen bis man die genaue Speicherstelle(n) gefunden hat
  • 3. Per Hardware-Breakpoint den Codeteil im Spiel finden der diesen Wert manipuliert
  • 4. Mit einem selbst-geschriebenen Programm diese Codestelle ausschalten

Das war es schon und fertig ist der „Unlimited Ammo“ oder „Unlimited Money“ Trainer. Diese Vorgehensweise ist nicht falsch, aber für einen Trainer mit mehr Optionen wird man da schnell verzweifeln, weil man einfach nicht weiß nach welchem Wert man scannen soll. Allein schon für die Gesundheitsanzeige kann das ganz schön schwierig sein, in vielen Spielen wird hier zwar der Wert 100 angesetzt, aber trotzdem ist es sehr schwer danach zu scannen, besonders wenn sich die Gesundheit wieder von alleine auflädt.

Strukturen

Um hier weiter zu kommen muss man eine andere Technik einsetzen. Man sucht nicht mehr nach einzelnen Werten sondern nach ganzen Blöcken von Werten sogenannter Strukturen (struct) bzw. Klassen (class). Das Prinzip das dahinter steckt ist schnell erklärt. Jeder Programmierer kennt es, man hat unterschiedliche Variablen die aber alle irgendwie zusammengehören und nun stellt sich die Frage wie modelliert man solche zusammengehörigen Werte am besten im Quellcode. Ein Java-Programmierer wird nicht überlegen und daraus einfach eine Klasse machen, ein C++-Programmierer wird vielleicht kurz überlegen ob er nun eine Klasse macht oder eine ganz normale Struktur dafür erstellt und ein C-Programmierer hat sowieso keine Wahl und wird wohl eine Struktur erstellen. Das Prinzip der Kapselung gibt es in allen höheren Programmiersprachen und es wird natürlich auch gerne genutzt von Spieleentwicklern. Im Falle eines einfachen Ego-Shooters würde man dann wohl eine Struktur/Klasse erstellen in der definiert ist welche Waffe, Wie viele Patronen in der Waffe, Wie viel Gesundheit aktuell und alles was man sonst noch so alles wissen sollte über den Spieler.  Je nachdem wie das Spiel programmiert ist können die für die Trainer Erstellung nützlichen Werte auf mehrere Strukturen aufgeteilt sein, was aber auch kein größeres Problem darstellt, weil man von einer Struktur in der Regel leicht auf eine andere schließen kann. Unser Ziel ist es also Speicheradressen von Strukturen zu finden und diese Strukturen dann genauer zu analysieren. Mit etwas Glück haben wir dann ein oder zwei Strukturen, die uns ermöglichen das Spiel nach unseren Wünschen zu modifizieren.

Tools

Natürlich braucht man auch Tools um möglichst bequem ein Spiel analysieren zu können, ich empfehle folgende Tools.

OllyDbg: Der beste 32-Bit Debugger läuft auch problemlos auf Windows 7 64-Bit. Empfehlenswerte Plugins sind Stealth64 (für 64-Bit OS), StrongOD (für 32-Bit OS), Mapimp und StollyStruct.

Cheat Engine: Ein sehr guter Memory-Scanner. Wer zum ersten Mal das Tool benutzt sollte den integrierten Tutorial mal machen. Ich werde hier bestimmt nicht erklären wie man das Teil bedient.

ReClass: Fast wichtiger als ein Memory-Scanner ist dieses tolle Programm. Es hilft uns unbekannte Strukturen zu erforschen. Wer zum ersten Mal damit arbeitet sollte sich unbedingt den Video Tutorial anschauen. Es ist etwas schwierig dafür einen Download zu finden, deshalb hab ich es hier mal hochgeladen: klick

CoD 7: BO

Als Beispiel hab ich mal das Spiel Call of Duty: Black Ops rausgesucht. Obwohl das Spiel brandneu ist basiert es im Kern immer noch auf der uralten Quake Engine. Die Engine ist mittlerweile Open-Source und dadurch hat man eine große Hilfe, da man im Quellcode z.B. nachschauen kann welche Strukturen es gibt. Trotzdem werde ich in diesem Fall so tun als ob es diese Hilfe nicht gibt. Ich werde hier nur den Single Player analysieren, aber man kann davon ausgehen das es im Multiplayer sehr ähnlich aussieht. Ich verwende die Retail Version ohne installierte Updates. Wer Updates installiert hat wird kaum Unterschiede haben, nur das die Speicheradressen eben etwas unterschiedlich sind. Um das Spiel bequem zu analysieren sollte man alle Grafikeinstellungen auf die niedrigste Stufe setzen, kleinste Auflösung und natürlich den Fenstermodus aktivieren.

Das Spiel lässt sich sehr gut mit Olly debuggen wenn man so vorgeht: Spiel starten und eine Mission starten, Olly starten und CoD7 Prozess attachen, danach sofort mit RUN das Spiel weiterlaufen lassen.

Aller Anfang ist… leicht

Es gibt in CoD7 zwei sehr tolle Wege zum Anfangen:

  1. 1. Der klassische Weg: Man benutzt einen Memory-Scanner und scannt nach den Kugeln im Waffenmagazin.
  2. 2. Man benutzt den Debugger und sucht nach verdächtigen Textstrings. Meist sind es Entwicklerkommentare  oder Fehlermeldungen die einem sehr viel über den Code an dieser Stelle verraten.

Bei Methode 1 sollten keine Probleme auftauchen, wer den Cheat Engine Tutorial gemacht hat kann das auf jeden Fall auch. Einfach die Codestelle finden die bei jedem Schuss die Kugeln herunterzählt. Die Stelle ist bei mir bei Speicheradresse (Virtual Address = VA) 0062D7F8 und sieht so aus:

DEC EDX
AND EDX,ECX
MOV DWORD PTR DS:[EAX+4],EDX
POP EDI

Diese Funktion von diesem Codeteil beginnt bei 0062D7A0 und wird bei jedem Schuss 2-mal aufgerufen. Wer ein paar Mal mit unterschiedlichen Waffen schießt und sich die Register und Stack anschaut wird schnell herausfinden, dass diese Funktion 3 Parameter hat:

function_62D7A0(int playerWeaponStruct, int weaponClassIndex, int howManyBullets)

2-mal wird sie aufgrufen und 2-mal wird ein unterschiedlicher Strukturpointer übergeben. Mit ein bisschen ausprobieren kriegt man schnell raus das es nur einen „Master“ gibt auf den es ankommt bei mir ist es die Struktur die beim 2. Aufruf übergeben wird 01BDB418.

Die Funktion hat aber noch mehr interessante Details, wer lange genug durch ausprobieren (schießen mit unterschiedlichen Waffen) die Funktion durchsteppt wird merken das die 2 letzten CALLs am interessantesten sind. Der CALL 00534DF0 beinhaltet nur 2 Maschinenbefehle, der 2. Maschinenbefehl beinhaltet eine sehr interessante Adresse. Nämlich eine Adresse die zu einer Art Tabelle führt die alle Waffen Strukturen, die es im Singleplayer gibt, beinhaltet. Bei mir liegt die Adresse bei BBC6E8. Hier kommt auch der 2. Parameter der Funktion ins Spiel. Ich habe den Parameter weaponClassIndex genannt, weil er genau dafür da ist. Nehmen wir an wir schießen mit einer SPAS Dragon‘s Breath, dann wird der Index 23 (0x17) übergeben, dieser CALL liefert dann den 23-te Strukturpointer zurück. Der Index 0 steht übrigens für „Keine Waffe in der Hand“. Schauen wir noch kurz den 2. interessanten CALL an, den dieser liefert den richtigen Pointer zu unserem Magazin zurück. Es wird in der Waffenklasse geschaut welcher Magazin Typ unsere Waffe hat, danach wird in der playerWeaponStruct dieser Typ gesucht und wenn gefunden der Zeiger auf diesen Wert zurückgeliefert. Hört sich vielleicht alles noch sehr unverständlich an, aber dafür haben wir jetzt ReClass. Wir haben schon 2 Strukturen gefunden die wir uns in ReClass genauer anschauen können nämlich 01BDB418 und BBC6E8.

ReClass

Zunächst mal die Waffenklassen in ReClass, bei mir sieht es so aus:

Das alles sind Pointer zu der eigentlich Waffenklasse, das kann man in ReClass super darstellen. Jetzt beginnt das rumprobieren und testen um rauszufinden was die einzelnen Variablen in einer Waffenklasse bedeuten. Ich nehme wieder die SPAS DB als Beispiel. Die hat den Index 23 also ist die Klasse bei E418E0. Die Magazingröße kann man schnell entdecken und auch den MagazinTyp wissen wir schon. Wer sich mehrere Klassen anschaut wird auch schnell die Variable für die maximal tragbare Munition finden. In diesen Waffenklassen sollten wirklich alle Informationen über eine Waffe drin stehen, also auch Rückstoß, Feuerrate, Schaden kann man mit ausprobieren und vergleichen leicht finden. SPAS-12 und SPAS DB eignen sich besonders gut als Vergleichsobjekte. Die SPAS DB ist die stärkste Waffe im Singleplayer, irgendwo ist also ein Wert der das definiert. Durch den direkten Vergleich mit der normalen SPAS lassen sich schnell die entscheidenden Werte finden. Die einzelnen Werte kann man leicht mit CheatEngine manipulieren und dann testen, wie wäre es z.B. mit einer FAL und 200er Magazin?

Kein Problem, die Waffe verhält sich nun so als ob sie wirklich standardmäßig ein 200er Magazin hat. Man kann sich also toll die Waffen modden wie es einem gefällt.

to be continued…

Schreibe einen Kommentar

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