我知道Windows可以选择在关闭时清除页面文件。
当Windows进入或超出范围时,Windows是否对实际的物理/虚拟内存做了什么特别的事情?
例如,假设我运行应用程序A,它将可识别的字符串写入内存中的变量,然后关闭应用程序。然后我运行应用程序B.它分配一大块内存,保留未初始化的内容,并在其中搜索由应用程序A写入的已知字符串。
应用程序B是否有可能获取应用程序A写入的字符串?或者Windows在使内存可用之前擦除它?
答案 0 :(得分: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));
不要忘记阅读Raymond Chen的这篇有趣的 article 。