簡體   English   中英

使用SecureZeroMemory新建/刪除問題

[英]Issue with new/delete with SecureZeroMemory

誰能幫助我理解為什么我的代碼在代碼的第一部分中的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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM