Как выгрузить dll из процесса

Обновлено: 30.06.2024

Предположим, что вы каким-то образом получили дескриптор, тогда шаги по извлечению DLL просты:

  1. Получите адрес FreeLibrary с помощью GetProcAddress .
  2. Вызовите CreateRemoteThread для целевого процесса, указав lpStartAddress в качестве адреса FreeLibrary и lpParameter в качестве дескриптора модуля.

Может ли DLL выгрузить себя?

Короткий ответ: да, вы можете выгрузить DLL, если вы явно загрузили ее.

Как DLL загружается в память?

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

Что такое адрес DLL?

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

Как просмотреть файлы DLL в Windows 10?

Открытие DLL-файлов в Windows 7, 10 с помощью инструмента Windows Visual Studio

  1. Нажмите на меню "Пуск".
  2. На вкладке "Поиск программ и файлов" введите Visual Studio, а затем нажмите кнопку "Ввод" на клавиатуре.
  3. Откройте папку, содержащую командную строку Visual Studio.

Как установить DLL-файл xinput1_3?

Как исправить Xinput1_3. dll ошибки

  1. Перезагрузите компьютер, если вы еще этого не сделали.
  2. Установите последнюю версию Microsoft DirectX.
  3. Предположим, что последняя версия DirectX от Microsoft не исправляет ошибку xinput1_3.
  4. Удалите игру или программу, а затем переустановите ее снова.
  5. Восстановите xinput1_3.

Что делает Steam_api DLL?

steam_api. dll используется играми для доступа к некоторым функциям и решениям Steamworks, таким как статистика и достижения, аутентификация пользователя, поиск игровых серверов и связь с другими пользователями Steam. Steamworks API также предлагает функциональность Valve Anti-Cheat и защиту DRM. steam_api.

Как редактировать файлы DLL в Windows 10?

Что делать, если в Windows 10 отсутствует DLL-файл?

  1. Запустите стороннее средство исправления DLL.
  2. Запустите сканер SFC.
  3. Запустите DISM.
  4. Загрузить DLL-файл вручную.
  5. Установите DirectX.
  6. Переустановите распространяемые файлы Visual C++.
  7. Отключите или удалите антивирус.
  8. Выполнить обновление на месте.

Как получить доступ к файлам System32?

Перейдите к папке Windows System32. Нажмите кнопку «Пуск» и выберите «Компьютер». В левой части окна найдите и нажмите «Компьютер». Найдите и щелкните диск «(C:)», найдите и щелкните папку «Windows», найдите и щелкните папку «System32».

Где я могу найти папку System32?

Папка System32, расположенная в C:\Windows\System32, является частью всех современных версий Windows. Он содержит важные системные файлы, необходимые Windows для правильной работы.

Что такое папка System32?

Каталог system32 содержит системные файлы Windows и файлы программного обеспечения, необходимые для работы операционной системы Windows и программ, работающих в Windows. Наиболее распространенными типами файлов в каталоге system32 являются файлы DLL (библиотека динамической компоновки) и EXE (исполняемые файлы).

В чем разница между System32 и SysWOW64?

В 64-разрядных версиях Windows у вас есть две отдельные папки Program Files. У вас также есть два отдельных системных каталога, в которых хранятся DLL-библиотеки и исполняемые файлы: System32 и SysWOW64. Несмотря на названия, System32 заполнен 64-разрядными файлами, а SysWOW64 — 32-разрядными файлами.

Как получить доступ к папке SysWOW64?

Хотя замена файлов вряд ли решит вашу проблему, вот стандартный способ получить полный доступ к папке SysWOW64:

  1. Войдите под учетной записью администратора.
  2. Нажмите на глобус "Начать".
  3. Введите cmd.exe в поле поиска.
  4. Нажмите Ctrl+Shift+Enter.
  5. Нажмите «Запуск от имени администратора».

Какова цель папки SysWOW64?

Короче говоря, основной целью подсистемы SysWOW64 является создание 32-разрядной среды, позволяющей запускать 32-разрядные приложения в 64-разрядной Windows без каких-либо изменений. Это содержит . dll и .exe, которые указывают нужные направления без вмешательства пользователя.

Как вставить в SysWOW64?

Не можете переместить файл, потому что он открыт в другой программе?

Найти файл в диспетчере задач. Выберите файл и коснитесь параметра «Завершить задачу» в нижней части окна диспетчера, чтобы запретить использование файла программой. Вернитесь к файлу и попробуйте удалить его снова.Если это по-прежнему не работает, перейдите к следующему шагу.

Выполняется не DLL, а сам процесс во всем его адресном пространстве. DLL не "исполняются", а "загружаются".

да, некоторые потоки используют некоторые функции в этой DLL, и я хочу запретить им выполнять эти функции. (думаю, может произойти сбой, если я выгружу DLL ^^!)

Если вы немного знакомы с ассемблером, вы можете изменить эту *.dll и изменить эту функцию, чтобы она ничего не делала, например, просто возвращала 0. Но для этого потребуются некоторые знания обратного проектирования и хороший отладчик (например, ollydbg). Это более безопасный способ, который не приведет к сбою. Можно даже сделать такую ​​модификацию в запущенном приложении с помощью WriteProcessMemory API, но так или иначе вы должны знать, что менять.

4 ответа 4

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

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

Существует несколько предостережений по извлечению DLL.

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

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

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

Этот форум перенесен в раздел вопросов и ответов Майкрософт. Посетите Microsoft Q&A, чтобы публиковать новые вопросы.

Ссылка на главную страницу Visual Studio

Отвечает:

Вопрос

Я пишу простое приложение, используя WinAPI/C++. Мне нужно выгрузить указанную DLL (я знаю DLL HMODULE), которая находится за пределами адресного пространства моего приложения.
Как мне это сделать (конечно, FreeModule() не работает, возвращая ошибку 126: модуль не найден)? Заранее спасибо.

Ответы

Вы передаете ему дескриптор модуля kernel32 в своем процессе. Неправильный дескриптор, вам понадобится один в другом процессе. Это требует вызова GetModuleHandle() в контексте другого процесса, вам действительно * нужно * внедрить DLL с требуемым кодом.

В противном случае выгрузка kernel32 маловероятна, так как он будет иметь большое количество ссылок. Если это удастся, вы быстро разбомбите процесс, пытаясь вызвать экспортированную функцию из kernel32.
Ханс Пассант.

Это работает так же, только в вашем случае проще.
FreeLibrary в Kernel32 имеет соглашение о стандартном вызове.
LPTHREAD_START_ROUTINE должна быть функцией соглашения о стандартном вызове.

FreeLibrary требуется дескриптор в качестве параметра, дескриптор DLL.

mpList[moduleName]) должен быть PID, переданным в openprocess.

С дескриптором, возвращаемым openprocess, вам нужно вызвать enumprocessmodules, который вернет список всех dll, загруженных в целевой процесс.

Вам нужно просмотреть этот список, чтобы увидеть дескриптор Kernel32.dll, используя getmodulebasename, а затем вы можете вызвать FreeLibrary, используя этот дескриптор в качестве входного параметра.

В противном случае произойдет сбой. Я предполагаю (по поводу поста crescens2k), что рано или поздно он все равно потерпит неудачу.

PS: в createremotethread вы передаете 0 в качестве параметра FreeLibrary: поэтому приложение не падает.

Последние достижения

Одна из самых сложных вещей, которые мне пришлось выучить, когда я был новичком, заключалась не в том, как внедрить dll, а в том, как выгрузить чертову штуку после того, как она была внедрена.

Это должно помочь многим новичкам.Это может даже помочь продвинутым программистам, которые никогда не могли выгрузить туда dll, когда-то внедренные в игру.

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

При создании новой темы просто используйте:

Источник самостоятельной выгрузки DLL:


Снимок экрана тестового жгута:


Техника, которую я использую, заключается в том, что я создаю dll для взлома игры, а затем использую другую dll для выгрузки, которая самоуничтожается и выгружает все остальные dll, которые я хочу выгрузить.

Не стесняйтесь добавлять свой исходный код самовыгружающейся DLL ниже. Хотелось бы увидеть и другие техники и то, что вы придумали.

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

С уважением,
-Tickle

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

Я делаю это с тех пор, как начал кодировать читы.

Чертовски полезно изменить какую-то мелочь и повторно ввести данные прямо в игре, вместо того чтобы повторять весь процесс заново.

Последние достижения

Что сказал Фейдж. FreeLibraryAndExitThread .. просто используйте переменную злорадства, доступную для всех потоков, чтобы они могли завершиться в любой момент.. затем создайте поток извлечения, который вызывает FreeLibraryAndExitThread (и очищает/освобождает/отцепляет все остальное).. просто убедитесь, что вы делаете всю необходимую очистку, прежде чем вы ее вызовете, поскольку она никогда не возвращается. Тем не менее хорошая работа. ps: обратите внимание, что ни один из этих методов не будет работать для модуля, сопоставленного вручную ^^

Взгляните на поля! Кунжут был кунжутом, кукуруза была кукурузой. Молчание и Тьма знали! Так рождается судьба человека. - Свет Азии

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

Я бы не хотел включать в свой код неиспользуемые библиотеки.

Решение

После LabVIEW 8.2 библиотеки динамической компоновки (далее именуемые DLL) можно динамически загружать и выгружать. LabVIEW 2017 Help: Call Library Function Node описывает этот процесс. Таким образом, для динамической загрузки DLL необходимо установить флажок Указать путь на диаграмме в диалоговом окне Вызов функции библиотеки. Диалоговое окно можно открыть, дважды щелкнув узел Call Library Function, как показано на рисунке ниже.

После того, как параметр «Указать путь на диаграмме» отмечен флажком, в функции «Библиотека вызовов» появляется терминал с именем «путь». Этот терминал принимает путь к DLL, которую вы хотите вызвать. Когда эта функция библиотеки вызовов выполняется, DLL, указанная в ссылке, загружается в память. См. рисунок ниже.

В справке LabVIEW 2017: диалоговое окно «Вызов функции библиотеки» также указано, что путь во входных данных может использоваться для выгрузки библиотеки, на которую ранее ссылались, из памяти. Для этого подключите пустой или недопустимый путь к пути во входных данных, и LabVIEW выгрузит из памяти любую библиотеку, на которую ранее ссылался узел. Другими словами, вы должны подключить пустую константу пути или константу нулевого пути к пути во входных данных того же узла Call Library Function, который первоначально вызвал вашу DLL. На картинке ниже показан пример. Первый вызов загружает DLL, а логическое значение выгружает DLL, а также останавливает этот код. Ложный случай, не показанный, имеет время, но не код.

Если пустой или недопустимый путь связан с другим узлом Call Library Function, отличным от того, который первоначально вызывал
вашу DLL, DLL не будет выгружена из памяти. На картинке ниже показан пример того, что делать не следует.

Дополнительная информация

Если несколько ВП вызывают и загружают одну и ту же DLL, то DLL будет загружена в память LabVIEW только один раз. Выгружая DLL в 1 ВП, он выгружает DLL во всех ВП, в которых она может быть загружена.

Читайте также:

[module name="footer"]