我想读取内存中另一个程序的变量,一个指向int的指针。我想要这个int。但是我遇到了一个错误。指针的地址为0x420CEFFC40,其值为0x420CEFFC30,缓冲区应为123456,但访问受到限制。
#include <Windows.h>
#include <iostream>
using namespace std;
int main()
{
DWORD pid;
cout<<"INPUT PID:";
cin>>pid;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if(hProcess==NULL)
{
cout<<"OpenProcess failed.Error code:"<<GetLastError()<<endl;
system("pause");
return EXIT_FAILURE;
}
uintptr_t memaddress;
uintptr_t buffer;
cout<<"Target memory address:";
cin>>hex>>memaddress;
if (!ReadProcessMemory(hProcess,(LPCVOID)&(*(uintptr_t*)memaddress),(LPVOID)&buffer,sizeof(int),NULL))
{
cout<<"ReadProcessMemory failed.Error code:"<<GetLastError()<<endl;
return EXIT_FAILURE;
}
cout<<"buffer:"<<*(uintptr_t*)buffer<<endl;
system("pause");
return 0;
}
我收到了一个“访问冲突读取位置0x000000000CEFFC30。”但是,为什么呢?
在现代操作系统中,每个进程都有自己的内存映射。同一地址下的每个进程可以拥有不同的内存,甚至什么也没有。
您的操作系统不允许您读取内存(访问该地址),因为该内存不属于您的程序。简而言之,如果每个程序都可以访问属于其他程序的内存,那么事情就会开始出现错误。因此,这是禁止的。