【问题标题】:C++: Can not read the value inside a spesific memory address of my program using a different programC++:无法使用不同的程序读取我的程序的特定内存地址内的值
【发布时间】:2020-06-24 12:54:52
【问题描述】:

我目前正在学习 c++,我决定试一试并尝试编写一个简单的程序,该程序可以读取存储在内存中的其他程序的值(并且以后能够修改这些值)。

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

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

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

#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;
}

以及从第一个读取值的程序:

#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;
        }
    }
}

第二个代码取自论坛(谷歌搜索后),如果我将它与任何其他程序一起使用,它可以正常工作,但它根本不想与我的程序一起工作。

我尝试将地址更改为指针 t 和实际整数 total,但没有任何效果。

我觉得我在第一个程序而不是第二个程序中做错了。

我正在使用带有 GCC 编译器的 Code:Blocks。

提前感谢您的帮助!

哦,圣诞快乐!

【问题讨论】:

  • 有地址空间布局随机化:en.wikipedia.org/wiki/Address_space_layout_randomization。您是否在每次更改时调整地址(应该是每次运行第一个程序时)?
  • 等一下。您没有在第一个程序中创建窗口。所以一秒都找不到..
  • 是的,我每次更改地址时都会调整地址,这就是为什么我有 "cout 在第一个程序中。我为窗口设置了一个标题,即“内存”,我不确定你说我没有创建一个是什么意思。
  • 我为窗口设置了标题,即“内存”您将标题设置为句柄为 NULL 的窗口,这将失败.您的第一个程序中没有窗口,因此您的第二个程序将找不到它。你的第二个程序应该告诉你,因为你检查并返回"Window not found!\n"

标签: c++ memory memory-address


【解决方案1】:

&t = 指向total的指针的地址

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 2012-08-31
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2021-01-10
    • 2020-05-22
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多