ReadProcessMemory
-
Ich möchte mit ReadProcessMemory den gesamten Speicher eines anderen Programms auslesen. Die Frage ist, wie ich an gültige Start-Adressen komme. Mein bisheriger Ansatz war, jeweils im Abstand von 1024 Byte alle Adressen abzufragen. Dabei würde ich aber Speicher, der nicht an einer 1024-Grenze aligniert ist, übersehen.
Wie komme ich an die Startadressen der allokierten Adressbereiche?
-
Mit VirtualQueryEx kriegst du die gültigen Blöcke raus.
-
Ich hab folgendes versucht:
MEMORY_BASIC_INFORMATION meminfo[1000]; size_t written = VirtualQueryEx(hproc, 0, meminfo, sizeof(meminfo)); written /= sizeof(MEMORY_BASIC_INFORMATION); for (size_t i = 0; i < written; i++) { std::cout << i << ":" << std::endl; std::cout << meminfo[i].AllocationBase << std::endl; std::cout << meminfo[i].BaseAddress << std::endl; std::cout << meminfo[i].RegionSize << std::endl; }
Aber es kommt nur ein Block raus:
0: 0 0 65536
Das kann nicht sein, das Programm, das ich auslese, verbraucht gut 200 MB.
Wenn ich die Funktion richtig verstanden hab, sollte sie mir beginnend an Adresse 0 alle Blöcke liefern (sofern es nicht mehr als 1000 sind).
-
Dein Code ist ja auch irgendwie komisch Warum legst du ein Array mit 1000 MEMORY_BASIC_INFORMATIONs an? Du kriegst die Daten wahrscheinlich blockweise. Musst also in einer Schleife die Startadresse, die du VirtualQueryEx reingibst erhöhen. Such mal nach Beispielen, gibt bestimmt welche.
-
Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant. Welchen Sinn macht es dann, etwas anderes als sizeof(MEMORY_BASIC_INFORMATION) anzugeben? Wer hat sich diese API ausgedacht? Oder hab ich immer noch etwas falsch verstanden?
ok, es geht jetzt, danke für eure Hilfe.
-
Ramanujan schrieb:
Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant.
Es gibt auch
MEMORY_BASIC_INFORMATION32
undMEMORY_BASIC_INFORMATION64
...
-
Swordfish schrieb:
Ramanujan schrieb:
Achso, dann habe ich die Parameter falsch verstanden. Was ist denn dann überhaupt der Sinn des letzten Parameters? Die Größe von MEMORY_BASIC_INFORMATION ist doch konstant.
Es gibt auch
MEMORY_BASIC_INFORMATION32
undMEMORY_BASIC_INFORMATION64
...Und die nächste Windows-Version benutzt evtl. einen neuen weiteren Parameter...