在WIN32 GDI中使用SetWindowText,并安全地删除键入的数据

时间:2010-10-27 08:52:57

标签: c++ security winapi memory gdi

我希望安全地删除(甚至内存中的痕迹)用户键入文本框的任何内容。我想知道将它设置为""是否足够安全。 SetWindowText是Win32 API中的一个函数,位于 user32.dll

在该计划中:

SetWindowText(myHandle, "Hello");
SetWindowText(myHandle, "Goodbye");

//Was the buffer containing chars "Hello" overwritten by the
//series of chars "Goodb"?

//Or was another chunk of buffer being allocated to store "Goodbye",
//hence "Hello" still exist somewhere in the memory?

SetWindowText(myHandle, "");
//What does Windows do to the buffer that used to store chars "Goodbye"?
//Does it wipe out and replace the data in the buffer to all 0s here?
//Or does "Goodbye" actually still stays in the memory?

2 个答案:

答案 0 :(得分:2)

这是正式未指明的,在实践中相当复杂。因此,简单的答案是“不,它不安全”

答案 1 :(得分:1)

不,它不安全,因为GDI多次复制你的字符串,例如使它成为宽字符串字符串:你使用SetWindowTextA但它只是SetWindowTextW的包装器,所以SetWindowTextA将你的字符串复制到wide-char字符串。

对于安全的解决方案,您应该使用自定义用户输入处理(WM_KEY *等)和自定义渲染(WM_DRAW)来实现自己的文本框。

要检查其安全性,请在OllyDbg下运行程序并扫描整个内存中的字符串(Alt-M,Ctrl-B)。