Windows 10 是否保护您不访问其他程序正在使用的内存?

Does Windows 10 protect you from accessing memory that another program is using?

本文关键字:内存 程序 其他 是否 保护 访问 Windows      更新时间:2023-10-16

以下C++代码有效:

int *p = new int;
p[1000] = 12;

这意味着我访问的内存位置距离 p 的大小 (int) * 1000 字节。

我在想的是,也许 Windows 或任何其他程序当前正在使用内存位置 &p[1000] 来做某事。如果我厌倦了将 p[1000] 设置为新值,那么另一个程序甚至可能使用该位置来保存一些内存的 Windows 可能会崩溃,因为我更改了该程序的重要变量。

由于C++并没有禁止这样做,我想知道至少 Windows 是否对使用其他人当前使用的内存位置的程序具有某种保护。

在 Windows(和所有其他现代消费者操作系统)上,写入不属于您的内存地址不会直接影响属于任何其他进程的内存。

但是,操作系统可能正在使用该内存为您的程序提供基本服务,或者该地址可能根本不有效,因此覆盖您不拥有的地址可能会导致您的程序崩溃或以意外方式运行,无论是立即还是在将来的某个不可预测的时刻。 谷歌"未定义的行为",以进一步讨论为什么这是一件坏事。

就Windows而言,我模糊地记得GUI使用一些用户模式的共享内存(为了提高效率),所以如果你真的很不幸,那么写入错误的地址可能会导致其他GUI程序出现故障,甚至整个GUI变得无响应,从用户的角度来看,这看起来非常类似于操作系统挂起。 不过,我认为我从未见过这种情况发生,所以也许我的信息已经过时,或者有适当的保护机制来降低这种情况的可能性。 (这并不代表安全漏洞,因为它只影响用户的其他程序,并且恶意程序可以通过任何其他更可靠的方式达到相同的效果。

内存被组织成 PAGES。每个进程都会看到一个逻辑地址空间,该空间由编号为 0-N 的页组成。

逻辑地址空间分为两个范围:用户空间和系统空间。

每个进程都有自己唯一的用户空间,所有进程共享相同的系统空间。您的用户空间页面 10 映射到不同的物理位置,然后映射到其他进程的用户空间页面 10(在大多数情况下)。

系统空间中的内存受到保护,无法访问用户模式。写入它的唯一方法是切换到内核模式。操作系统将执行此操作的方式限制为对特定系统服务的调用。因此,如果没有错误(但我们在这里谈论的是 M$),您应该无法随意修改系统空间。

两个应用程序可以映射内存,以便它们在用户模式下共享内存位置。在这种情况下,你可以把事情搞砸,做你正在说明的事情。但是,您必须在两个进程中显式映射内存。

每个进程都有自己的地址空间。这个空间映射到真正的地址。它们不重叠。