2017-04-09 3 views
-2

Ich habe in letzter Zeit mit einem sehr nervigen Problem mit dem Schreiben in Prozess-Speicher in C++ gekämpft ... Ich kann nicht in Prozessspeicher mit mehreren Offsets schreiben! Obwohl es Tausende von Seiten gibt, die erklären, wie Sie dieses Problem beheben, scheint es immer noch nicht für mich zu funktionieren. Ich habe den ganzen Tag auf Google gesucht und viele Beispiele gefunden, wie ich dieses Problem beheben kann, aber es scheint immer noch nicht für mich zu funktionieren.WriteProcessMemory mit mehreren Offsets C++

Also lassen Sie mich zuerst erklären, wie ich schreibe, um Speicher selbst zu verarbeiten, und Sie könnten es möglicherweise danach korrigieren.

Lassen Sie uns sagen, ich habe eine Basisadresse: 0x04AF3C94

Erste Offsets als: 0x1C

zweiten Offsets wie: 0x20

Dritte als: 0x568

Und viertens als: 0x134

Wie mache ich das selbst:

DWORD offset1 = 0x1C; 
DWORD offset2 = 0x20; 
DWORD offset3 = 0x568; 
DWORD offset4 = 0x134; 

DWORD base = 0x04AF3C94; 
DWORD pointer; 
DWORD pointer2; 
DWORD pointer3; 
DWORD pointer4; 
DWORD pointer5; 
ReadProcessMemory(handle, LPVOID(base), &pointer, sizeof(pointer), 0); 
ReadProcessMemory(handle, LPVOID(pointer + offset1), &pointer2, sizeof(pointer2), 0); 
ReadProcessMemory(handle, LPVOID(pointer2 + offset2), &pointer3, sizeof(pointer3), 0); 
ReadProcessMemory(handle, LPVOID(pointer3 + offset3), &pointer4, sizeof(pointer4), 0); 
ReadProcessMemory(handle, LPVOID(pointer4 + offset4), &pointer5, sizeof(pointer4), 0); 

int value = 500; 
WriteProcessMemory(handle, LPVOID(pointer5), &value, sizeof(value), 0); 

Wie Sie sehen können, wenn ich 4 Offsets wie in diesem Beispiel habe, füge ich jeden Offset einzeln zur Basisadresse hinzu, bis ich einen Wert habe, der jeden zur Basisadresse hinzugefügten Offset speichert. Das funktioniert offenbar nicht, was soll ich machen !?

+0

_Das scheinbar nicht funktionieren_ - was * genau * nicht funktioniert, erleben Sie einen Absturz beim Lesen, Schreiben oder das Universum plötzlich neu gestartet? – zett42

+0

Nun, wenn ich zum Beispiel Wert habe ich möchte ändern, wird es nicht ändern ... Das Programm stürzt nicht ab oder nichts, aber die Werte, die ich versuche zu ändern, sind einfach nicht betroffen. –

Antwort

0

Ich kann nicht auf alle mit Ihrer Beschreibung antworten, aber in der MSDN sagen sie, dass ReadProcessMemory Speicher lesen von wo es zum gegebenen Puffer gefragt wird. Das heißt, wenn Sie anrufen ...

... Ihr "Zeiger" wird mit dem gefüllt, was an der "Basis" -Adresse ist. Es wird also eine Adresse enthalten, die numerisch der Wert der vier Bytes in der Adresse "base" ist. Das ist wahrscheinlich nicht das, was Sie wollen, denn wenn Sie dort vorher nichts gespeichert haben, ist es unbestimmt. Und wenn ja, wird es wahrscheinlich abstürzen, wenn Sie "Zeiger" verwenden.

Wenn Sie den Speicher auf adresse „Basis + offset1“ mit dieser Funktion lesen möchten, was Sie tun müssen, ist:

ReadProcessMemory(handle, LPVOID(base + offset1), some_buffer, some_buffer_size, 0); 

Wo some_buffer ein gültiger Puffer Sie irgendwo deklarieren müssen.

Verwandte Themen