Да, это возможно. Он называется извлечением DLL и используется некоторыми инжекторами DLL. Обычно DLL загружается через LoadLibrary и впоследствии выгружается через FreeLibrary . FreeLibrary
принимает только один параметр, который является дескриптором модуля, который должен быть выгружен. Если вы ввели DLL в первую очередь, вы сможете найти это очень легко. В противном случае существуют способы получения дескриптора, такие как CreateToolHelp32Snapshot с дальнейшим перечислением с помощью Module32First / Module32Next . Предположим, что вы получили дескриптор каким-то образом, и шаги для извлечения DLL просты:
- Получите адрес
FreeLibrary
с GetProcAddress
. Этот адрес будет совпадать с адресом той же функции в целевом объекте из-за работы Windows.
- Вызов CreateRemoteThread в целевом процессе, указав
lpStartAddress
в качестве адреса FreeLibrary
и lpParameter
в качестве дескриптора модуля
Есть несколько предостережений для извлечения DLL.
- Вы должны извлекать только те DLL, которые, как вы уверены, ни один код не будет использовать снова в будущем. Если какой-либо динамически связанный код попытается вызвать ваш код после его освобождения, он, скорее всего, вызовет некоторую форму нарушения доступа к странице.
- Вы должны убедиться, что в коде DLL не выполняются потоки, в то время как удаление выполняется по аналогичным причинам.
Следует избегать извлечения DLL с общим . Если библиотека хочет иметь возможность освобождения, она должна предоставить некоторый интерфейс, через который пользователи могут получить к нему доступ, который в конечном итоге вызывает FreeLibraryAndExitThread .
Если вам нужен пример кода для этого, я написал эжектор как часть инжектора, который я писал в прошлом в C. Я могу найти его и найти, но это было много лет назад, а качество кода не скорее всего, будет хорошо.