我正在尝试使用ReadProcessMemory()API函数读取控制台程序的进程内存。
更新代码:
HWND hWnd = FindWindow(NULL, "Read Memory Window");
DWORD ProcessId;
ProcessId = GetProcessId(hWnd);
GetWindowThreadProcessId(hWnd, &ProcessId);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE, ProcessId);
SIZE_T NumberOfBytesRead;
CHAR Buffer[128] = {0};
dwAddr = 0x0012FD6C; //address of array to get
BOOL sucess = ReadProcessMemory(hProcess, &dwAddr, &Buffer, 128, &NumberOfBytesRead);
我得到null和垃圾值,因为我运行程序和程序来读取数组。
答案 0 :(得分:3)
你使用一个固定的地址,这通常是一个非常糟糕的主意,现在windows vista和windows 7使用ASLR更是如此,这使得即使是基于固定的模块也不安全(即使ASLR不安全,因为图像可以出于各种原因重新分配)。
另外,该地址看起来非常狡猾,你是如何得出那个地址的?它是否正确调整为虚拟地址而不是相对地址?
最后,最重要的是,你不应该像你一样传递地址和缓冲区,它应该像这样传递:BOOL sucess = ReadProcessMemory(hProcess, (LPVOID)dwAddr, &Buffer[0], 128, &NumberOfBytesRead);
或
BOOL sucess = ReadProcessMemory(hProcess, (LPVOID)dwAddr, Buffer, 128, &NumberOfBytesRead);