簡體   English   中英

C ReadProcessMemory-如何檢查與進程關聯的內存區域

[英]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部分SymInitializeSymGetSymFromNameSymEnumerateSymbols應該可以讓您獲得一個不錯的開始。 還有很多...

謝謝傑里·科芬。 這只是我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM