Вы используете CreateRemoteThread
для запуска потока в целевом процессе, который запускает «LoadLibraryA».
Я не знаю, почему комментаторам не понравился ваш код внедрения.Выглядит хорошо для меня.Я думаю, что вы правильно закрываете этот поток, однако я рекомендую добавить вызов GetExitCodeThread
после WaitForSingleObject
, это даст вам код возврата от LoadLibrary
, чтобы вы могли проверять наличие ошибок.Вы не можете вызвать FreeLibrary
для этого дескриптора, потому что разные процессы.GetLastError также не будет работать.Но, по крайней мере, вы можете сравнить с nullptr
для обнаружения сбоя.
Причина, по которой DLL остается загруженной, заключается в том, что никто не назвал FreeLibrary
.
Один шаблон здесь, в DllMain вашегоВ случае DLL_PROCESS_ATTACH
DLL создайте еще один удаленный поток.На этот раз нет необходимости использовать CreateRemoteThread
, просто вызовите обычный CreateThread
, потому что этот код уже выполняется в целевом процессе.Вызовите CloseHandle
сразу по возвращенному дескриптору (это не убьет новый поток, просто освободите дескриптор).Теперь, во втором удаленном потоке, делайте все, что хотите, в целевом процессе, а когда закончите, вызовите FreeLibraryAndExitThread API.Это завершит работу второго удаленного потока, одновременно выгружая вашу DLL из целевого процесса.
Дополнительная информация: Точка входа DllMain Для DLL HINSTANCE такой же, как HMODULE, просто приведитепервый аргумент HMODULE и сохранить этот аргумент в некоторой переменной для передачи в FreeLibraryAndExitThread
.
Update : как сказал комментатор, в идеале вам нужно выделить и скопировать один дополнительный символ,Просто замените strlen(dllName)
на strlen(dllName)+1
в обоих случаях.
Обновление 2 : Кстати, часто неплохо вызывать DisableThreadLibraryCalls первым делом в обработчике DLL_PROCESS_ATTACH.Особенно, если вы затем запускаете новые темы с вашего DllMain
.