[Win API] Wie Liste aller Speicherregionen eines Prozesses bekommen?



  • Hallo,

    ich bin noch an der Planung eines Tools, das den virtuellen Speicher eines emulierten Spiels verarbeiten kann. Das Problem ist, dass der virtuelle Speicher und auch die Speicherregionen, in der sich Informationen zum Spiel befinden (ID, Titlel, usw) sich nicht immer im selben Bereich befinden.
    Noch problematischer wird das, wenn ich neue Revisionen des Emulators nutze.
    Viel einfacher wäre es, könnte ich (so, wie es Cheat Engine kann) eine Liste aller Speicherregionen + Zugriffsberechtigungen und Größe zurückliefern.
    Dann könnte ich leicht anhand der Größe und Signatur die richtige Region finden.

    Den Speicher in 0x1000 Bytes (Seitengröße) nach Speicherbereichen abzutasten ist bei Programmen, die den 64bit-Addressbereich überschreiten nicht möglich..

    Daher würde ich gerne zum Testen eine Konsolenanwendung schreiben, die, wenn ich die PID habe, mir alle Speicherbereiche + Zugriffsberechtigung und Größe ausgibt.

    Aufgefallen ist mir die Funktion VirtualQueryEx().

    Scheint so, als könne man damit etwas anfangen. Hier ist der Quellcode von Cheat Engine, der diese Liste der Regionen ausgibt und unter anderem von dieser Funktion gebrauch macht.

    Angeonnem ich habe:

    DWORD pid;
    LPVOID address;
    HANDLE hProcess;
    PMEMORY_BASIC_INFORMATION buffer;
    
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    

    Wie könnte ich nun die Addresse der ersten Speicherregion bekommen, und deren Größe?

    danke 🙇🏻♀

    EDIT:
    Sorry, mir ist erst gerade aufgefallen, dass es ein Win API-Subforum gibt. Bitte verschieben!

    Habe noch etwas herumesperimentiert und das erreicht:

    DWORD pid;
    LPVOID address;
    HANDLE hProcess;
    MEMORY_BASIC_INFORMATION buffer = { 0 };
    int val;
    
    int main()
    {
    	cout << "pid: \n";
    	cin >> pid;
    	cout << "addr(hex): \n";
    	cin >> hex >> address;
    
    	hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    	cout << hProcess << endl;
    	cout << VirtualQueryEx(hProcess, address, &buffer, sizeof(buffer));
    	cout << hex << buffer.BaseAddress << " - " << hex << buffer.RegionSize << endl;
    

    Ausgabe: 480000000000000000 - 29f90000

    Die Regiongröße des Base-Address stimmt, wenn ich es mit dem Ergebnis aus CheatEngine vergleiche.
    Stellt sich nur die Frage, warum die Base-Address nicht einfach 0 ist?
    Und wie ich die weiteren Bereiche bekomme..

    EDIT 2:
    Ich fass es nicht, habs selbst gelöst bekommen.
    bei der Base-Address einfach nur die "48" wegdenken.
    Habe dann immer die RegionSize hinzuaddiert, um den nächsten Range zu bekommen.

    	while(address < 0x7FFF00000000)
    	{
    		VirtualQueryEx(hProcess, (LPVOID)address, &buffer, sizeof(buffer));
    		cout << hex << buffer.BaseAddress << " - " << hex << buffer.RegionSize << endl;
    		address += buffer.RegionSize;
    	}
    

    Sorry für den nutzlosen Post. Aber vielleicht findet jemand anderes es ja nützlich


Anmelden zum Antworten