visualstudio 2012-如何在c++中修改对象已知内存地址

visual studio 2012 - How to modify object knowing memory adress in c++?

本文关键字:对象 内存 地址 修改 2012- c++ visualstudio      更新时间:2023-10-16

晚上好。

我打开了Visual Studio 2012并运行了这样的程序:

    double x = 8768130;
    cout << &x;
    cin.get();
    return 0;

它在控制台中写入的地址是003CFBF8

然后,我打开了Visual Studio的另一个副本,并试图阅读这篇文章,但我不确定我做得是否正确。在发布之前,我已经在Stack Overflow中进行了搜索,发现我应该做这样的事情:

    double* ptr = reinterpret_cast<double*>(0x003CFBF8);
    cout << *ptr;

但它产生了异常

Unhandled exception at 0x00A943DD in Project2.exe: 0xC0000005: Access violation reading location 0x003CFBF8.

这是什么意思?我没有访问权限?我做错了?

如果你问我为什么要这么做,我正在从一些书中学习C++,我想看看volatile是如何工作的。这就是为什么我想:

  • 打开第一个程序,初始化变量,写入其地址
  • 打开第二个程序并修改写入的地址
  • 在第一个程序中写入变量,检查是否一切正常

我打开了另一份Visual Studio。。。

这就是你的问题所在。所有现代系统都使用虚拟内存,这意味着一个进程不允许接触另一个进程的虚地址空间。这是由处理器强制执行的。

您可以在同一进程(程序)中潜在地执行此操作。然而,现代操作系统也支持ASLR(地址空间布局随机化),这意味着每次执行程序时,一段代码或数据可能会加载到不同的虚拟地址。

如果你想访问另一个进程的内存,最好的办法可能是使用操作系统的调试API。具体来说,在Windows上,您可以调用WriteProcessMemory

如果你只想玩volatile(内存可能会从你下面变掉),你应该考虑生成另一个线程,它会定期修改一个全局可访问的变量。