Ein Hex-Editor ist ein Programm, mit dem Sie jede beliebige Datei auf
binärer Ebene verändern können, indem Sie in Dateien nach
Hexadezimalfolgen suchen und einzelne Speicherzellen verändern. Ältere
Bezeichnungen dieser Werkzeuge sind Disk-Editor und Disk-Monitor. Die meisten
dieser Programme sind Shareware oder gar Public Domain, also leicht zu
beschaffen. WinHex und Hex Workshop empfehlen wir besonders,
allerdings müssen sie, nach Ablauf einer Testdauer, für rund 30
Mark registriert werden.
Die Vorgehensweise ist immer gleich:
Sie merken sich den Wert, den Sie verändern wollen, zum Beispiel den Geldbetrag.
Sie speichern den Spielstand ab.
3. Sie öffnen die Spielstandsdatei mit einem Hex-Editor.
Sie rechnen den Wert in eine Hexzahl um.
Sie suchen den Hexwert im Spielstand.
Sie ändern ihn nach Ihren Vorstellungen.
Sie speichern ab.
Sie laden im Spiel den geänderten Spielstand.
Finden Sie den Spielstand, den Sie verändern möchten. Das ist in
den meisten Fällen sehr einfach. Oft werden die Spielstände numeriert,
etwa als SAVGAM01.SAV bis SAVGAM09.SAV.
Manchmal geben Sie den Namen selber an, und eine Endung wie
SAV oder GAM wird angehängt.
Häufig werden die Spielstände in einem separaten
Verzeichnis abgelegt.
Aufbau eines Hex-Editors
Starten Sie einen Hex-Editor, und laden Sie einen Spielstand über den
Menüpunkt File/Open beziehungsweise Datei/Öffnen.
Zunächst sollten Sie sich einen Überblick verschaffen, wie ein
Hex-Editor aufgebaut ist:
In der linken Spalte sehen Sie die Adresse (= den Offset) des ersten Bytes
der Zeile als Hexzahl. Da die Veränderungen meistens nicht bei der ersten
Adresse einer Zeile stattfinden, zeigen Hex-Editoren die genaue Adresse der
Cursorposition noch einmal extra an, im Idealfall dezimal und hexadezimal
zugleich.
In der Mitte sehen Sie den Inhalt der gewünschten Datei als Hexzahlen,
zeilenweise zu je 16 Byte angeordnet. Eine Speicherzelle umfaßt zwei
Ziffern. Der Übersicht halber wird zwischen zwei Zellen ein Leerzeichen
gesetzt.
Rechts sehen Sie den Inhalt der gleichen Speicherzellen noch einmal, aber
nicht als Hexzahlen, sondern als ASCII-Code. Manchmal ist dort
»richtiger« Text zu lesen, bei wirrem Zeug handelt es sich oft
um Programmcode, bei irgendwie geordneten Strukturen meist um Grafiken oder
andere Daten.
Manchmal finden Sie auch den Begriff Sektor, um die Position festzulegen.
Ein Sektor ist, wir haben es bereits erwähnt, 512 Byte (= 200H) groß.
Mit den Cursortasten blättern Sie vor und zurück.
Text ändern Sie direkt in der rechten Spalte, Hexzahlen in der Mitte;
zwischen beiden Möglichkeiten wechseln Sie in den meisten Programmen
mit [Tab].
Hexereien
Wir wollen nach Werten suchen, die sich verändern lassen. In vielen
Spielen eignet sich dazu das Guthaben. Das rechnen Sie in eine Hexzahl um.
Manche Hex-Editoren bieten eine Umrechnungsfunktion, Sie können aber
auch den Taschenrechner von Windows verwenden. Ein Guthaben von 300
Mark wären hexadezimal 12C oder 12CH, und diesen Betrag
gälte es dann zu finden.
Normalerweise könnte man denken, daß irgendwo im Spielstand an
einer Speicheradresse das Byte 01 abgelegt ist, dem das Byte 2C
folgt, denn um 12C zu speichern, werden zwei Byte benötigt: 01
2C.
Ärgerlicherweise deponiert der PC solche Bytefolgen in verkehrter
Reihenfolge; bei 012C wird erst 2C (der niederwertige Teil)
und danach 01 (der höherwertige Teil) abgelegt.
Um den Kontostand auf 301 Mark zu erhöhen, ändern Sie die
beiden Bytes 2C 01 in 2D 01 um: 301 dezimal sind
012DH, und das vertauscht ergibt 2D 01. Der maximale Betrag
ergibt sich durch den maximalen Wert, den zwei Bytes annehmen können:
FFFFH sind 65535 Mark, und um die zu erreichen, tragen Sie
hier fällt das Vertauschen einfach FF FF ein.
Meistens haben die Entwickler eines Spiels nicht nur 2 Byte für
die Speicherung des Geldes veranschlagt, sonst wären 65535 das
höchste der Gefühle. Mit 3 Byte sind immerhin FFFFFFH oder
2 hoch (8 Bit mal 3 Byte) gleich 16.777.216 Zustände und damit
von 0 bis 16.777.215 Mark möglich.
Eine Beschränkung auf 3 Byte ist aber sehr ungewöhnlich, da
Intel-Prozessoren den Zugriff auf 3 Byte in einem Rutsch nicht
unterstützen: Es ist davon auszugehen, daß die Programmierer den
Geldbetrag in einem 16-Bit-Zugriff (2 Byte) oder einem 32-Bit-Speicherzugriff
(4 Byte) lesen und schreiben. Jeder Wert, der 65535 übersteigen kann,
wird demnach wahrscheinlich in 4 Byte abgelegt. 4 Byte können
FFFFFFFFH und damit bis zu 4.294.967.296 speichern, oder, da
die Null auch einen Zustand annimmt, eins weniger.
Der Programmierer nennt einen 2-Byte-Wert Wort (word) und einen
4-Byte-Wert Langwort oder Doppelwort (doubleword, dword), weil
er aus zwei Wörtern besteht. Gehen wir von einem 4-Byte-Wert aus, sind
300 Mark 0000012CH. Sie werden im Speicher als 2C 01 00 00 abgelegt:
Der Rechner vertauscht zuerst die Bytes eines Worts und dann die Wörter
eines Doppelworts. Der Betrag 12345678H wird demnach intern als 78
56 34 12, der Betrag 11223344H wird als 44 33 22 11 gespeichert
und ist als diese Bytefolge zu suchen.
Um aus den 300 Mark 16,7 Millionen zu machen, ersetzen Sie demnach
2C 01 im Spielstand durch FF FF FF, wobei Sie auch das
nächste Byte an dem 00 steht überschreiben. Für
mehr als 4 Milliarden hängen Sie ein viertes FF hintendran.
Bei den meisten Spielen ist das Geld der einzige Betrag, der sich so
ausschweifend erhöhen läßt. Die Zahl der Leben wird meist
nur in einem Byte gespeichert, aber 255 sind immerhin besser als 3. Vor allem
in Rollenspielen wird für einige Eigenschaften je ein Byte veranschlagt,
aber das Programm rechnet mit 100 (64H) als maximalem Wert. Eine Erhöhung
auf FFH kann zwei Effekte haben: Die 255 werden akzeptiert, oder das Programm
kommt damit nicht zurecht und stürzt ab.
Mit solchen Rückschlägen ist beim Mogeln immer zu rechnen. Die
harmlose Variante: Der Geldbetrag wird akzeptiert; die Ziffernfolge ist aber
so lang, daß sie den Bildschirm über den ihr zugedachten Teil
hinaus überschreibt. Oder der Geldbetrag wird nur zu einem bestimmten
Betrag angezeigt; intern verarbeitet das Programm aber die volle Summe. Oder
umgekehrt: Am Bildschirm werden Millionen angezeigt, aber in der internen
Zählung des Programms bleibt es beim kargen Startwert. (Dazu später
noch mehr.)
Negative Werte
Was bisher außen vor blieb, sind negative Werte. Ist auch mal ein Minus
vorgesehen, dann muß der Aspekt auch beim Speichern berücksichtigt
werden. Man reserviert ein Bit, um das Vorzeichen festzustellen, womit sich
der maximale Betrag auf die Hälfte reduziert, weil die zweite Hälfte
für negative Zahlen gedacht ist. Bei einem Wort nutzt man eben 15 Bit
für den Betrag und das 16. Bit für das Vorzeichen: Ist es 1, wird
die Zahl negativ. Bei einem Byte, das 256 Zustände annehmen kann,
entscheiden die Programmierer also frei, ob damit Werte von 0 bis 255 oder
von 1 bis 256 oder von 128 bis 127 gespeichert werden. Sie nennen es
vorzeichenbehaftet (signed) oder nicht-vorzeichenbehaftet (unsigned).
Diese Umrechnung ist davon abhängig, wie viele Bytes für die
Speicherung einer Zahl verwendet werden:
Anzahl Bytes
Datentyp
Wertebereich
1
signed byte
-128 bis 127
1
unsigned byte
0 bis 255
2
signed short
-32768 bis 32767
2
unsigned short
0 bis 65535
4
signed long
-2.147.483.648 bis 2.147.483.647
4
unsigned long
0 bis 4.294.967.295
In der Regel kann man davon ausgehen, daß die Programmierer 4 Byte
für die Speicherung des Geldes veranschlagen. Weil das Guthaben auch
mal negativ werden kann, fällt ein Bit für das Vorzeichen weg,
so daß sich der Bereich zur Hälfte in positive und zur Hälfte
in negative Werte teilt.
Noch mal im Detail: 1 Byte besteht aus 8 Bit. Diese 8 Bit können 256
(2 hoch 8) Zustände annehmen, wobei der Zustand 0 mitgezählt wird.
Sollen aber auch negative Zahlen dargestellt werden, wird die Kennzeichnung
des Minuszeichens benötigt. Dazu nimmt man eines der acht Bits als
Vorzeichenmarkierung. Bleiben noch 7 Bit und damit 128 Zustände, die
jeweils mit und jeweils ohne Vorzeichen gespeichert werden können.
Jetzt geht's zur Sache
Um 300 Mark zu finden, lassen Sie nach der Hex-Folge 2C 01
suchen. Oder besser nach 2C 01 00; da mit sehr großer
Wahrscheinlichkeit mindestens drei Byte verwendet werden. Eine Suche nach
nur zwei Byte bringt oft falsche Fundstellen, also Adressen, an denen die
Bytes zwar zu finden sind, aber gar nicht das Geld gemeint ist. Wenn Sie
die richtigen Hexzahlen auf bereits beschriebene Weise umtauschen und in
dezimal umrechnen, sollte exakt Ihr Geldbetrag im Spiel herauskommen.
Tragen Sie ab dieser Stelle einen Betrag Ihrer Wahl ein, indem Sie die alten
Werte überschreiben, und speichern ab. Jetzt rufen Sie Ihr Spiel auf,
laden den manipulierten Spielstand, die Spannung wächst ja: Sie
haben eine üppige Geldspritze erhalten.
Bei vielen Spielen reicht es, einmal den Geldbetrag zu lokalisieren. Später
wählen Sie dann direkt den betreffenden Offset. Bei nicht wenigen Titeln
wird das Guthaben je nach Spielstand an verschiedenen Stellen abgelegt. Vor
allem bei den meisten Echtzeit-Strategiespielen) ist die Stelle, wo die
Höhe des Geldes abgespeichert ist, variabel; das heißt, Sie
müssen vor jeder Änderung die Speicherzelle ermitteln. Das ist
meistens keine große Sache, denn Hex-Editoren haben eine Suchfunktion,
die nach Bytefolgen und Zeichenketten fahndet.
Manchmal ist der gesuchte Wert mehrmals im Spielstand enthalten, und nicht
nur deswegen sollten Sie sich merken, welche Bytes Sie überschrieben
haben. Steht dort für das Spiel Unsinn, da Sie nicht das Geld, sondern
andere Werte geändert haben, wird es vermutlich abstürzen oder
das Verwenden des Spielstandes verweigern. Dann probieren Sie halt den
nächsten Wert.
Unerfreulich wird es, wenn vom Programm aus Spielstände auf Manipulationen
getestet werden, indem es eine Prüfsumme bildet etwa die Quersumme
aller Bytes. In diesem Fall wird es einen veränderten Spielstand
erbarmungslos zurückweisen. Probieren sollten Sie es aber allemal mit
einem Geldbetrag, der die gleiche Quersumme besitzt, etwa 2C01H statt 012CH,
das ist bereits ein schöner Batzen mehr.
Um vor Patchen zu schützen, können die Programmierer außerdem
die Bits eines Bytes schütteln ("rotieren" oder "maskieren"), und das
Ergebnis läßt sich nicht erahnen.
In diesem Zusammenhang ist der Hinweis, sich die Adressen mit den gepatchten
Werten zu notieren oder eine Kopie des Spielstands zu erzeugen, um ihn
restaurieren zu können, sicher nicht überflüssig.
Noch ein Tip: Meistens können Sie Spiel und Hex-Editor parallel laufen
lassen. Sie speichern den Spielstand ab, wechseln mit [Alt] + [Tab] zum
Hex-Editor, nehmen die Änderungen vor, springen zum Spiel zurück
und laden den Spielstand.
Ein praktisches Beispiel
Gute Erfahrungen haben wir mit Cheaten von Anno 1602 und gemacht,
während wir uns an Command & Conquer 3 (die Geldanzeige
ließ sich leicht ändern; aber die Millionen konnten wir nicht
verwenden) und Age of Empires 2 (Spiel beendete sich sofort, als es
die Veränderungen am Spielstand bemerkte) vergeblich die Zähne
ausbissen.
Besonders einfach sind die Spielstände der Tomb-Raider-Serie
zu "knacken". Sie sind mit 8 Kilobyte ungewöhnlich klein, und die Werte
wie Anzahl der Fackeln oder der Patronen sind im vorderen Teil als Hexzahlen
abgespeichert. Falls Sie den fünften Teil, Die Chronik, besitzen,
können Sie mit folgenden Daten leicht Ihren ersten Hex-Cheat erzeugen:
- Die Spielstände liegen im gleichen Verzeichnis, in dem Die
Chronik installiert ist. Sie tragen die Namen
SAVEGAME.0 bis
SAVEGAME.13.
- Werte wie Anzahl der Fackeln, der Patronen und der Medipacks werden als
2-Byte-Werte an immer der gleichen Adresse abgelegt. 3 Fackeln stehen im
Spielstand als 03 00 ab Offset 198. Weitere Adressen:
194+195
kleines Medipack
196+197
großes Medipack
198+199
Fackeln
19C+19D
Uzi-Ammo
19E+19E
Revolver-Ammo
(Wenn ein Gegenstand die Anzahl FF FF erhält (eigentlich 65535),
wird er vom Spiel als "unbegrenzt vorhanden" interpretiert.)