Spielestände manipulieren: Cheaten mit scanmem

Veröffentlicht am

Wieder einmal durch einen Thread im ubuntuusers.de-Forum bin ich auf eine interessante Sache aufmerksam geworden. Es wurde nach einer Alternative für die Windows-Software CheatEngine gesucht – und scanmem gefunden.

Mit scanmem können Spielstände direkt im Hauptspeicher manipuliert werden. Aber auch wenn Spiele das Hauptziel sind, kann das Tool natürlich auch an beliebiger anderer Software eingesetzt werden.

scanmem bzw. das gleichnamige Paket kann ganz einfach aus den Standard-Paketquellen (universe) installiert werden. Es handelt sich um ein reines Terminal-Tool (grafisches Frontend: Game Conqueror s.u.). Nicht nur deswegen, sondern hauptsächlich weil man direkt im Hauptspeicher Werte verändert, sollte man natürlich etwas vorsichtig sein. Vor allem dann, wenn man sich selbst zu den Linux-Einsteigern zählt. Crashs sind nicht ausgeschlossen, wenn auch wohl eher unwahrscheinlich.

Ein Hinweis zu den gezeigten Aus- und Eingaben: ich habe diese teils auf das Wesentliche gekürzt. Also nicht wundern, wenn die Meldungen nicht 100%-ig der tatsächlichen Anzeige entsprechen. Werft doch einen Blick auf die Screenshots – da sind die kompletten Ausgaben zu erkennen.

Vorgehensweise am Beispiel Warzone 2100

BTW / Für alle, denen das Spiel kein Begriff ist: Warzone 2100 ist ein kostenloses Echtzeit-Strategiespiel, das ihr euch ganz einfach über die Paketverwaltung installieren könnt – der Name des Pakets lautet warzone2100).

Lokalisieren des Speicherbereichs für den Energie-Wert

Zunächst starten wir das Spiel und sorgen dafür, dass es im Fenstermodus läuft. Das macht den Wechsel zwischen Spiel und Terminal leichter. Im Falle von Warzone 2100 muss das Spiel neu gestartet werden, damit die Änderung greift.

Dann beginnen wir eine neue Kampagne im Einzelspieler-Modus und sehen dann am unteren Fensterrand den gelben Balken, der unsere zur Verfügung stehende Energie darstellt. Das Spiel beginnt mit 1300 Energie-Punkten.

Nun starten wir scanmem. Beim Aufruf wird immer die Prozess-ID des Spiels angegeben. Der Aufruf per sudo ist notwendig, weil scanmem wohl sonst nicht an die Speicherwerte des „fremden“ Prozesses kommt.

sudo scanmem $(pidof warzone2100)

Das Programm landet letztendlich auf einem Prompt, der wie folgt aussieht:

0>

Die Zahl vor dem > zeigt immer die Anzahl Speicheradressen an, die als Adresse für den gesuchten Wert in Frage kommen. Da wir bisher noch nichts getan haben, steht dieser Werte logischerweise auf 0.

Wir geben nun also an dieser Stelle den derzeitigen Wert der gesuchten Variable (dem Energiewert) an, also 1300 und bestätigen mit ENTER.

scanmem sucht dann nach allen Variablen, die gerade den Wert 1300 haben und gibt als Ergebnis beispielsweise aus:

info: we currently have 940 matches
940>

Somit meldet sich der Prompt dann auch mit der selben Zahl.

Gefunden! Nach dem zweiten Durchgang ist nur noch eine Adresse übrig geblieben

Natürlich sind das viel zu viele Möglichkeiten. Wir müssen also weiter einschränken. Dazu bauen wir im Spiel ein Gebäude – was Energie kostet. Welches Gebäude ist letztendlich egal. Wichtig ist nur, dass sich der Energiewert verändert. Dann warten wir bis der Energiewert wieder stehen bleibt, z.B. auf 1250.

Wir geben nun also 1250 ein, bestätigen wieder mit ENTER. scanmem geht nun alle 940 Treffer der vorigen Suche durch und prüft, welche Variablen davon nun den Wert 1250 haben. Vermutlich landen wir nun schon einen eindeutigen Treffer (ansonsten muss nach selbem Schema weiter verfahren werden), was mit

info: match identified, use "set" to modify value
1>

Der Energiewert wurde per set auf 2300 abgeändert

quittiert wird. Nun kann man direkt den Wert auf z.B. 2300 verändern, indem man einfach eingibt:

set 2300

Die Aktualisierung im Spiel erfolgt natürlich sofort.

Ein Cheat-Skript erstellen

Bei Bedarf kann man sich nun ein Skript erstellen, mit dem man den durchgeführten Cheat immer wieder durchführen kann.

Dazu muss man sich zunächst die Speicheradresse ausgeben lassen, an deren Stelle man den Wert ändern möchte. Das funktioniert auf der Eingabeaufforderung innerhalb von scanmem mit dem Kommando list. Sobald wir also die Adresse eindeutig ausfindig gemacht haben (nach oben beschriebenem Schema), geben wir einfach ein:

list

und erhalten eine Ausgabe wie z.B.

[ 0]            0x8aa24c0, 1250, [I64 I32 I16 ]

Dabei ist [0] der Index des Treffers (wir haben ja schon auf einen eindeutigen reduziert), 0x8aa24c0 ist die Speicheradresse, 1250 der aktuelle Wert und I64, I32 und I16 sind die in Betracht kommenden Datentypen.

Somit können wir den Energiewert in Warzone 2100 mit folgendem Kommando direkt auf der Shell auf den Wert 2300 setzen:

echo "write i16 8aa24c0 2000" | sudo scanmem $(pidof warzone2100)

Wie ihr seht, habe ich das 0x vor der Speicheradresse weggelassen und als Datentyp i16 angegeben. Woher man weiß, welchen Datentyp man verwendet, kann ich nicht wirklich sagen. Das ist vielleicht auch einfach auszuprobieren.

So könnten wir nun dafür sorgen, dass wir jede Sekunde wieder die Energie aufgefüllt bekommen. :)

Grafisches Frontend: Game Conqueror

Für scanmem gibt es auch ein in Python programmiertes, grafisches Frontend namens Game Conqueror. Das Paket gameconqueror kann ganz einfach aus den Standard-Paketquellen (universe) installiert werden.

Außer diesem kurzen Hinweis möchte ich allerdings nicht mehr dazu sagen, da die Bedienung von scanmem für mich sehr angenehm ist und ich auf diesem Weg auch noch skripten kann. Schaut’s euch aber doch einfach an, wenn ihr eher auf grafische Oberflächen steht. Eine große Erleichterung ist es aber wohl eher nicht.


Dieser Artikel wurde in der/den Kategorie(n) Planet-U, Spiele veröffentlicht und mit den Tags , , versehen.

7 Kommentare zu Spielestände manipulieren: Cheaten mit scanmem

  1. Kommentar von Sebastian
    24. September 2012, 11:04 Uhr.

    Bin jetzt nicht wirklich der Spieler, aber der Artikel ist auch so super interessant. Insbesondere der Ansatz zur Identifizierung des betroffenen Speicherbereichs – schöne Sache. Danke dafür :)

    • Kommentar von Gerald
      24. September 2012, 11:09 Uhr.

      Danke dir! Mir ging’s eben genauso… und ich wollt’s teilen… :)

  2. Kommentar von Sol
    24. September 2012, 14:01 Uhr.

    mich wundert das sowas heute noch möglich ist. Ich dachte da werden diverse Tools sogar Kernel intern genutzt um solche Dinge zu verhindern.

    • Kommentar von AlphaX2
      25. September 2012, 15:09 Uhr.

      Wird ja auch, aber da das Tool mit Root-Rechten ausgeführt wird darf man das in Linux dann eben doch. 😉

      AlphaX2

  3. Kommentar von Dicker1
    27. September 2012, 15:01 Uhr.

    Na da werden meine fragen anderen zu Inspiration :) Super Artikel!

    • Kommentar von Gerald
      27. September 2012, 15:11 Uhr.

      Ja klar! Finde immer wieder Dinge im Forum, die mich selbst interessieren – und dann wird halt auch mal ein Artikel draus. Vielen Dank!

  4. Kommentar von Sebastian Parschauer
    20. Juni 2016, 16:32 Uhr.

    Danke für’s Promoten von scanmem! Der Power-Wert von Warzone 2100 ist mit das einzige, das in statischem Speicher gespeichert ist. Mein Game Trainer ugtrain (https://github.com/ugtrain/ugtrain) hat Beispiel-Configs für dieses Spiel bei denen alle „Structure“ und „Droid“ Objekte abgefangen und modifiziert werden (LD_PRELOAD, malloc() + free() Hooking). Ich bin auch der neue Maintainer von scanmem/GameConqueror. Schaut mal auf GitHub vorbei.

Hinterlasse eine Antwort

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

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>