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