c++ - 调用 FreeLibrary 后字符串不会从内存中删除
问题描述
我正在尝试为项目创建 DLL,但在清除字符串时遇到了一些问题。我有一个类,我在堆栈上声明了几个字符串,如下所示:
std::string test = "blabla";
每当我使用 FreeLibrary 从进程中弹出 DLL 时,字符串仍保留在内存中,即使 DLL 不再在进程中。
我在调用 FreeLibrary 之前删除了类本身,并且肯定调用了它的构造函数。
我尝试了几个程序,例如 Process Hacker 和 Cheat Engine,并且在通过内存搜索时都返回了正确的字符串。
奇怪的是它没有删除自己,因为字符串是在堆栈上分配的。
我需要使用某个功能吗?
解决方案
我想在回答前先说,除非您正在制作某种涉及敏感信息的加密库,否则确实没有充分的理由这样做。事实上,如果你这样做,你应该采取额外的步骤来混淆代码,这样就不清楚它在做什么。但我会告诉你一个简单的方法来做到这一点。
奇怪的是它没有删除自己,因为字符串是在堆栈上分配的。
这是正常的。堆栈实际上并没有什么特别之处,只是它通常比堆更快且访问成本更低,并且以相反的方向运行。
当您的程序加载到内存中时,它会加载一个.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
}
推荐阅读
- javascript - React Native AsyncStorage promises
- android - 命令没有价值 在 Android Kotlin 中使用 JSON
- css - 反应样式背景 css 属性
- firebase - 无法使用 fetch() 从 Firebase 模拟器访问 googleapis.com 以外的网址
- c - Setting up a list of indexed variables in C
- python - numpyThonic 数组比较的方式?
- ios - 不再捕获检测到的图像时停止播放视频
- javascript - How can I get the "click" function in this code to repeat?
- c# - ASP.NET Web API 将自定义异常映射到 HTTP 错误代码
- c# - How can I start a conversation only once even if it's starting inside Update?