【问题标题】:Does Windows 10 protect you from accessing memory that another program is using?Windows 10 是否可以防止您访问其他程序正在使用的内存?
【发布时间】:2017-10-12 23:35:35
【问题描述】:

以下 C++ 代码有效:

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

意思是我访问一个距离 p 大小为 sizeof (int) * 1000 字节的内存位置。

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

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

【问题讨论】:

  • 它不起作用,它表现出未定义的行为。
  • 不确定是否是欺骗,因为它不是 Windows 特定的:stackoverflow.com/questions/27539388/…
  • “至少 Windows”是否包括 Windows 3.11 及更早版本?
  • 进程内存保护由硬件管理,查找“MMU”
  • 这是保护模式操作系统(如 Windows)最基本的工作,以确保您永远不会弄乱另一个进程的地址空间。今天的操作系统以它的方式工作,很大程度上是因为 C 允许这样做。并非总是done this way,但竞争方法无法生存。

标签: c++ windows memory memory-management shared-memory


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-11
        • 2012-01-01
        • 2015-05-15
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        相关资源
        最近更新 更多