【问题标题】:Can I access random data with random memory Addresses outside of my C++ Program我可以在我的 C++ 程序之外使用随机内存地址访问随机数据吗
【发布时间】:2014-12-18 04:44:26
【问题描述】:

如果 2 个程序正在运行,并且一个程序在内存地址存储一个数字,并且如果我知道该内存地址,并将其硬编码到第二个程序中并打印出该地址处的值,它实际上会得到那个信息? C++ 是否允许程序访问存储在 RAM 中的任何数据,无论它是否是程序的一部分?

【问题讨论】:

  • 对于 Windows,您可以使用 ReadProcessMemory()。但是你没有提到操作系统。参考:msdn.microsoft.com/en-us/library/windows/desktop/…
  • C++ 不会阻止您,但 操作系统 很可能会这样做。请记住,现代多用户操作系统通过多种方式将进程彼此分离。其中之一是该进程在 RAM 中并没有真正的地址,它们具有 virtual 地址,并且一个进程中的一个虚拟地址与另一个进程中的虚拟地址不同。可能有特定于操作系统的函数来访问其他进程的内存,但它们不是 C++ 的一部分,并且它们的使用通常需要提升权限(否则您会遇到巨大的安全漏洞)。
  • 这个问题与C/C++无关。要了解原因,请阅读虚拟内存:en.wikipedia.org/wiki/Virtual_memory
  • 如果你想在进程之间共享内存,你可能应该使用shared memory
  • 即使共享内存也不能满足要求,因为(在大多数系统中)共享内存可以映射到虚拟地址空间中的不同页面。

标签: c++ pointers ram memory-address


【解决方案1】:

在没有虚拟内存管理和地址空间保护的系统上,这将起作用。从 C 标准的角度来看,这将是未定义的行为,但它会产生您期望的行为。

坏消息是,当今使用的大多数计算机系统都同时具有虚拟内存管理和地址空间保护功能。这意味着内存地址,即程序看到的数字,在系统中不是唯一的。系统中的每个进程可能会看到相同的地址,但它会在任何给定时刻映射到您计算机上的不同物理地址。操作系统和硬件会给每个进程造成一个错觉,以为它可以控制那个内存地址,而实际上进程的内存空间不会重叠。

好消息是现代操作系统支持某种形式的共享内存访问,这意味着一个进程可以与其他进程共享一段内存,并通过在该共享段中读取和写入数据来交换数据。

【讨论】:

  • 计算机系统保护一个程序不从另一个程序访问 RAM 不是个好消息吗?
  • @PieterDeBie 只对帖子中描述的策略来说是个坏消息。对于每个程序员来说,这都是个好消息(除了黑客,他们讨厌这个)。
【解决方案2】:

不,你会得到一个Segmentation Fault

如果我尝试运行此代码:

int main(int argc, char *argv[]) {
    int *ptr = (int*) 0x1234;
    *ptr = 10;
}

我会遇到分段错误(除非进程出于某种原因分配了 0x1234),这是操作系统告诉您不允许这样做的方式。通常它们会在您使用指针做一些棘手的事情时发生,但它们也可能发生在其他地方。

默认情况下,它们会立即终止您的程序,除非您在调试器中运行或已注册信号处理程序以继续您的程序

编辑:如果你真的想要,有办法让操作系统让你这样做,调试器等使用。

【讨论】:

    猜你喜欢
    • 2015-05-22
    • 1970-01-01
    • 2016-04-15
    • 2011-07-08
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2015-09-10
    相关资源
    最近更新 更多