C++ReadProcessMemory返回奇怪的字符

C++ ReadProcessMemory returns strange character

本文关键字:字符 返回 C++ReadProcessMemory      更新时间:2023-10-16

我试图用以下代码读取进程的内存:

int main() {
HANDLE hProcess = OpenProcess(PROCESS_VM_READ, 0, FindProcessId());
DWORD me;
cin >> me;
char buffer[256];
ReadProcessMemory(hProcess, (LPVOID)me, &buffer, sizeof(buffer), 0);
cout << "Data read : " << buffer << endl;
system("pause");
return 0;}

但当我启动并输入地址时,如:0x7ffe0014

它打印以下内容:╠╠╠╠╠╠╠╠(这个*256我想)

但我不知道为什么。

你能帮我吗?非常感谢。

缓冲区被定义为一个字符,当您将缓冲区传递给std::cout时,它会打印存储在缓冲区中的字节的字符表示。您试图通过对任意内存地址调用ReadProcessMemory()来填充缓冲区,但失败了。

缓冲区未初始化,由于ReadProcessMemory失败,它正在打印缓冲区内未初始化内存的字符表示。

以下是您修改的代码,以便在当前过程中对变量调用ReadProcessMemory,这可能更容易用于学习目的。

HANDLE hProcess = OpenProcess(PROCESS_VM_READ, 0, GetCurrentProcessId());
char buffer[20];
char* me = "Test";
ReadProcessMemory(hProcess, me, &buffer, sizeof(me)+1, 0);
std::cout << "Data read : " << buffer << std::endl;
system("pause");
return 0;

这将正确地将"数据读取:测试"输出到控制台。

如果你将nullptr分配给"char*me",你会得到同样的结果╠╠╠╠╠╠╠╠"之前得到的mumbo jumbo,因为它将指向通常未初始化的地址0x0

请记住,如果你试图从另一个进程读取字符串,如果硬编码的字符串不是以null结尾,并且只读取正确的字节数,你会希望对其大小进行反向工程。