C ReadProcessMemory – Comment examiner la zone mémoire associée à un processus

Je veux lire toute la mémoire associée à un processus particulier. Je suis au courant de ReadProcessMemory, mais comme je n’ai que peu d’expérience et que je crains de ne pouvoir en extraire que des déchets (des déchets en sortent …).

a) comment puis-je calculer, du pointeur de base à la fin) la région totale lisible b) quel est le meilleur moyen / le plus sûr de parcourir et de l’imprimer sur cette zone de mémoire c) comment l’imprimer que je ne sais pas quelles valeurs il va contenir pour pouvoir le regarder?

J’aimerais également pouvoir inclure dans ma sortie l’emplacement réel de chaque donnée dans la mémoire.

Merci R.

La mémoire est accessible en unités de pages (généralement 4096 octets). Si vous lisez chaque page individuellement, vous pouvez savoir que si la lecture échoue, cette page n’est pas lisible et vous pouvez la sauter.

#define PAGESIZE 4096 char *base = (char *)0; do { char buffer[PAGESIZE]; if (ReadProcessMemory(handle, base, buffer, PAGESIZE, NULL) != 0) { // buffer is valid // the address of buffer[X] is base+X } base += PAGESIZE; // keep looping going until we wrap back around to 0 } while (base != 0); 

Commencez par VirtualQueryEx pour déterminer quelles parties de l’espace d’adressage du processus ont des pages sauvegardées, puis une fois que vous savez où est l’emplacement, vous pouvez utiliser ReadProcessMemory pour examiner les données réelles.

Vous avez généralement besoin (ou du moins, souhaitez) utiliser un ReadProcessMemory de fonctionnalités de ReadProcessMemory . Pour votre première question, recherche de blocs de mémoire lisibles, vous pouvez utiliser VirtualQueryEx pour rechercher les régions de mémoire d’un processus et VirtualQueryEx comment le gestionnaire de mémoire virtuelle a marqué chaque région.

Pour trouver des éléments tels que l’emplacement de variables individuelles, vous devez normalement utiliser l’API de débogage – en particulier la partie symbole – SymInitialize , SymGetSymFromName et éventuellement SymEnumerateSymbols devrait vous permettre de bien démarrer. Il y en a encore beaucoup d’autres …

Merci Jerry Coffin. C’est juste que je cherchais dans winnt.h:

 typedef struct _MEMORY_BASIC_INFORMATION { PVOID BaseAddress; PVOID AllocationBase; DWORD AllocationProtect; DWORD RegionSize; DWORD State; DWORD Protect; DWORD Type; } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 

dans winbase.h:

 VirtualQueryEx( HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength );