[英]C ReadProcessMemory - how to examine the memory area associated with a process
我想讀取與特定進程關聯的所有內存。 我知道ReadProcessMemory,但是由於我很少有使用它的經驗,所以我擔心我只會得到很多垃圾(垃圾...)。
a)從基址指針到末尾如何算出我可以讀取的總區域b)遍歷此內存區域並打印它的最佳方法/最安全的方法是什么c)給定我如何打印它我不知道它將包含什么值以便我查看?
我還希望能夠在輸出中包括內存中每個數據的實際位置。
謝謝R。
可以以頁為單位(通常為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);
從VirtualQueryEx開始,以確定進程的地址空間的哪些部分有頁面對其進行備份,然后一旦知道什么位置,就可以使用ReadProcessMemory查看實際數據。
要充分利用ReadProcessMemory
通常需要(或者至少要)做幾件事。 對於第一個問題,找到可以讀取的內存塊,可以使用VirtualQueryEx
查找進程中的內存區域,以及虛擬內存管理器如何標記每個區域。
要查找諸如各個變量的位置之類的東西,通常需要使用調試API-特別是Symbol部分SymInitialize
, SymGetSymFromName
和SymEnumerateSymbols
應該可以讓您獲得一個不錯的開始。 還有很多...
謝謝傑里·科芬。 這只是我在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
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.