Pointer-Scan in Cheat Engine: Adressen finden, die einen Neustart überstehen
Warum sich Adressen bei jedem Spielstart ändern, wie mehrstufige Pointer funktionieren und wie du mit Pointer-Scans, Pointer Maps und Rescans Einträge baust, die dauerhaft funktionieren.
Du hast deinen Gesundheitswert gefunden, ihn in einer Cheat Table gespeichert, das Spiel neu gestartet, und jetzt zeigt der Eintrag ?? oder eine zufällige Zahl an. Das ist nicht dein Fehler. Die meisten Spielwerte liegen bei jedem Start an einer anderen Adresse. Ein Pointer ist ein Pfad, der von einem Startpunkt, der sich nicht bewegt, zum Wert führt, und der Pointer-Scanner von Cheat Engine ist das Tool, das solche Pfade für dich findet.
Diese Anleitung setzt voraus, dass du bereits mit First Scan und Next Scan einen Wert finden kannst; falls nicht, lies zuerst das Cheat-Engine-Tutorial für Einsteiger. Nutze diese Techniken nur in Einzelspieler- und Offline-Spielen und sichere deine Spielstände, bevor du experimentierst.
Warum sich Adressen bei Neustarts ändern
Spiele erzeugen die meisten ihrer Daten erst während der Laufzeit. Wenn ein Level lädt, fordert das Spiel vom System einen Speicherblock für das Spielerobjekt an, einen weiteren für das Inventar und so weiter. Das nennt man dynamische Speicherzuweisung, und wo jeder Block landet, hängt davon ab, was vorher noch zugewiesen wurde. Das unterscheidet sich von Start zu Start und sogar zwischen Ladebildschirmen. Deine Gesundheit liegt an einer festen Position innerhalb des Spielerobjekts, aber das Spielerobjekt selbst wandert.
Außerdem lädt Windows aus Sicherheitsgründen Programme und deren Module (die Haupt-Exe und ihre DLLs) an wechselnden Basisadressen. Deshalb werden stabile Adressen immer relativ zu einem Modul angegeben, etwa "game.exe"+01A2B3C0, statt als reine Zahl.
In der Liste der Scan-Ergebnisse zeigt Cheat Engine Adressen, die zu einem Modul gehören, in Grün an. Diese sind statisch: Sie behalten bei jedem Start denselben Offset innerhalb des Moduls. Schwarze Adressen sind dynamisch. Die meisten Werte, die dich interessieren, sind dynamisch.
Wie mehrstufige Pointer funktionieren
Ein Pointer ist einfach ein Wert, der eine Adresse enthält. Spiele sind voll davon: Ein globaler „Game Manager“ enthält die Adresse der Welt, die Welt enthält die Adresse des Spielers, der Spieler enthält die Adresse eines Statistik-Blocks, und der Statistik-Block enthält die Gesundheit bei Offset 18. Wenn du einer solchen Kette von einem statischen Startpunkt aus folgst, landest du immer bei der aktuellen Adresse des Werts, egal wo die Objekte angelegt wurden.
"game.exe"+01A2B3C0 read the 8-byte address stored here (level 1)
+ 10 read the address stored here (level 2)
+ 18 this is the health value
Cheat Engine schreibt denselben Pfad in Klammernotation als [["game.exe"+01A2B3C0]+10]+18: Jedes Klammerpaar bedeutet „lies die Adresse, die hier gespeichert ist“. Die Offsets sind hexadezimal. Ein Pfad mit einem Offset ist ein einstufiger Pointer; die meisten echten Spiele brauchen zwei bis fünf Ebenen.
Schritt 1: Die aktuelle Adresse des Werts finden
Finde den Wert wie gewohnt und füge ihn zur Adressliste hinzu. Achte auf den richtigen Typ, denn der Pointer-Eintrag übernimmt ihn; die Anleitung zu Werttypen hilft dir, wenn du nicht sicher bist, ob die Gesundheit ein 4-Byte- oder ein Float-Wert ist. Bestätige die Adresse, indem du sie änderst und die Änderung im Spiel siehst.
Schritt 2 (optional): Sehen, was auf die Adresse zugreift
Klicke mit der rechten Maustaste auf den Eintrag und wähle Find out what accesses this address oder Find out what writes to this address. Cheat Engine hängt seinen Debugger an und listet die Anweisungen auf, die den Wert beim Spielen berühren. Ein typisches Ergebnis sieht so aus: movss [rbx+18],xmm0 oder mov [rcx+18],eax. Die Zahl in den Klammern, hier 18, ist der Offset des Werts innerhalb seines Objekts, und das Register (rbx oder rcx) enthielt in diesem Moment die Adresse des Objekts. Wenn du die Anweisung auswählst und ihre Details öffnest, siehst du die Registerwerte.
Das ist der manuelle Weg, Pointer zurückzuverfolgen: Du suchst die Adresse des Objekts als 8-Byte-Hex-Wert, um herauszufinden, was darauf zeigt, und wiederholst das für jede Ebene. So bringt dir auch das eingebaute Cheat-Engine-Tutorial Pointer bei, und es lohnt sich, das einmal zu machen, um die Idee zu verstehen. Beachte, dass das Anhängen des Debuggers manche Spiele instabil machen kann; speichere, bevor du es versuchst.
Die Anweisungen, die du hier findest, sind außerdem der Ausgangspunkt für Code-Injection-Skripte, eine Alternative zu Pointern, die in der Auto-Assembler-Grundlagenanleitung behandelt wird.
Schritt 3: Einen Pointer-Scan durchführen
Jede Ebene von Hand zu machen ist langsam, deshalb kann Cheat Engine automatisch nach allen plausiblen Pfaden suchen. Klicke mit der rechten Maustaste auf den Eintrag und wähle Pointer scan for this address. Der Einstellungsdialog hat viele Optionen; die wichtigen sind:
- Address to find: Ist mit der Adresse deines Eintrags ausgefüllt.
- Maximum offset value: Wie groß jeder Offset sein darf. Der Standardwert ist ein sinnvoller Startpunkt; erhöhe ihn nur, wenn Scans nichts finden.
- Max level: Wie viele Ebenen tief gesucht wird. Höhere Ebenen finden mehr Pfade, dauern aber deutlich länger und liefern viel mehr Ergebnisse. Fang bei etwa 5 an.
Klicke auf OK, wähle, wo die Ergebnisse gespeichert werden sollen (eine .PTR-Datei plus Hilfsdateien), und warte. Ein erster Scan kann Hunderttausende oder Millionen möglicher Pfade erzeugen. Die meisten davon sind Zufälle, die nur in dieser Sitzung funktionieren. Die nächsten Schritte werfen sie weg.
Schritt 4: Nach dem Neustart des Spiels erneut scannen
Das ist der Schritt, der den Pointer-Scan wirksam macht.
- Lass das Pointer-Scan-Fenster geöffnet oder öffne die gespeicherte
.PTR-Datei später über das Menü des Pointer-Scanners erneut. - Schließe das Spiel komplett und starte es neu. Lade einen Spielstand.
- Hänge Cheat Engine erneut an und finde die neue Adresse des Werts mit einem normalen Scan.
- Öffne im Pointer-Scan-Fenster das Menü und wähle die Rescan-Option. Gib die neue Adresse als zu suchende Adresse ein und bestätige.
Cheat Engine prüft jeden gespeicherten Pfad gegen den neuen Durchlauf und behält nur die, die jetzt zur neuen Adresse führen. Wiederhole das zwei- oder dreimal, am besten abwechslungsreich: ein anderer Spielstand, ein anderes Level und mindestens einmal nach einem Neustart deines PCs. Jede Runde entfernt Pfade, die nur zufällig funktionierten. Du kannst auch nach Wert statt nach Adresse neu scannen, wenn der Wert bekannt und markant ist.
Pointer Maps: Cleverer scannen
Eine Pointer Map ist eine Momentaufnahme aller Pointer im Spielspeicher zu einem bestimmten Zeitpunkt, auf der Festplatte gespeichert. Du erzeugst sie im Rechtsklickmenü der Adressliste, während das Spiel läuft, und hältst die Adresse des Werts für diese Sitzung fest. Später kannst du in den Pointer-Scan-Einstellungen mit einer gespeicherten Pointer Map statt mit dem Live-Speicher scannen und sie mit anderen gespeicherten Maps vergleichen, jeweils gepaart mit der Adresse, die der Wert in der jeweiligen Sitzung hatte.
Der Vorteil: Du kannst zuerst Maps aus mehreren Spielsitzungen sammeln und sie in einem einzigen Scan kombinieren, ohne das Spiel während des langsamen Teils offen zu halten. Das Ergebnis ist dieselbe Art gefilterter Liste, die eine Reihe von Rescans erzeugt, oft aber schneller erreicht.
Schritt 5: Ein Ergebnis auswählen und zur Table hinzufügen
Die Ergebnisliste zeigt eine Spalte Base Address wie "game.exe"+01A2B3C0, dann eine Spalte pro Offset und die Adresse, auf die der Pfad aktuell zeigt. Wenn du unter den Überlebenden auswählst, bevorzuge:
- Pfade, die in der Haupt-Exe des Spiels oder seinem Haupt-Engine-Modul beginnen;
- kürzere Pfade mit weniger Ebenen;
- Pfade, die die meisten unterschiedlichen Rescans überstanden haben.
Doppelklicke auf ein Ergebnis, um es zur Adressliste hinzuzufügen. Die Adresse des Eintrags erscheint mit dem Präfix P->, das zeigt, dass es ein Pointer ist. Prüfe den Typ; Pointer-Scan-Einträge sind standardmäßig 4 Bytes, ändere ihn also auf Float oder einen anderen Typ, falls dein Wert das braucht. Gib dem Eintrag eine klare Beschreibung und speichere die Table.
Du kannst einen Pointer auch von Hand eingeben: Nutze den Button zum manuellen Hinzufügen einer Adresse, setze die Pointer-Option, trage Modul und Offset in das Feld für die Basisadresse ein (zum Beispiel "game.exe"+01A2B3C0) und füge pro Offset ein Feld hinzu. Cheat Engine zeigt beim Tippen die Adresse an, auf die jede Ebene aufgelöst wird, sodass sich Fehler leicht erkennen lassen. Achte auf die Reihenfolge der Offset-Felder in diesem Dialog: Der Offset, der zuerst angewendet wird, steht neben der Basisadresse.
Grenzen von Pointern
Ein guter Pointer übersteht Neustarts, aber nicht unbedingt Spiel-Updates. Wenn der Entwickler das Spiel patcht, können sich die statische Basisadresse und die Offsets ändern, und du musst den Scan wiederholen. Behalte deine .PTR-Dateien und Notizen, damit du das schnell erneut machen kannst. Sei außerdem vorsichtig bei Werten, die mehrere Kopien haben, zum Beispiel Statistiken pro Charakter in einer Gruppe; ein Pfad führt eventuell zu dem Charakter, der zuerst ausgewählt wurde.
Zusammenfassung
- Finde den Wert und bestätige ihn.
- Nutze optional den Debugger, um zu sehen, welche Anweisungen darauf zugreifen.
- Führe einen Pointer-Scan mit moderaten Level- und Offset-Einstellungen durch.
- Starte das Spiel neu, finde die neue Adresse, scanne erneut. Wiederhole das mit unterschiedlichen Sitzungen.
- Wähle einen kurzen, konsistenten Pfad, füge ihn mit dem richtigen Typ zur Table hinzu und speichere.
Kommentare
Noch keine Kommentare
Sei der Erste, der seine Meinung teilt.