Строки не стираются из памяти после вызова FreeLibrary - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать DLL для проекта, и у меня возникают некоторые проблемы с очисткой строк.У меня есть класс, в котором у меня есть пара строк, объявленных в стеке, например:

std::string test = "blabla";

Всякий раз, когда я использую FreeLibrary для извлечения DLL из процесса, строки остаются в памяти, даже если DLLбольше не в процессе.

Я удаляю сам класс перед вызовом FreeLibrary, и его конструктор определенно вызывается.

Я пробовал пару программ, таких как Process Hacker и Cheat Engine, и обе возвращают правильную строку, когдапоиск по памяти.

Странно, что он не удаляет себя, поскольку строка размещается в стеке.

Есть ли определенная функция, которую мне нужно использовать?

1 Ответ

0 голосов
/ 28 февраля 2019

Я хочу предвосхитить мой ответ, сказав, что, если вы не создаете какую-то криптографическую библиотеку, в которой задействована конфиденциальная информация, действительно нет веских причин для этого. И на самом деле, если вы делает это, вы должны предпринять дополнительные шаги, чтобы запутать код, чтобы не было понятно, что он делает.Но я покажу вам простой способ сделать это.

Странно, что он не удаляет себя, поскольку строка размещается в стеке.

Это нормально.На самом деле в стеке нет ничего особенного, за исключением того, что он, как правило, более быстрый и менее затратный по сравнению с кучей и работает в противоположном направлении.

Когда ваша программа загружается в память, она загружается с.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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...