我尝试使用以下代码读取进程的内存:
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)
但我不知道为什么。
你能帮帮我吗? 谢谢。答案 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,这通常是未初始化的。
请记住,如果您尝试从另一个进程读取字符串,则如果它不是以空值终止并且只读取正确的字节数,则您需要对硬编码字符串大小进行反向工程。