Frage

Ich habe einige Daten aus einem Prozess gelesen (Adresse:0x58F03C) mit der WINAPI-Funktion ReadProcessMemory:

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}

Da sich die Adresse bei jedem Neustart des Vorgangs ändert, habe ich mich gefragt, ob es eine Möglichkeit gibt, immer dieselbe Adresse zu erhalten?Es muss einen geben, weil ich viele "Trainer-Programme" sehe, die das können.Wie erhalten sie den richtigen Adresswert zum Lesen / Schreiben?

Derzeit erhalte ich es durch Scannen nach einem Wert mit dem CheatEngine und führen Sie einen nächsten Scan nach geändertem Wert durch.

Danke.

War es hilfreich?

Lösung

Sie stoßen auf eine dynamische Speicherzuweisung.In der CheatEngine-Welt werden diese als 'Zeiger' bezeichnet.

Betrachten Sie einige Daten (zum Beispiel a uint32_t/DWORD) innerhalb des Speichers, der war malloc'd.Wenn Sie die Adresse der Daten finden, gibt es keine Garantie dafür, dass die Adresse beim nächsten Start des Prozesses dieselbe ist.Dies liegt daran, dass der Speicher von zurückgegeben wird malloc könnte an einem anderen Punkt im Speicher basieren.

Der Trick, um die dynamische Speicherzuweisung zu umgehen, besteht darin, eine statische Heap-Adresse zu finden, die Sie zu der Adresse des Werts führen kann, an dem Sie interessiert sind.Das CheatEngine-Tutorial zeigt Ihnen, wie dies gemacht wird.Gleiches gilt für mehrstufige Zeiger.Auf einer höheren Ebene entspricht dies dem dynamisch zugewiesenen Speicher, der einen Zeiger auf einen anderen dynamisch zugewiesenen Speicher enthält, und so weiter.

Die in CheatEngine verwendete Methode zum Abrufen von Zeigern funktioniert ungefähr so:

  • Legen Sie einen Zugriffshardware-Haltepunkt an der Adresse des Datenwerts fest, an dem Sie interessiert sind
  • Wenn Code darauf zugreift, zeigt Ihnen der Hardware-Haltepunkt, wie der Code aussieht

Der Code sieht normalerweise ungefähr so aus:

mov eax, 0x1234ABCD 
dec dword ptr ds:[eax+0x85]

Dies könnte einem Code entsprechen, der Ihre HP verringert, wenn sie von einem Feind getroffen werden.0x1234ABCD ist in diesem Fall der Zeiger und 0x85 der Offset.In C-Code könnte dies passiert sein:

struct some_struct* blah = malloc(...);
...
blah->HP--;

0x1234ABCD wäre die Adresse von blah.Der HP-Wert befindet sich irgendwo innerhalb des Blocks, auf den gezeigt wird blah.Der Offset in den Speicherblock beträgt 0x85.Wenn Sie dann einen Trainer schreiben würden, würden Sie das lesen DWORD (QWORD wenn 64 Bit) bei 0x1234ABCD und addiere 0x85 zum Wert.Dies würde Ihnen die Adresse des HP-Werts geben.

Andere Tipps

Dies funktioniert, wenn sich die Adresse im Teil der ausführbaren Datei des Datenabschnitts befindet, in dem sich vorab zugewiesene Variablen befinden (nicht für Heap und Stack geeignet)...

Werfen Sie einen Blick auf die Beispiel "Auflisten aller Module für einen Prozess" auf MSDN.

Es verwendet Enumprocessmodule() um Modulhandles zu erhalten.Das sind Bildbasisadressen.

Sie können die Image-Basisadresse für die ausführbare Datei abrufen und Ihre Adresse daran anpassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top