Windows是否清除内存页?

Windows是否清除内存页?,windows,memory,Windows,Memory,我知道Windows有一个选项,可以在页面文件关闭时清除该文件 当实际物理/虚拟内存进入或超出范围时,Windows是否对其进行了特殊处理 例如,假设我运行应用程序A,将可识别的字符串写入内存中的变量,然后关闭应用程序。然后我运行应用程序B。它分配一大块内存,使内容未初始化,并在其中搜索应用程序a编写的已知字符串 应用程序B是否有可能拾取应用程序A编写的字符串?或者Windows会在释放内存之前先清除它吗?Windows会在将某个进程返回的已释放内存分配给其他进程之前“清除”该内存。有一个内核线

我知道Windows有一个选项,可以在页面文件关闭时清除该文件

当实际物理/虚拟内存进入或超出范围时,Windows是否对其进行了特殊处理

例如,假设我运行应用程序A,将可识别的字符串写入内存中的变量,然后关闭应用程序。然后我运行应用程序B。它分配一大块内存,使内容未初始化,并在其中搜索应用程序a编写的已知字符串


应用程序B是否有可能拾取应用程序A编写的字符串?或者Windows会在释放内存之前先清除它吗?

Windows会在将某个进程返回的已释放内存分配给其他进程之前“清除”该内存。有一个内核线程专门用于此任务

零页线程以最低优先级运行,负责在将空闲页移到零页列表之前将其清零


与其担心将敏感数据保留在分页文件中,还不如首先担心继续将其保留在内存中(使用后)。关闭时清除页面文件不是默认行为。此外,系统崩溃转储将包含RAM中“纯文本”形式的任何敏感信息

只要内存分配给进程,Windows就不会“清理”内存(显然)。相反,这要由程序(mer)来完成。为此,可以使用该函数

此函数定义为
RtlSecureZeroMemory()
函数(请参见
WinBase.h
)。
RtlSecureZeroMemory()
的实现是内联提供的,可以在任何版本的Windows上使用(请参见
WinNT.h

<>使用此函数,而不是< >代码>零码()/<代码> <强> >当您想确保您的数据将被立即覆盖时,因为某些C++编译器可以通过完全删除它来优化对<强> >代码> ZrimeMeRyRyor(< /代码> < /强>)的调用。
WCHAR szPassword[MAX_PATH];

/* Obtain the password */
if (GetPasswordFromUser(szPassword, MAX_PATH))
{    
    UsePassword(szPassword);
}

/* Before continuing, clear the password from memory */
SecureZeroMemory(szPassword, sizeof(szPassword));

别忘了读一读陈雷蒙写的这篇有趣的文章。

不,那是不可能的。内核使用零页线程清除释放的RAM页面,并将它们添加回页面缓存中,以便再次重用。使用像superuser.com这样的网站来询问更多关于它的问题。在任何操作系统中,获取存储的两种方法都是分页或请求零页,这是非常标准的。如果Windows做了任何不同的事情,我会非常惊讶。标题谈到了分页,但问题是释放和分配。请修改标题以匹配问题或问题以匹配标题。您正在讨论的案例与OP提出的案例不同。OP关注的是跨流程自由/分配。你说的是单个应用程序在不向操作系统释放内存的情况下重用自己的内存。@RaymondChen我同意这个问题显然是关于跨进程自由/分配的。然而,我想在OP上强调的是,这是他最不担心的事情,还有其他更微妙的攻击载体。更新了答案,进一步澄清了这一点。你的观点似乎很好地说明了我想表达的观点,因此我把它联系了起来。我希望你不介意。:-)我对“从磁盘或内核分配读取页面”这一行感到困惑,它将空闲页面列表传输到进程工作集中。如果内存用于映射文件,因为数据将在进程看到它之前被覆盖,那么它不应该在使用之前被零页线程调零吗?@caramel1995(即重用页面而不首先调零页面)。