Windows是否清除内存页面?

use*_*603 3 memory windows

我知道Windows可以选择在关闭时清除页面文件.

当Windows进入或超出范围时,Windows是否对实际的物理/虚拟内存做了什么特别的事情?

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

应用程序B是否有可能获取应用程序A写入的字符串?或者Windows在使内存可用之前擦除内存?

The*_*ist 9

在将进程分配给其他进程之前,Windows "擦除"进程返回的已释放内存.仅有一个内核线程专门用于此任务.

零页面线程运行在最低优先级,并负责将它们移动到归零页面列表之前清零空闲页[1].

 零页面线程


您不必担心在页面文件中保留敏感数据,而应该担心首先将其保留在内存中(使用后).关闭时清除页面文件不是默认行为.系统崩溃转储还将包含RAM中"纯文本"中可能包含的任何敏感信息.

只要将内存分配给进程(显然),Windows就不会 "清理"内存.而是由程序(mer)来做.为此目的,可以使用该SecureZeroMemory()功能.

该函数定义为RtlSecureZeroMemory()函数(参见参考资料WinBase.h).RtlSecureZeroMemory()内联提供的实现可以在任何版本的Windows上使用(请参阅参考资料WinNT.h)

使用此函数而不是ZeroMemory()在您希望确保及时覆盖数据时,因为某些C++编译器可以ZeroMemory()通过完全删除它来优化调用.

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));
Run Code Online (Sandbox Code Playgroud)

别忘了阅读Raymond Chen的这篇有趣的文章.