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 und MEMORY_BASIC_INFORMATION64 ...


  • Mod

    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 und MEMORY_BASIC_INFORMATION64 ...

    Und die nächste Windows-Version benutzt evtl. einen neuen weiteren Parameter...


Anmelden zum Antworten