
Для случаев, когда DLLMain — единственный доступный способ
Для тех случаев, когда DLLMain — единственный способ
LdrLockLiberator — это набор техник для выхода из Loader Lock или отказа от него при выполнении вашего кода из DllMain или из любого другого места, где может присутствовать блокировка. Он был выпущен вместе со статьёй "Perfect DLL Hijacking". Мы даём вам ключ к разблокировке загрузчика библиотек, чтобы вы могли делать со своим загрузчиком всё, что захотите (на своём компьютере)!
Эти техники предназначены быть универсальными, чистыми и на 100% безопасными, где это возможно. Они разработаны для работы без изменения защиты памяти или указателей. Это важно для сохранения совместимости с современными средствами смягчения эксплойтов. Единственная официально поддерживаемая архитектура — x86-64 (32-битные системы в значительной степени вымерли).
Хотите узнать архитектурные причины, по которым DllMain доставляет столько хлопот в Windows, тогда как Unix-подобные операционные системы с этим не сталкиваются? Пожалуйста, милости просим!.
Это ровно то, что звучит в названии. Разблокируйте Loader Lock, установите события загрузчика и переключите LdrpWorkInProgress. Для наилучшей стабильности рекомендуется оставить RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN неопределённым.
НЕ ИСПОЛЬЗУЙТЕ ЭТУ ТЕХНИКУ В ПРОДУКЦИОННОМ КОДЕ. Она была создана как побочный продукт моего чистого любопытства и желания не оставить ничего неизученным. Всё, что вы делаете с этим кодом, — на вашей ответственности.
Мы используем CRT-функцию atexit, обычно применяемую EXE-файлами, в нашем DLL-коде, чтобы выйти из Loader Lock при завершении программы. Для динамических загрузок (с использованием LoadLibrary) это становится 100% безопасным благодаря закреплению (LDR_ADDREF_DLL_PIN) нашей библиотеки с помощью LdrAddRefDll, чтобы последующий вызов FreeLibrary не удалил нашу DLL из памяти.
Скоро!
Предоставленные примеры перехватывают MpClient.dll из C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. В комментариях к исходному коду приведены инструкции, позволяющие легко адаптировать это для любой другой пары DLL и программы (в основном просто обновив экспортируемые функции для статических загрузок)!
В качестве доказательства концепции мы запускаем ShellExecute в качестве полезной нагрузки по умолчанию. Однако вы можете заставить это делать всё, что захотите!
Файл LdrLockLiberator.c в корне этого проекта протестирован и компилируется в Visual Studio 2022.
Подключите NTDLL, выбрав текущий проект Visual Studio в окне обозревателя решений, затем перейдите в Project > Properties в строке меню. В раскрывающихся меню Configuration вверху выберите All Configurations и All Platforms. Теперь перейдите в Linker > Input и добавьте в Additional Dependencies: ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) в LdrLockLiberatorWDK в этом репозиторииbuildГотово! Ваша DLL собрана и готова к использованию!
В качестве альтернативы WDK, компиляция с помощью MinGW, вероятно, тоже будет работать.
MIT License - Авторское право (C) 2023-2024 Elliot Killick [email protected]