2010-02-25 79 views
1

我希望讀取與特定進程相關的所有內存。我知道ReadProcessMemory,但由於我沒有使用它的經驗,我擔心我只會得到一堆垃圾(垃圾在......)。C ReadProcessMemory - 如何檢查與進程相關的內存區域

一)我怎麼工作了,從基本指針結束),我可以讀 B中的總區)什麼是最好的方法/最安全的方式遍歷這個區域的內存和打印 C)我怎麼打印它,因爲我不知道它將包含什麼值,以便我可以查看它?

我還希望能夠在輸出中包含內存中每個數據段的實際位置。

由於R.

+0

是你想要什麼類型的內存?映射的.exe和.dlls?疊加麼?堆?等你究竟想要做什麼? – SteelBytes

回答

4

內存在的頁(通常4096個字節)爲單位進行訪問。如果您單獨閱讀每個頁面,則可以知道如果讀取失敗,該頁面不可讀,您可以跳過該頁面。

#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); 
4

開始VirtualQueryEx,以確定哪些進程的地址空間的部分有備份它們的頁面,那麼一旦你知道什麼是在那裏,你可以使用ReadProcessMemory來看看實際的數據。

1

您通常需要(或者至少需要)使用大量使用的幾件事情。對於第一個問題,查找可以讀取的內存塊,可以使用VirtualQueryEx查找進程中的內存區域以及虛擬內存管理器如何標記每個區域。

找東西像單個變量的位置,您通常需要使用調試API - 特別是符號的一部分 - SymInitializeSymGetSymFromName,並可能SymEnumerateSymbols應該讓你體面的開始。還有不少...

0

謝謝你傑裏棺材。這只是我在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; 
在WINBASE.H

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