Windows Programm CheatEngine


Windows Programm: CheatEngine

CheatEngine ist ein mächtiges Programm, mit dem der Hauptspeicher eines Computers verändert werden kann.
Es kann sehr hilfreich sein, wenn man denn CHEATEN möchte, um z.B. "Programmfehler" zu umgehen..

Neben der Suche nach veränderten Speicherzellen(z.B. Lebensenergie in einem Spiel) unterstützt CheatEngine auch bei der sogenannten Code-Injection. Also eingeschmuggeltem Codeschnipseln, die den ursprünglichen Programmcode ersetzen.
Findet man z.B. den Code für verringern der Lebensenergie, könnte man den Programmteil einfach löschen, woraufhin nie wieder Lebensenergie abgezogen werden kann..

Hinweis

Wie bei allen aus dem Internet geladenen Dateien sollte auf die *korrekte* Quelle geachtet werden.

CheatEngine ist OpenSource, damit gilt dieses Programm als Freeware.
CheatEngine gibt es als 64bit Version für Windows7+ (auch noch als 32bit Version).

Installation

Downloadbereich Entwickler-Seite Wiki

Konfiguration

CheatEngine benötigt eigentlich keine weiteren Konfigurationen.

Anwendungsbeispiel (Planets Edge DOS Version)

Hier wird es am Beispiel des DOS-Spiels Planets Edge (@abadonnia) beschrieben.
Hinweis zu den bei PE veränderten Dateien:
/PE/GIFNOC ändert sich nach dem ersten Start(bestimmt die Anzeige der "Commander"-Infobox)
/PE/MAP.CC wird vermutlich beim SAVE Vorgang mitüberschrieben..
/PE/??.sav Spielstand, muss aktiv gespeichert werden, KEIN Autosave..

Die Vorgehensweise ist fast immer die gleiche:
ZUERST CheatEngine starten, dann erst das zu verändernde Spiel selbst. Somit ist die Prozessauswahl später einfacher..
[Bild verschwunden!]
1.) Prozessauswahlfenster öffnen, das entsprechende Icon ist auch schon rot umrandet.
2.) In dem Fenster das Spiel auswählen. Bei Steamprogrammen kann das fummelig werden, da die Spiele manchmal .. "Steam" heissen..
    Spiele, die in der DOS-Box laufen heissen dann(wie hier bereits ausgewählt) DOSBox.exe.
3.) Ein bestätigender Klick auf Open schliesst die Auswahl dann ab.

Hinweis:
CheatEngine sucht nach Zahlenwerten oder auch nach Strings(Wörter,Zeichenketten).
Bei den Zahlenwerten gibt es ein Problem, nie weiss man, in welchem Format die Zahlen gespeichert werden.
Für Windows XP,7,8..++ passen meist die Voreinstellungen(4 Bytes).
DOS-Spiele verwenden häufig das platzsparendere WORD (2 Bytes, 0-65535).
Einige Spiele nutzen aber FLOAT(Fließkommawerte), da wird man die Zahlen mit einer Suche nach "4 Bytes" nichts finden!
Ganz wenige Spiele verschleiern sogar die Werte, z.B. werden 100 Goldstücke als.. 10000 (x100) im Speicher abgelegt..

Vorsicht!
Die Adressen, die man bei den folgenden Suchen findet sind meist NICHT statisch, das bedeutet:
Teile des Speichers können durch folgende Aktionen verschoben werden:
* Laden von Spielständen
* Erstellen von Einheiten
* Gründen von Städten
* Spielen auf anderem Computer!
* Neustart des Spieles
Hatte man z.B. die Speicherposition von "GOLD" gefunden und füllt die bei einem neuen Spiel mal eben mit 1000 ..
..sitzt man sehr schnell vor einem "abgestürzten" PC..

Zuerst versucht man, bereits bekannte Zahlenwerte im Speicher zu finden.
Der LAGERBESTAND auf dem Mond ist die erste Anlaufstelle..
Die Lagerbestände werden zufällig vergeben, können also abweichen!
[Bild verschwunden!]
Das Zeug im ersten "Slot" sieht aus wie Tabakblätter, es handelt sich aber um "Biomasse".
In diesem Beispiel sind 20 Einheiten davon vorhanden.


[Bild verschwunden!]
1.) Zuerst muss das Zahlenformat von "4 Bytes" auf "2 Bytes" geändert werden (DOS-Spiel!)
2.) Der Wert, nach dem gesucht wird ist 20(die Anzahl des ersten "Slots", sieht aus wie Tabakblätter)
3.) First Scan startet eine NEUE Suche im Speicher.


Verdammt! Mehr 4048 Speicherstellen, die beim Scanvorgang eine 20 enthalten, zu viel zum Ausprobieren..
Für das Spiel Planets Edge gilt:
  Wenn man den Menüpunkt "Lager" auswählt kann man Fracht zwischen einem Raumschiff und dem Lager der Mondbasis verschieben.
  Durch Drücken von +/- bzw. LMB/RMB wird eine Einheit verschoben.
Eine Einheit "Biomasse" auf das Schiff transferieren, damit verbleiben nur 19 Einheiten im Lager auf dem Mond.
Der nächste zu suchende Wert lautet also 19.
[Bild verschwunden!]
1.) Den Wert auf 19 ändern
2.) Next Scan klicken


Erwartet wurde genau EINE Speicherstelle, die sich von 20 auf 19 hätte ändern sollen..
Nun sind es halt 4; rot angezeigte Speicherstellen sind NICHT die gesuchten, da diese sich verändern..
[Bild verschwunden!]
Die vier Speicherstellen der Liste unten hinzufügen:
1.) Doppelklickt man auf die Einträge, werden sie einzeln in die untere Liste übertragen
     Sammelauswahl: linke Maustaste gedrückt halten um einen Rahmen um die Speicherstellen ziehen
2.) Das Pfeil-Icon überträgt alle markierten Einträge in die untere Liste
3.) Das Löschicon löscht ALLES in der unteren Liste, wirklich ALLES!


So würde die Liste im unteren Bereich dann aussehen..
[Bild verschwunden!]
1.) Aktivieren(Freezen, gefährlich!)
2.) Doppelklick ändert die Beschreibung
3.) Doppelklick ändert die Speicheradresse, Beschreibung, Datentyp und Inhalt
4.) Doppelklick ändert den Datentyp(Byte, 2 Bytes, 4 Bytes, .. String)
5.) Doppelklick ändert den Inhalt der Speicherstellen


Eine Wiederholung der Verlagerung von Biomasse führt auch nicht zu einem eindeutigen Ergebnis..
Bei so wenigen Speicherstellen lohnt sich die brutale Methode..
[Bild verschwunden!]
Man schreibt also die Werte 10,11,12 und 13 in die vier verbliebenen Speicherstellen..


..und schaut im Spiel nach, welche Auswirkungen das auf das Lager hatte..
Manchmal muss man erst das Lager erneut aufrufen, damit die Änderungen sichtbar werden..
[Bild verschwunden!]
Hurra, die "Biomasse" hat einen geänderten Füllstand von 11, also war "08404A62" dafür zuständig.


Die "korrekte" Speicherstelle umbenennen, z.B. in Lager: Biomasse
Zusätzlich die anderen (falschen) Einträge löschen.
[Bild verschwunden!]
Meist kann man davon ausgehen, das alle "eingelagerten" Gegenstände in Folge hintereinander gespeichert werden.


Markiert man den Eintrag Lager: Biomasse und drückt STRG+B erscheint der Memory Viewer:
[Bild verschwunden!]
Die oberen Angaben sind erst mal uninteressant, denn.. CheatEngine versucht in den Lagerwerten.. Maschinencode zu lesen :D
Der untere Bereich(hexadezimal codiert!!) enthält tatsächlich die Menge der eingelagerten Waren..
0B 00 sind 11 Einheiten Biomasse, 0F 00 sind 15 .. was auchimmer.
Zum Beweis:
 Direkt im Memory Viewer alle Werte aufsteigend ändern(HEXADEZIMAL!) : 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F.
 Die Anzahl taucht immer als PAAR auf(2 Bytes WORD; LOW-HIGH), also die NULL zwischen den Werten unbedingt beachten!


So sollte es dann im Memory View aussehen:
[Bild verschwunden!]


Und das neue Inventar im Lager:
[Bild verschwunden!]
Da es 16 verschiedene Rohstoffe in diesem Spiel gibt und wir mit NULL angefangen hatten(bis 0f=15) ist keine Biomasse(0) im Lager..


Schnell eine komplette Liste der Rohstoffe erstellen..
[Bild verschwunden!]
0.) Den untersten Eintrag auswählen und STRG+C(Kopieren) drücken.., dann STRG+V für Einfügen drücken..
1.) Bei Adjust Adress 2 eintragen
2.) PASTE klicken
Schritte 0-2 solange wiederholen, bis es insgesamt 16 Einträge sind..


Dann die Einträge der richtigen Reihenfolge entsprechend benennen:
[Bild verschwunden!]
So leicht wie der Zugriff nun auch ist.. diese Liste ist bei einem erneuten Spiel recht wertlos..
..da die Speicherbereiche sich jedesmal ändern -.- !
Trotzdem speichert man erstmal diese "Struktur": STRG+S (save *.ct file).

Bei einem späteren Spiel müsste man dann wieder die Änderungen des ersten Rohstoffs überprüfen, wieder und wieder..
Einzige Hilfe: Der richtige Adresswert scheint immer bei ????4A62 zu liegen.
Hat man den später gefunden, reicht es die neue Adressposition zu kopieren, beim Eintrag "Biomasse" einzutragen,
mit RMB das Kontextmenü zu öffnen und recalc zu wählen. Alle folgenden Werte werden dann passend berechnet.

Schöner wäre aber, wenn man immer die richtige Adresse hätte..
Ein Pointer-Scan in den blauen Dunst hinein brachte.. KEINE Ergebnisse :(
Find out what accesses this adress:
  die Biomasse im Lager auf 100 erhöhen
  die maximale Menge an Biomasse in den Laderaum des Raumschiffs schaufeln (Startschiff hat nur 5? Einheiten Laderaum frei)
  die Biomasse im Lager auf 0 setzen
  den Menüpunkt "Lager" öffnen..
  "Find out what accesses this adress" wählen, den Debugger starten lassen.
  Dann eine Einheit Biomasse von Schiff zurück ins Lager schaffen..(das Menü dabei NICHT verlassen/schliessen!)


Cyanfarben hinterlegt: Der Maschinencode, der in die Speicherstelle hineinschreibt:
[Bild verschwunden!]
MOV (eax+ebx),cx bedeutet: Schreibe in den Speicherbereich (eax+ebx) den Wert aus dem cx-Register.
Die Summe von eax+ebx bezeichnet die (momentane) Position der Biomassenmenge..
Register ecx ist im Beispiel $0D (=13), weil das der Wert war, der als Vorrat an Biomasse geschrieben wurde.

Mehrere Tests(DOSBox beenden und neustarten..) zeigten, das der Wert vom eax-Register sich häufig änderte.
Der Wert des ebx-Registers blieb dafür immer gleich.

Den Adresswert des eax-Registers markieren und kopieren..
den Debugger mit Stop/Close wieder schliessen


[Bild verschwunden!]
1.) manuelle Adresse hinzufügen
2.) den kopierten Wert des eax-Registers einfügen


Hinweis:
Ich hatte zwischenzeitlich PE wieder geschlossen, damit haben sich die Speicherstellen geändert.
Auch das eax-Register enthält einen anderen Wert: 07DB0020 (anstelle des vorherigen 07D40020)
[Bild verschwunden!]
Für die neue Adresse Pointerscan for this Adress ausführen.
Da es ein altes DOS-Spiel ist, reichen maximal 2 Offsets aus. Behaupte ich einfach mal :)
Ein Dateiname muss noch angegeben werden(als Zwischenspeicher für die vielen Einträge.
Es bietet sich an mit 1 zu beginnen, und später den Namen um 1 zu erhöhen..


Alles, was NICHT den Namen des Spielprozesses am Anfang hat, ist WERTLOS!.
In diesem Beispiel muss es also das eingerahmten DOSBox.exe sein.
[Bild verschwunden!]
Das Pointerscan-Fenster und CheatEngine NICHT schliessen!
DOSBox.exe beenden. DOSBox.exe(und das Dos-Spiel)neu starten.


Cheatengine mitteilen, welchen Prozess es bearbeiten soll..
[Bild verschwunden!]
1.) Prozessfenster öffnen
2.) Prozess auswählen
3.) Bestätigen
Die Frage "Keep current adress/code list" mit Yes bestätigen


Im nächsten Schritt werden alle durch das Neustarten ungültigen Pointer entfernt..
[Bild verschwunden!]
1.) Menüpunkt Pointerscanner öffnen
2.) Only filter out invalid pointers
3.) Bestätigen
Und wieder einen Dateinamen angeben, diesmal "2".


Nach der "Bereinigung" sind es schon weniger "gültige" Pointer..
[Bild verschwunden!]
Der Einfachheit halber gleich den ersten Eintrag doppeltklicken(Übertragt den Pointer in die Liste..)
Der neue Pointer wird sinnigerweise als "pointerscan result" bezeichnet.
Die gefundenen Pointer sind JEDERZEIT wieder ladbar über den Dateinamen "2.PTR", nur für den Fall..


[Bild verschwunden!]
1.) Die Pointeradress doppeltklicken
2.) Type von 4-Bytes auf 2-Bytes ändern
3.) Den Wert des ebx-Registers(gaaanz lange her) als Offset eintragen


Ein gültiger Pointer auf die Biomasse ist gefunden. Beweisführung--keine Lust.
[Bild verschwunden!]
Den Pointer kopieren und an den Anfang der Mondbasis-Lager-Dingens einfügen(Adjust Adress=0!!)
Sooft durchführen, bis es 16(gleiche) Einträge sind.
Dann der Reihe nach benennen.
1.) Da die Pointer kopiert wurden.. zeigen sie alle auf die selbe Adresse
  Auf das P-> doppeltklicken(in der Reihe "Radioaktive")
2.) Ein Klick erhöht die angezeigten Offset um 4, wir brauchen aber 2(2-Bytes!).
  Mit gedrückter STRG Taste anklicken erhöht hier um 1(also 2x so anklicken)
  Entsprechend mit den anderen Pointern vorgehen..


Für Begriffstutzige..
[Bild verschwunden!]
Jetzt bloss das Speichern der Liste nicht vergessen ;)