4

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

当实际物理/虚拟内存进入或超出范围时,Windows 是否会对它做任何特殊处理?

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

应用程序 B 是否有可能获取应用程序 A 写入的字符串?或者 Windows 会在内存可用之前对其进行清理吗?

4

1 回答 1

10

在将进程返回的释放内存分配给其他进程之前,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));

不要忘记阅读 Raymond Chen 的这篇有趣的文章

于 2013-08-22T16:28:27.080 回答