我知道 Windows 有一个选项可以清除页面文件当它关闭时。
当实际物理/虚拟内存进入或超出范围时,Windows 是否会对实际物理/虚拟内存执行任何特殊操作?
例如,假设我运行应用程序 A,它将可识别的字符串写入内存中的变量,然后关闭该应用程序。然后我运行应用程序 B。它分配一大块内存,保留未初始化的内容,并在其中搜索应用程序 A 写入的已知字符串。
应用程序 B 是否有可能获取应用程序 A 写入的字符串?或者 Windows 会在内存可用之前清理内存吗?
Windows does在将进程返回的已释放内存分配给其他进程之前,对其进行“清理”。有一个内核线程专门用于此任务。
The zero page thread runs at the lowest priority and is responsible for zeroing out free pages before moving them to the zeroed page list[1] https://archive.is/saC6h.
您不应该担心在分页文件中保留敏感数据,而应该首先担心继续将其保留在内存中(使用后)。关闭时清除页面文件不是默认行为。此外,系统故障转储将包含 RAM 中“纯文本”形式的任何敏感信息。
Windows 确实如此NOT“清理”内存,只要它分配给进程(显然)。相反,这是由程序(mer)来完成的。为此目的,人们可以使用SecureZeroMemory() http://msdn.microsoft.com/en-us/library/windows/desktop/aa366877%28v=vs.85%29.aspx功能。
该函数定义为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));
不要忘记阅读这篇有趣的文章article https://devblogs.microsoft.com/oldnewthing/?p=30663作者:雷蒙德·陈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)