
DLLs über Icons in den Explorer-Prozess injizieren
Dies ist eine Windows-Explorer-DLL-Injection-Technik, die den Dialog „Symbol ändern“ unter Windows verwendet.
Sie kann Benutzer dazu verleiten, eine bösartige DLL in ihren Explorer-Prozess zu laden:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
Zusätzlich kann sie verwendet werden, um eine DLL aus einem anderen Prozess in den Explorer zu injizieren:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
Neben Code enthalten DLLs auch Ressourcen wie Symbole. In der Demonstration kannst du sehen, dass die Standardsymbole in shell32.dll gespeichert sind:

Eigentlich werden sie in modernen Windows-Versionen in shell32.dll.mui gespeichert, aber es wird trotzdem als shell32.dll angezeigt
Damit der Explorer-Prozess alle in der DLL gespeicherten Symbole im Dialog anzeigen kann, muss er die DLL in den Speicher laden, damit sie analysiert werden kann.
Darüber hinaus haben DLLs in Windows die Möglichkeit, eine optionale DllMain-Funktion zu definieren, die aufgerufen wird, wenn die DLL mithilfe der Funktionen LoadLibrary und FreeLibrary geladen oder entladen wird.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
Das bedeutet, dass der im DllMain definierte Code im Speicher des Explorers ausgeführt wird, wenn eine DLL mit einer DllMain-Funktion vom Explorer geladen wird.
Und genau das wird hier gemacht. Zusätzlich wird die DLL als Symbol getarnt:
Das „Symbol“ ist eigentlich eine einfache DLL-Datei mit der Erweiterung .ico, die die Taschenrechner-App mit einer Symbolressource öffnet, die mit dem Resource Hacker hinzugefügt wurde. (Das Symbol kann auch in Visual Studio hinzugefügt werden)
Es gibt einige Anomalien beim Erscheinungsbild des Symbols in der Ordneransicht. Ich habe dies auf zwei verschiedenen Windows-10-Versionen (der neuesten und einer älteren) und unter Windows 11 getestet.
Auf beiden Windows-10-Versionen wurde das in der DLL gespeicherte Symbol nicht angezeigt, wenn die Erweiterung in .ico geändert wurde.

Auf der neuesten Windows-10-Version funktionierte es jedoch, bis ich versuchte, das „Symbol“ in der Foto-App zu öffnen. Seitdem konnte ich es nicht mehr reproduzieren.

Unter Windows 11 wurde die getarnte DLL in der Explorer-Ansicht wie ein normales Symbol angezeigt. Wenn sie jedoch in der Foto-App geöffnet wird, wird ein Fehler angezeigt.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
Neben dem Trick, einen Benutzer dazu zu bringen, die DLL manuell zu laden, hat ein Angreifer auch die Möglichkeit, diese Technik zu verwenden, um eine DLL-Datei programmatisch in den Explorer-Prozess zu injizieren:
Zunächst wird ein Ordner im Temp-Verzeichnis erstellt und die Eigenschaften des Ordners werden mit SHObjectProperties geöffnet. Um das Handle des Fensters unabhängig von der Systemsprache zu erhalten, wird EnumWindows mit einer Callback-Funktion verwendet, die in jedem offenen Fenster nach dem eindeutigen Ordnernamen sucht.

Über die Eigenschaftenseite wird der Dialog „Symbol ändern“ aufgerufen, dessen Handle ebenfalls mit EnumWindows abgerufen wird. Schließlich wird der Symbolpfad zu einer DLL geändert (die in diesem Fall die Erweiterung .ico hat), wodurch der Explorer die DLL lädt, nachdem die OK-Taste gedrückt wurde.
Dies ist eine sehr heimliche Methode, um eine DLL in den Explorer-Prozess zu injizieren, da sie nicht die übliche DLL-Injection-API verwendet. Es erzeugt zwar zwei kurze Popups, die aber nicht allzu störend sind. Es kann also als AV-Evasion-Technik von einem Bedrohungsakteur verwendet werden, um Code über den legitimen Explorer-Prozess auszuführen oder ein UMD-Rootkit zu laden.
Auch die Verbreitung von DLLs, die als .ico-Dateien getarnt sind, könnte ein interessanter Angriffsvektor sein.
Um die richtigen Fenster-Handles zu erhalten, habe ich Spy++ verwendet, ein Tool, das mit Visual Studio installiert wird.

Vielen Dank an Bill G. von Microsoft für das schöne Ordnersymbol!
Danke, unbekannter Typ aus dem Internet, für das schöne Injektionssymbol!