使用安全零内存新建/删除时出现问题

Issue with new/delete with SecureZeroMemory

本文关键字:删除 问题 新建 安全 内存      更新时间:2023-10-16

谁能帮助我理解为什么我的代码在第一个代码块中的 delete[] szPassword 上失败?我知道 szPassword 只是复制"a",而 st2 等于 8:

TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SIZE_T st2 = sizeof(szPassword);
SecureZeroMemory(szPassword, st2);
delete[] szPassword;

但是,当它运行时,在没有获取 sizeof(( 值的情况下,它可以正常工作:

TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SecureZeroMemory(szPassword, 2);
delete[] szPassword;

szPassword 是一个指针,而不是一个数组,因此sizeof(szPassword)将是 4 或 8。在 64 位应用程序中,这太多了,您将尝试将 8 个字节写入 4 字节缓冲区。

C++运行时允许分配的比您要求分配的更多,并且它经常这样做,以便它可以将特殊数据添加到缓冲区的末尾,以便它可以检测缓冲区溢出。

请改为执行以下操作:

const UINT charcount = 2;
TCHAR *szPassword = new TCHAR[charcount];
...
SecureZeroMemory(szPassword, charcount * sizeof(TCHAR));
delete[] szPassword;

如果缓冲区总是很小,您可以在堆栈上使用数组:

TCHAR szPassword[200];
...
SecureZeroMemory(szPassword, sizeof(szPassword));