Могу ли я выгрузить DLL из другого процесса?(Win32) - PullRequest
3 голосов
/ 12 января 2012

Я хочу выгрузить DLL из другого процесса.Является ли это возможным?Если да, то как это сделать?(Я использую Win32 API)

Большое спасибо.

Ответы [ 4 ]

7 голосов
/ 12 января 2012

Да, это возможно. Он называется извлечением DLL и используется некоторыми инжекторами DLL. Обычно DLL загружается через LoadLibrary и впоследствии выгружается через FreeLibrary . FreeLibrary принимает только один параметр, который является дескриптором модуля, который должен быть выгружен. Если вы ввели DLL в первую очередь, вы сможете найти это очень легко. В противном случае существуют способы получения дескриптора, такие как CreateToolHelp32Snapshot с дальнейшим перечислением с помощью Module32First / Module32Next . Предположим, что вы получили дескриптор каким-то образом, и шаги для извлечения DLL просты:

  • Получите адрес FreeLibrary с GetProcAddress. Этот адрес будет совпадать с адресом той же функции в целевом объекте из-за работы Windows.
  • Вызов CreateRemoteThread в целевом процессе, указав lpStartAddress в качестве адреса FreeLibrary и lpParameter в качестве дескриптора модуля

Есть несколько предостережений для извлечения DLL.

  • Вы должны извлекать только те DLL, которые, как вы уверены, ни один код не будет использовать снова в будущем. Если какой-либо динамически связанный код попытается вызвать ваш код после его освобождения, он, скорее всего, вызовет некоторую форму нарушения доступа к странице.
  • Вы должны убедиться, что в коде DLL не выполняются потоки, в то время как удаление выполняется по аналогичным причинам.

Следует избегать извлечения DLL с общим . Если библиотека хочет иметь возможность освобождения, она должна предоставить некоторый интерфейс, через который пользователи могут получить к нему доступ, который в конечном итоге вызывает FreeLibraryAndExitThread .

Если вам нужен пример кода для этого, я написал эжектор как часть инжектора, который я писал в прошлом в C. Я могу найти его и найти, но это было много лет назад, а качество кода не скорее всего, будет хорошо.

3 голосов
/ 12 января 2012

Краткий ответ: нет, это невозможно.

Win32 не предоставляет API для выгрузки DLL другого процесса. Если библиотека неожиданно освобождается, процесс завершится сбоем. Это приводит к серьезной дыре в безопасности, поскольку нарушает механизм защиты процесса.

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

3 голосов
/ 12 января 2012

Вы не хотите этого делать.

«Загрузка» DLL - это гораздо больше, чем просто открытие (и блокировка) файла. Когда загрузчик NT запускает исполняемый файл, он обрабатывает все библиотеки DLL, на которые ссылается изображение (рекурсивно), и связывает вызовы функций (рекурсивно): загрузка библиотек DLL, вызов кода инициализации библиотеки DLL и т. Д.

Выгрузка DLL будет означать, что вам нужно будет остановить все процессы, которые загрузили вашу DLL, загрузить новую DLL и выполнить все операции, которые будет выполнять загрузчик NT. Конечно, для выгрузки и повторной загрузки DLL потребуется восстановить состояние этой старой DLL (инициализированные переменные и т. Д.), Операция, которая не указана в Win32.

Для получения дополнительной справочной информации см. Эту статью о MSDN и в статье Hood в MSJ .

0 голосов
/ 12 января 2012

Вместо этого я хотел бы изменить функцию, вызываемую, когда процесс пытается вызвать функции в этой dll. Я знаю, что это возможно в теории .

Это будет означать небольшой взлом памяти и знание того, где хранятся указатели на функции, но все это можно найти достаточно легко (ollydbg удастся это сделать), было бы сложнее, если бы они использовали ординалы, еще сложнее если они жестко кодируют указатели, но сейчас никто этого не делает. Затем вы можете внедрить свой собственный код, который (в идеале) имитирует функции, которые они маскируют, но на самом деле ничего не делает. Их, вероятно, придется вводить в процесс, и таким образом вы сможете заставить его работать, даже если процесс не знает об этом, и без сбоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...