5 Stimmen

Finden und Verwenden von Speicher-Offsets in einem bestehenden Programm?

Die meisten Spiele-Botting-Anwendungen verwenden eine Reihe von Speicher-Offsets, die sie für eine bestimmte Version eines Spiele-Clients gefunden haben, um das Botting zu erleichtern. Sie können einen Speicher-Offset für Gesundheit, x/y-Position usw. haben. Jedes Mal, wenn das Spiel ein Update herausgibt, müssen die Offsets für die verschiedenen Informationen, die das Bot-Programm verwendet, neu gefunden und ebenfalls aktualisiert werden.

Ich bin daran interessiert, einen Solitaire-Bot als Lieblingsprojekt zu schreiben. Wenn du hier nachschaust, hat mmoglider (ein kommerzieller Bot) dies bereits als Demo für sein Botprogramm (das normalerweise zum Botisieren von WoW verwendet wird) durchgeführt: YouTube-Video von MMOGlider beim Botting von Vista Solitaire.

Was ist eine gängige Methode, um verschiedene nützliche Speicher-Offsets genau zu lokalisieren? Wie könnte ich den Speicher-Offset finden, der auf den "Stapel" im Solitärprogramm zeigt, und diesen verwenden, um zu bestimmen, welche Karten auf dem Stapel liegen? Ich weiß aus Erfahrung mit den Segelfliegern, dass sie, sobald sie in der Lage waren, die Offsets für den Stapel selbst zu lokalisieren, sagten, dass jeder Kartenwert für den gesamten Stapel da war.

Hat jemand Erfahrung mit Reverse Engineering und dem Herausziehen von Speicher-Offsets aus bestehenden Programmen? Und wenn man diese Offsets hat, wie kann man dann die Werte aus dieser "Deck"-Struktur im Speicher abrufen und lesen?

10voto

Sparr Punkte 7347

Für solche Aufgaben gibt es in der Regel zwei Ansätze. Der Einfachheit halber betrachten wir ein Spiel mit einer ganzzahligen Menge an "Gesundheit" für den Spieler.

Die erste besteht darin, den Prozessspeicher zu manipulieren, während das Programm läuft. Dies ist gut, um bekannte Werte zu finden. Wenn Sie in einem Spiel 100 Lebenspunkte haben, suchen Sie im Speicher nach 100 (höchstwahrscheinlich als Ganzzahl) und notieren Sie jede gefundene Stelle. Wenn Ihre Lebenspunkte dann auf 99 sinken, suchen Sie dieselben Stellen ab, um zu sehen, welche sich entsprechend geändert haben. Fahren Sie so fort, bis Sie die genaue(n) Stelle(n) der Gesundheitsvariablen gefunden haben. In den meisten modernen Spielen werden Sie eine dynamisch zugewiesene Speicheradresse finden, die Teil einer Struktur ist. Sie müssen dann im Programmspeicher nach Werten suchen, die ein Zeiger auf den Bereich in der Nähe der Gesundheitsvariablen sein könnten, und den Eingrenzungsprozess über mehrere Spieldurchläufe wiederholen, um die Position des Zeigers auf die gewünschten Daten zu ermitteln. Diese Methode ist am nützlichsten für klassische PC- und Konsolenspiele, insbesondere für Spiele, bei denen der Speicherplatz klein und leicht zu manipulieren ist.

Die zweite Methode erfordert die Disassemblierung der Anwendungsbinärdatei (ich verwende IDA Pro ), dann suchen Sie nach Funktionen, von denen bekannt ist, dass sie die von Ihnen gewünschten Daten verwenden. Zum Beispiel: Sie sehen "Gesundheit: 99" auf dem Bildschirm. Suchen Sie in der Binärdatei nach der Zeichenfolge "Health: ", suchen Sie dann nach Verweisen auf diese Zeichenkette (Sie werden wahrscheinlich einen Aufruf von sprintf oder ähnlichem finden) und sehen Sie nach, auf welche anderen Speicherplätze dieselben Funktionen verweisen, was Sie in der Regel zur "Health"-Variablen oder der sie enthaltenden Struktur führt. Dies ist die Methode, die in moderneren Spielen mit großen Speicherbereichen und fortgeschrittenen Programmierpraktiken am häufigsten verwendet wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X