我希望讀取與特定進程相關的所有內存。我知道ReadProcessMemory,但由於我沒有使用它的經驗,我擔心我只會得到一堆垃圾(垃圾在......)。C ReadProcessMemory - 如何檢查與進程相關的內存區域
一)我怎麼工作了,從基本指針結束),我可以讀 B中的總區)什麼是最好的方法/最安全的方式遍歷這個區域的內存和打印 C)我怎麼打印它,因爲我不知道它將包含什麼值,以便我可以查看它?
我還希望能夠在輸出中包含內存中每個數據段的實際位置。
由於R.
我希望讀取與特定進程相關的所有內存。我知道ReadProcessMemory,但由於我沒有使用它的經驗,我擔心我只會得到一堆垃圾(垃圾在......)。C ReadProcessMemory - 如何檢查與進程相關的內存區域
一)我怎麼工作了,從基本指針結束),我可以讀 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來看看實際的數據。
您通常需要(或者至少需要)使用大量使用的幾件事情。對於第一個問題,查找可以讀取的內存塊,可以使用VirtualQueryEx
查找進程中的內存區域以及虛擬內存管理器如何標記每個區域。
找東西像單個變量的位置,您通常需要使用調試API - 特別是符號的一部分 - 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
);
是你想要什麼類型的內存?映射的.exe和.dlls?疊加麼?堆?等你究竟想要做什麼? – SteelBytes