Как выгрузить внедренную DLL из целевого процесса, из DLL, когда это будет сделано?

У меня есть DLL, которая внедряется с помощью метода CreateRemoteThread/LoadLibrary.

Выйти из целевого приложения и перезапустить его затруднительно (время его загрузки составляет 10-20 секунд) при отладке и разработке DLL, поэтому я хочу выгрузить DLL, когда я проверил, что мой код работает, чтобы перекомпилировать / повторно ввести его.

Я хочу избежать создания новой DLL с инфраструктурой для загрузки и выгрузки указанной DLL.

Как это возможно?


person CS.    schedule 30.07.2012    source источник
comment
Вам нужно будет сделать то же самое, что и при внедрении кода для загрузки библиотеки, за исключением того, что вам нужно внедрить код для выгрузки библиотеки в ее собственном контексте процесса. Введите код после того, как библиотека больше не нужна. Это должно быть сделано в самой последней функции, где у вас все еще есть управление. Однако для создания кода выгрузчика библиотеки вам понадобятся знания ассемблера.   -  person Jay    schedule 30.07.2012
comment
Что это за DLL? и есть ли у вас контроль над вызывающим приложением? Если это COM, вы можете воспользоваться подсчетом ссылок. Если вы можете управлять хостом, просто отпустите все это и вызовите FreeLibrary().   -  person Deanna    schedule 30.07.2012
comment
@Deanna: правильно, это просто так!   -  person mox    schedule 02.08.2012
comment
Я контролирую процесс, выполняющий инъекцию, но не процесс, который вводится. Мой следующий вопрос: я создаю поток из DllMain, который выполняет свою работу, вызываю ли я FreeLibrary(GetModuleHandle(LMy.dll)) самым последним, когда я говорю потоку завершиться?   -  person CS.    schedule 07.08.2012


Ответы (1)


В случае, когда DllMain порождает поток, и когда этот поток завершает все, что он делает, вы можете использовать FreeLibraryAndExitThread:

Функция FreeLibraryAndExitThread позволяет потокам, выполняющимся в библиотеке DLL, безопасно освобождать библиотеку DLL, в которой они выполняются, и завершать свою работу. Если бы они вызывали FreeLibrary и ExitThread по отдельности, существовало бы состояние гонки. Библиотека может быть выгружена до вызова ExitThread.

Из этой цитаты я ясно заявляю, что вам не следует не вызывать эту функцию из DllMain.

person CS.    schedule 07.08.2012