C++;:无法使用其他程序读取我的程序的特定内存地址中的值 我现在正在学习C++,我决定我要给它一个镜头,试着写一个简单的程序,它可以读取存储在内存中的其他程序的值(稍后可以修改这些值)。

C++;:无法使用其他程序读取我的程序的特定内存地址中的值 我现在正在学习C++,我决定我要给它一个镜头,试着写一个简单的程序,它可以读取存储在内存中的其他程序的值(稍后可以修改这些值)。,c++,memory,memory-address,C++,Memory,Memory Address,为了测试它,我写了一个程序,做一个简单的加法,然后运行我的另一个程序,我试图用内存中的地址实时读取第一个程序的值 代码将帮助您更好地理解我的意思 我要从中读取值的“目标”程序: #include <iostream> #include <windows.h> #include <conio.h> using namespace std; int main() { int userValue=0; int total=0; int*

为了测试它,我写了一个程序,做一个简单的加法,然后运行我的另一个程序,我试图用内存中的地址实时读取第一个程序的值

代码将帮助您更好地理解我的意思

我要从中读取值的“目标”程序:

#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

int main()
{
    int userValue=0;
    int total=0;
    int* t;
    SetWindowText(NULL, "Memory");

    while(1)
    {
    cin >> userValue;
    total += userValue;
    t = &total;
    cout << *t << endl;
    cout <<"Pointer: " << &t <<" Total: " << &total;
    }

    getch();
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int userValue=0;
int-total=0;
int*t;
SetWindowText(空,“内存”);
而(1)
{
cin>>用户价值;
合计+=用户值;
t=&total;

cout&t=指向总计的指针的地址

&总计=实际“总值”的地址

在第一个程序中,您应该输出“&total”

在第二个程序中,应使用ReadProcessMemory读取第一个程序输出的地址


如果不起作用,则必须以管理员身份运行第二个程序才能获得权限。如果仍有问题,请在每次Windows API调用后调用GetLastError(),检查ReadProcessMemory()的返回值并使用ReadProcessMemory()的最后一个参数用于错误检查。

存在地址空间布局随机化:。您是否每次更改地址时都会调整地址(应该是每次运行第一个程序时调整地址)?等一下。您没有在第一个程序中创建窗口。因此,您在第二个程序中找不到窗口。是的,每次更改地址时,我都在调整地址,这就是为什么我有“是否可以为窗口设置标题,即”内存“您将标题设置为句柄为NULL的窗口,该窗口将失败。您的第一个程序中没有窗口,因此您的第二个程序将找不到它。您的第二个程序应该告诉您,因为您选中并返回了
“未找到窗口!\n”
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
    DWORD address = 0x28FEF0;
    int value = 0;
    DWORD pid;
    HWND hwnd;
        hwnd = FindWindow(NULL,"Memory");
    if(!hwnd)
    {
    cout <<"Window not found!\n";
    cin.get();
    }
    else
    {
    GetWindowThreadProcessId(hwnd,&pid);
    HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
        if(!phandle)
        {
        cout <<"Could not get handle!\n";
        cin.get();
        }
        else
        {
        while(1)
        {
        ReadProcessMemory(phandle,(void*)address,&value,sizeof(value),0);
        cout << value << "\n";

        Sleep(1000);
        }
        return 0;
        }
    }
}