1

我正在尝试编写一个变量监视类,它允许我向它传递一个指针(理想情况下为 void*),以寻址通常完全超出范围或类无法访问的内存位置。然后该类将定期在屏幕上以文本形式显示该内存位置的内容 - 以用户定义的方式解释(例如 (int*) )。我只会使用这个指针从内存中读取,它会作为一种肮脏的黑客手段,在开发过程中为我暂时感兴趣的在运行时监控的变量启用一种监视窗口——而无需引入大量代码来带来这些变量在范围内/类可访问。

我正在使用 VC++ 2010,它似乎完全拒绝让我什至将超出范围的内存位置地址写入指针。

我猜想在 Windows 的引擎盖下发生了很多事情,因此随着内存位置的变化,这种方法的适用性可能非常有限,但我使用的是本机 C++,所以希望我的地址足够持久以便有用。此外,我可以看到它不希望我访问我的程序出于安全原因实际上没有使用的内存位置......

任何想法我怎么能做到这一点?(我意识到使用这样的指针会导致未定义的行为,因此只会从它们中读取并显示值)。

谢谢。

4

1 回答 1

1

尝试取消引用指向您可以解释的任何空间之外的指针几乎没有意义。您可能正在访问的地址甚至可能没有映射到进程的内存空间中,因此实际上甚至没有什么可看的。
当您的流程开始时,您实际上并没有 4 GB 可供您使用。内存空间大小为 4 GB,但它主要由未映射到您的进程的孔组成。

最终,这一切都归结为您获得要使用的指针的位置。您通常可以考虑的内存地址可能来自:

  • 堆分配 - 由mallocor分配new但尚未分配的范围内的任何东西freed ordeleted
  • 堆栈空间、全局变量——您在程序中当前位置范围内定义为变量的任何内容。访问在其他范围内定义的任何内容都是没有意义的(例如,从函数返回指向局部变量的指针)
  • 代码段 - 包含未卸载的进程的 DLL 或 EXE 的内存段内的地址。通常您只能以只读方式访问它们。例如,您可以通过查找函数的返回地址来找到此类地址。

访问刚刚释放的内存块中的指针正是这种无意义的情况。释放内存后,很有可能它已经返回到操作系统,并且该地址不再映射到您的进程。

您可以在此处进一步了解此内容

于 2011-03-25T14:05:45.437 回答