Как правильно утилизировать введенный поток 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 сама «деинъектирует»? Или он все еще болтается и продолжает потреблять память, которую я выделил при инъекции?

Спасибо
мистифицировать

1

Решение

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

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

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

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

1

Другие решения

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

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

1

По вопросам рекламы [email protected]