
Für den Fall, dass DLLMain der einzige Weg ist
Für den Fall, dass DLLMain der einzige Weg ist
LdrLockLiberator ist eine Sammlung von Techniken, um die Loader Lock zu umgehen oder anderweitig darauf zu verzichten, während du deinen Code aus DllMain oder an jeder anderen Stelle, an der die Sperre vorhanden sein kann, ausführst. Es wurde zusammen mit dem Artikel "Perfect DLL Hijacking" veröffentlicht. Wir geben dir den Schlüssel, um den Bibliothekslader zu entsperren und mit deinem Loader zu tun, was du willst (auf deinem eigenen Computer)!
Die Techniken sollen wo möglich universell, sauber und 100 % sicher sein. Sie sind so konzipiert, dass sie ohne Änderung des Speicherschutzes oder von Zeigern funktionieren. Das ist wichtig, um mit modernen Exploit-Mitigationen kompatibel zu bleiben. Die einzige offiziell unterstützte Architektur ist x86-64 (32-Bit ist weitgehend ausgestorben).
Du willst die architektonischen Gründe erfahren, warum DllMain unter Windows so problematisch ist, während Unix-ähnliche Betriebssysteme hier nicht zu kämpfen haben? Nur zu, bitte!
Es ist genau das, wonach es klingt. Entsperre die Loader Lock, setze Loader-Ereignisse und kippe LdrpWorkInProgress. Es wird empfohlen, RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN undefiniert zu lassen, um die beste Stabilität zu erzielen.
VERWENDE DIESE TECHNIK NICHT IN PRODUKTIONSCODE. Dies entstand aus meiner schieren Neugier und meinem Willen, nichts unversucht zu lassen. Was auch immer du mit diesem Code tust, liegt in deiner Verantwortung.
Wir verwenden das normalerweise von EXEs verwendete atexit der CRT in unserem DLL-Code, um die Loader Lock zu umgehen, wenn das Programm beendet wird. Bei dynamischen Lasten (mithilfe von LoadLibrary) wird dies 100 % sicher gemacht, indem wir unsere Bibliothek mithilfe von LdrAddRefDll pinnen (LDR_ADDREF_DLL_PIN), sodass ein anschließendes FreeLibrary unsere DLL nicht aus dem Speicher entfernt.
Bald verfügbar!
Die bereitgestellten Beispiele kapern MpClient.dll aus C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. Anweisungen in den Quellcode-Kommentaren helfen dir, dies einfach an jede andere DLL- und Programm-Kombination anzupassen (hauptsächlich müssen nur die Exporte für statische Lasten aktualisiert werden)!
Als Proof of Concept führen wir ShellExecute als Standard-Payload aus. Du kannst damit jedoch alles machen, was du willst!
Die LdrLockLiberator.c im Stammverzeichnis dieses Projekts wurde getestet und kann mit Visual Studio 2022 kompiliert werden.
Verknüpfe mit NTDLL, indem du das aktuelle Visual Studio-Projekt im Projektmappen-Explorer auswählst und dann in der Menüleiste zu Projekt > Eigenschaften navigierst. Wähle in den Dropdown-Menüs Konfiguration oben Alle Konfigurationen und Alle Plattformen aus. Gehe nun zu Linker > Eingabe und füge unter Zusätzliche Abhängigkeiten Folgendes hinzu: ntdll.lib.
C:\Windows\System32\msvcrt.dll) unterstützt5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.exe auscd) zu LdrLockLiberatorWDK in diesem Repobuild ausFertig! Deine DLL ist gebaut und bereit zur Verwendung!
Alternativ zu WDK würde das Kompilieren mit MinGW wahrscheinlich ebenfalls funktionieren.
MIT-Lizenz - Copyright (C) 2023-2024 Elliot Killick [email protected]