
Pour les cas où DLLMain est la seule option
Pour quand DLLMain est le seul moyen
LdrLockLiberator est un ensemble de techniques permettant d'échapper au verrou du chargeur (Loader Lock) ou de s'en passer tout en exécutant votre code depuis DllMain ou tout autre endroit où le verrou peut être présent. Il a été publié en même temps que l'article « Perfect DLL Hijacking ». Nous vous donnons la clé pour déverrouiller le chargeur de bibliothèques et faire ce que vous voulez avec votre chargeur (sur votre propre ordinateur) !
Les techniques se veulent universelles, propres et 100 % sûres dans la mesure du possible. Elles sont conçues pour fonctionner sans modifier la protection mémoire ni les pointeurs. C'est important pour rester compatible avec les mitigations d'exploitation modernes. La seule architecture officiellement prise en charge est x86-64 (le 32 bits a largement disparu).
Vous voulez connaître les raisons architecturales pour lesquelles DllMain est si problématique sur Windows alors que les systèmes d'exploitation de type Unix ne rencontrent pas cette difficulté ? Je vous en prie !
C'est exactement ce que cela semble être. Déverrouillez le verrou du chargeur, définissez les événements du chargeur et basculez LdrpWorkInProgress. Il est recommandé de laisser RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN non défini pour une stabilité optimale.
N'UTILISEZ PAS CETTE TECHNIQUE DANS DU CODE DE PRODUCTION. Elle a été créée comme sous-produit de ma pure curiosité et de ma volonté de ne laisser aucune pierre non retournée. Tout ce que vous faites avec ce code est de votre responsabilité.
Nous utilisons, dans notre code DLL, le atexit de la CRT, typiquement utilisé par les EXE, pour échapper au verrou du chargeur à la sortie du programme. Pour les chargements dynamiques (via LoadLibrary), c'est rendu 100 % sûr en épinglant (LDR_ADDREF_DLL_PIN) notre bibliothèque avec LdrAddRefDll afin qu'un FreeLibrary ultérieur ne retire pas notre DLL de la mémoire.
Bientôt disponible !
Les exemples fournis détournent MpClient.dll de C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. Des instructions sont fournies dans les commentaires du code source pour adapter facilement cela à toute autre paire DLL/programme (principalement en mettant à jour les exports pour les chargements statiques) !
À titre de preuve de concept, nous exécutons ShellExecute comme charge utile par défaut. Cependant, vous pouvez faire faire à cela tout ce que vous voulez !
Le fichier LdrLockLiberator.c à la racine de ce projet a été testé et compile sur Visual Studio 2022.
Pour lier NTDLL, sélectionnez le projet Visual Studio actuel dans la fenêtre Explorateur de solutions, puis naviguez vers Projet > Propriétés dans la barre de menus. Dans les menus déroulants Configuration en haut, sélectionnez Toutes les configurations et Toutes les plateformes. Ensuite, allez dans Éditeur de liens > Entrée puis ajoutez à Dépendances supplémentaires : ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) vers LdrLockLiberatorWDK dans ce dépôtbuildTerminé ! Votre DLL est compilée et prête à l'emploi !
Comme alternative au WDK, la compilation avec MinGW fonctionnerait probablement aussi.
Licence MIT - Copyright (C) 2023-2024 Elliot Killick [email protected]