Как правильно утилизировать введенный поток DLL?

Я внедряю DLL в целевой процесс, чтобы выступать в качестве помощника во время игры в MMORPG (в настоящее время функциональность преобразует нажатие клавиш в щелчки мыши, поскольку MMORPG требует, чтобы пользователь перемещал свою мышь для определенных функций, что я презираю.)

Допустим, я хочу удалить свою DLL по какой-либо причине, как мне это сделать? Этот метод чистый?

bool running = true;
while (running) // This is the only thread I'm using, and it is running in "realtime"
{
    // Do keyboard handing stuff in switch statement
    case keys.EscapeKey: // If the escape key is pressed
        running = false; // Set the running bool to false, and break the loop
        break;
}

Это чисто? Поток заканчивается, так что моя dll "деинъектируется" сама? Или он все еще болтается и продолжает потреблять память, которую я выделил при инъекции?

Спасибо джош

2 ответа

Решение

Я предполагаю, что вы использовали CreateRemoteThread с начальным адресом, установленным в LoadLibrary, и что вы запускаете поток в DllMain внедренной DLL.

Во-первых, в DllMain DLL_PROCESS_ATTACH сохраните в глобальной переменной HMODULE библиотеки DLL.

Во-вторых, передайте этот HMODULE в FreeLibraryAndExitThread, когда вы хотите, чтобы ваш поток выходил и выгружал Dll.

Осторожно! вы не должны оставлять "живой код" позади себя, то есть, ни один адрес обратного вызова не передается какому-либо API, если обратный вызов срабатывает после выгрузки, это будет немедленный сбой (или, что еще хуже).

По сути, Dll будет автоматически отсоединяться от процесса, когда его основной поток завершится, если вы не отправите его в бесконечный цикл, так что да, вы делаете это правильно

Вы можете положить MessageBox в DLL_PROCESS_DETACH событие, чтобы увидеть, что если он будет вызван или нет

Другие вопросы по тегам