Я внедряю 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 сама «деинъектирует»? Или он все еще болтается и продолжает потреблять память, которую я выделил при инъекции?
Спасибо
мистифицировать
Я предполагаю, что вы использовали CreateRemoteThread с начальным адресом, установленным в LoadLibrary, и что вы запускаете поток в DllMain внедренной DLL.
Во-первых, в DllMain DLL_PROCESS_ATTACH сохраните в глобальной переменной HMODULE библиотеки DLL.
Во-вторых, передайте этот HMODULE в FreeLibraryAndExitThread, когда вы хотите, чтобы ваш поток выходил и выгружал Dll.
Осторожно! у вас не должно быть «живого кода», оставленного позади вас, то есть ни один адрес обратного вызова не передается какому-либо API, если обратный вызов срабатывает после выгрузки, это будет немедленный сбой (или, что еще хуже).
По сути, Dll будет автоматически отсоединяться от процесса, когда его основной поток завершится, если вы не отправите его в бесконечный цикл, так что да, вы делаете это правильно
Вы можете положить MessageBox
в DLL_PROCESS_DETACH
событие, чтобы увидеть, что если он будет вызван или нет