
Per quando DLLMain è l'unica via
Per quando DLLMain è l'unica via
LdrLockLiberator è una raccolta di tecniche per sfuggire o comunque evitare il Loader Lock mentre esegui il tuo codice da DllMain o da qualsiasi altro punto in cui il lock possa essere presente. È stato rilasciato insieme all'articolo "Perfect DLL Hijacking". Ti diamo la chiave per sbloccare il caricatore di librerie e fare ciò che vuoi con il tuo loader (sul tuo stesso computer)!
Le tecniche sono pensate per essere universali, pulite e 100% sicure dove possibile. Sono progettate per funzionare senza modificare la protezione della memoria o i puntatori. Questo è importante per rimanere compatibili con le moderne mitigazioni degli exploit. L'unica architettura ufficialmente supportata è x86-64 (il 32-bit è in gran parte estinto).
Vuoi conoscere le ragioni architetturali per cui DllMain è così problematico su Windows mentre i sistemi operativi Unix-like non hanno problemi qui? Prego, accomodati!.
È esattamente quello che sembra. Sblocca il Loader Lock, imposta gli eventi del loader e capovolgi . Si consiglia di lasciare non definito per la migliore stabilità.
LdrpWorkInProgressRUN_PAYLOAD_DIRECTLY_FROM_DLLMAINNON USARE QUESTA TECNICA NEL CODICE DI PRODUZIONE. Questo è stato creato come sottoprodotto della mia pura curiosità e della volontà di non lasciare nulla di intentato. Qualsiasi cosa tu faccia con questo codice è sotto tua responsabilità.
Usiamo la atexit della CRT tipicamente usata dagli EXE nel nostro codice DLL per sfuggire al Loader Lock quando il programma termina. Per i caricamenti dinamici (usando LoadLibrary), questo è reso 100% sicuro bloccando (LDR_ADDREF_DLL_PIN) la nostra libreria tramite LdrAddRefDll, così che una successiva FreeLibrary non rimuova la nostra DLL dalla memoria.
Prossimamente!
Gli esempi forniti dirottano MpClient.dll da C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. Le istruzioni sono fornite nei commenti del codice sorgente per adattare facilmente tutto ciò a qualsiasi altra coppia DLL e programma (principalmente aggiornando le export per i caricamenti statici)!
Come prova di concetto, eseguiamo ShellExecute come payload predefinito. Tuttavia, puoi far fare a questo tutto ciò che vuoi!
Il file LdrLockLiberator.c alla radice di questo progetto è stato testato per la compilazione con Visual Studio 2022.
Collega NTDLL selezionando il progetto Visual Studio corrente nella finestra Esplora soluzioni, quindi navigando fino a Project > Properties nella barra dei menu. Dai menu a discesa Configuration in alto, seleziona All Configurations e All Platforms. Ora vai a Linker > Input e aggiungi a Additional Dependencies: ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) fino a LdrLockLiberatorWDK in questo repositorybuildFatto! La tua DLL è compilata e pronta all'uso!
In alternativa al WDK, anche la compilazione con MinGW probabilmente funzionerebbe.
MIT License - Copyright (C) 2023-2024 Elliot Killick [email protected]