我能否访问C++程序之外的随机内存地址中的随机数据?

5

如果有两个程序在运行,其中一个程序将数字存储在内存地址中,我知道这个内存地址,并将它硬编码到第二个程序中并打印出该地址的值,那么它是否实际上获得了该信息?C++允许程序访问存储在RAM中的任何数据,无论是否属于程序吗?


2
对于Windows系统,您可以使用ReadProcessMemory()函数。但是根据您的描述,我们并不清楚您所使用的操作系统是哪个。参考链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553%28v=vs.85%29.aspx - Inisheer
3
C++ 不会阻止你,但是 操作系统 很可能会这样做。请记住,现代多用户操作系统通过许多手段将进程彼此分离。其中之一是进程在 RAM 中并没有真正的地址,它们有 虚拟 地址,并且一个进程中的一个虚拟地址与另一个进程中的一个虚拟地址不同。可能有特定于操作系统的函数来访问其他进程的内存,但它们不是 C++ 的一部分,它们的使用通常需要提升的权限(否则你将拥有巨大的安全漏洞)。 - Some programmer dude
1
这个问题与C/C++无关。要理解原因,请阅读有关虚拟内存的内容:http://en.wikipedia.org/wiki/Virtual_memory - MrEricSir
1
如果你想在进程之间共享内存,你应该使用共享内存 - Some programmer dude
即使共享内存也无法完成所需的操作,因为(在大多数系统中)共享内存可以映射到虚拟地址空间中的不同页面。 - user3344003
2个回答

8

不,你会得到一个“分段错误”。

如果我尝试运行这段代码:

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

除非进程已经为某些原因分配了0x1234,否则我会得到一个段错误,这是操作系统告诉您不允许那样做的方式。通常它们发生在您使用指针进行复杂操作时,但也可能发生其他地方。

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

编辑:如果您真的想要,有方法可以让操作系统允许您这样做,调试器等使用此方法。


8
在没有虚拟内存管理和地址空间保护的系统中,这将起作用。从C标准的角度来看,它将是未定义的行为,但它将产生您所期望的行为。
坏消息是,大多数计算机系统现在都具有虚拟内存管理和地址空间保护。这意味着内存地址,即您的程序看到的数字,在系统中并不唯一。系统中的每个进程可能看到相同的地址,但在任何给定的时间点上,它将被映射到计算机上的不同物理地址。操作系统和硬件将为每个进程创建幻觉,使其控制该内存地址,而实际上进程的内存空间不会重叠。
好消息是,现代操作系统支持某种形式的共享内存访问,这意味着一个进程可以与其他进程共享一段内存,并通过读写该共享段中的数据来交换数据。

计算机系统保护一个程序不会访问另一个程序的RAM,这难道不是好消息吗? - Pieter De Bie
1
@PieterDeBie 这只是针对帖子中描述的策略而言的坏消息。对于每个程序员来说,这都是好消息(除了黑客,他们讨厌这个)。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接