访问冲突读取位置…,让我感到困惑

问题描述 投票:0回答:2

我想读取内存中另一个程序的变量,一个指向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;
}

screenshot1

screenshot2

code screenshot

我收到了一个“访问冲突读取位置0x000000000CEFFC30。”但是,为什么呢?

c++ memory-management
2个回答
0
投票

在现代操作系统中,每个进程都有自己的内存映射。同一地址下的每个进程可以拥有不同的内存,甚至什么也没有。


-1
投票

您的操作系统不允许您读取内存(访问该地址),因为该内存不属于您的程序。简而言之,如果每个程序都可以访问属于其他程序的内存,那么事情就会开始出现错误。因此,这是禁止的。

© www.soinside.com 2019 - 2024. All rights reserved.