我正在尝试使用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);

当我运行程序以及读取数组的程序时,我得到了空值和垃圾值。

最佳答案

您使用固定地址,这通常是一个非常糟糕的主意,现在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);

09-08 08:52