C ++ ReadProcessMemory返回奇怪的字符

时间:2017-11-03 21:43:28

标签: c++ windows winapi char readprocessmemory

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

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)

但我不知道为什么。

你能帮帮我吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

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

缓冲区未初始化,因为ReadProcessMemory失败,它会在缓冲区内打印未初始化内存的char表示。

以下是您修改的代码,用于在当前进程中调用变量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,这通常是未初始化的。

请记住,如果您尝试从另一个进程读取字符串,则如果它不是以空值终止并且只读取正确的字节数,则您需要对硬编码字符串大小进行反向工程。