Arbeit mit einem Hex-Editor
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:
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.
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:
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].
- 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.)
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:
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.
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.
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:
(Wenn ein Gegenstand die Anzahl FF FF erhält (eigentlich 65535), wird er vom Spiel als "unbegrenzt vorhanden" interpretiert.)
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.)