我在Google上搜索了一下,但似乎无法完成这项工作。
privileges();
int pid = getPid("test.exe");
cout << "Process ID :" << pid << endl;
const char* prename;
HANDLE pHandle = OpenProcess(PROCESS_VM_READ , FALSE, pid);
if (pHandle)
{
cout << "Handle Open Success" << endl;
//SIZE_T bytesRead;
if (ReadProcessMemory(pHandle, (void*)0x013831BC, &prename, strlen(prename), NULL))
{
cout << "Read Success" << endl;
cout << prename << endl;
}
else
cout << GetLastError() << endl;
}
return 0;
它将打印“读取成功”,但不会仅将变量打印为空白。我从ollydbg获得的地址(在另一个进程中为字符串的地址),并使用一个函数对其进行了验证。
我还想用writeprocessmemory替换字符串,但是在我了解之前,我需要确保读取正确。
有什么主意吗?
答案 0 :(得分:0)
您的问题就在这里
const char* prename;
ReadProcessMemory(pHandle, (void*)0x013831BC, &prename, strlen(prename), NULL)
您的char指针未初始化,它所指向的随机存储器也未初始化。当您在其上调用strlen时,它试图获取随机内存位置的长度。
第二,您正在使用指针&prename
的地址,它是指针的地址,而不是它应指向的char数组。
要解决此问题,请执行以下操作:
char prename[100];
ReadProcessMemory(pHandle, (void*)0x013831BC, &prename, sizeof(prename), NULL)
sizeof()将返回100,因此您将读取100个字节的内存