
Para cuando DLLMain es la única opción
Para cuando DLLMain es la única vía
LdrLockLiberator es una colección de técnicas para escapar u omitir el Loader Lock mientras ejecutas tu código desde DllMain o desde cualquier otro lugar donde el bloqueo pueda estar presente. Se publicó junto con el artículo "Perfect DLL Hijacking". ¡Te damos la llave para desbloquear el cargador de bibliotecas y hacer lo que quieras con tu loader (en tu propia computadora)!
Las técnicas están pensadas para ser universales, limpias y 100% seguras cuando sea posible. Están diseñadas para funcionar sin modificar la protección de la memoria ni los punteros. Esto es importante para mantener la compatibilidad con las mitigaciones modernas de exploits. La única arquitectura soportada oficialmente es x86-64 (los 32 bits están en gran medida extintos).
¿Quieres conocer las razones arquitectónicas por las que DllMain es tan problemático en Windows mientras que los sistemas operativos tipo Unix no tienen estas dificultades? ¡Por favor, adelante!.
Es exactamente lo que parece. Desbloquea el Loader Lock, establece los eventos del cargador y cambia LdrpWorkInProgress. Se recomienda mantener RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN sin definir para lograr la mejor estabilidad.
NO USES ESTA TÉCNICA EN CÓDIGO DE PRODUCCIÓN. Esto fue creado como un subproducto de mi pura curiosidad y de mi voluntad de no dejar piedra sin remover. Cualquier cosa que hagas con este código es bajo tu propia responsabilidad.
Usamos el atexit de CRT, típicamente utilizado por los EXE, en nuestro código DLL para escapar del Loader Lock cuando el programa sale. Para cargas dinámicas (usando LoadLibrary), esto se vuelve 100% seguro fijando (LDR_ADDREF_DLL_PIN) nuestra biblioteca con LdrAddRefDll para que un FreeLibrary posterior no elimine nuestra DLL de la memoria.
¡Próximamente!
Las muestras proporcionadas secuestran MpClient.dll de C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. En los comentarios del código fuente se incluyen instrucciones para adaptar esto fácilmente a cualquier otra combinación de DLL y programa (principalmente actualizando las exportaciones para cargas estáticas).
Como prueba de concepto, ejecutamos ShellExecute como payload predeterminado. Sin embargo, ¡puedes hacer que esto haga lo que quieras!
Se ha probado que el LdrLockLiberator.c en la raíz de este proyecto compila en Visual Studio 2022.
Vincula NTDLL seleccionando el proyecto actual de Visual Studio en la ventana del Explorador de soluciones y luego navegando a Project > Properties en la barra de menú. En los menús desplegables Configuration de la parte superior, selecciona All Configurations y All Platforms. Ahora, ve a Linker > Input y agrega a Additional Dependencies: ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) hasta LdrLockLiberatorWDK en este repositoriobuild¡Listo! ¡Tu DLL está compilada y lista para usar!
Como alternativa al WDK, compilar con MinGW también probablemente funcionaría.
Licencia MIT - Copyright (C) 2023-2024 Elliot Killick [email protected]