我正在尝试为项目创建DLL,并且在清理字符串时遇到一些问题。 我有一个类,其中在堆栈上声明了几个字符串,如下所示:
std::string test = "blabla";
每当我使用FreeLibrary从进程中弹出DLL时,即使DLL不在进程中,字符串仍保留在内存中。
在调用FreeLibrary之前,我要删除类本身,并且肯定会调用其构造函数。
我尝试了一些程序,例如Process Hacker和Cheat Engine,它们在通过内存搜索时都返回正确的字符串。
奇怪的是它没有删除自身,因为字符串是在堆栈上分配的。
我需要使用某些功能吗?
答案 0 :(得分:0)
我想在开始我的回答时说,除非您正在制作某种涉及敏感信息的密码库,否则确实没有这样做的充分理由。实际上,如果您正在执行 操作,则应该采取其他措施来混淆代码,以免弄清楚它在做什么。但是,我将向您展示一种简单的方法。
奇怪的是它没有删除自身,因为字符串是在堆栈上分配的。
那是正常的。栈实际上没有什么特别之处,除了与堆相比,栈访问速度通常更快而且成本更低,并且运行方向相反。
将程序加载到内存中时,它会加载一个.bss
和一个.data
部分。字符串文字位于.data
节中,它是只读存储器。如果要确保内存中看不到某些内容,请不要使用字符串文字。引号中的"blabla"
是字符串文字。
这是避免使用字符串文字的方法:
#include <string>
#include <iostream>
int main()
{
std::string test = { 'b','l','a','b','l','a','\0' };
std::cout << test << std::endl;
// Okay, I'm done with it now...
test.assign(6,'\0'); // blabla is replaced with zeroes
}