【发布时间】: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