
Injecter des DLLs dans le processus explorer à l'aide d'icônes
Il s'agit d'une technique d'injection de DLL dans l'Explorateur Windows qui utilise la boîte de dialogue de changement d'icône de Windows.
Elle peut tromper les utilisateurs en les amenant à charger une DLL malveillante dans leur processus explorateur :
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
De plus, elle peut être utilisée pour injecter une DLL depuis un autre processus dans l'explorateur :
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
Outre le fait de contenir du code, les DLL sont également utilisées pour stocker des ressources comme les icônes. Dans la démonstration, vous pouvez voir que les icônes par défaut sont stockées dans shell32.dll :

En réalité, dans les versions modernes de Windows, elles sont stockées dans shell32.dll.mui, mais elles sont toujours affichées comme shell32.dll
Pour que le processus explorateur puisse afficher toutes les icônes stockées dans la DLL dans la boîte de dialogue, il doit charger la DLL en mémoire afin qu'elle puisse être analysée.
De plus, les DLL sous Windows ont la capacité de définir une fonction optionnelle DllMain, qui est appelée lorsque la DLL est chargée ou déchargée à l'aide des fonctions LoadLibrary et FreeLibrary.
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.
}
Cela signifie que si une DLL avec une fonction DllMain est chargée par l'explorateur, le code défini dans la fonction DllMain s'exécutera dans la mémoire de l'explorateur.
Et c'est exactement ce qui est fait ici. En plus de cela, la DLL est déguisée en icône :
L'« icône » est en réalité un simple fichier DLL avec une extension .ico qui ouvre l'application Calculatrice avec une ressource d'icône qui a été ajoutée à l'aide du Resource Hacker. (L'icône peut également être ajoutée dans Visual Studio)
Il y a quelques anomalies en ce qui concerne l'apparence de l'icône dans l'affichage des dossiers. J'ai testé cela sur deux versions différentes de Windows 10 (la plus récente et une plus ancienne) et sur Windows 11.
Sur les deux versions de Windows 10, l'icône stockée dans la DLL n'était pas affichée lorsque l'extension a été changée en .ico

Sur la version la plus récente de Windows 10, cela a toutefois fonctionné jusqu'à ce que j'essaie d'ouvrir l'« icône » dans l'application Photos. Depuis, je n'ai pas réussi à reproduire le résultat.

Sur Windows 11, la DLL déguisée s'affichait comme une icône normale dans l'affichage de l'Explorateur. Cependant, lorsqu'elle est ouverte dans l'application Photos, une erreur s'affiche.
Outre le fait de tromper un utilisateur pour qu'il charge la DLL manuellement, un attaquant a également la possibilité d'utiliser cette technique pour injecter un fichier DLL dans le processus explorateur par programmation :
Premièrement, un dossier est créé dans le dossier temporaire, et les propriétés du dossier sont ouvertes à l'aide de SHObjectProperties. Pour récupérer le handle de la fenêtre indépendamment de la langue du système, EnumWindows est utilisé avec une fonction de rappel qui recherche le nom distinctif du dossier dans chaque fenêtre ouverte.

Via la page des propriétés, la boîte de dialogue de changement d'icône est invoquée, dont le handle est également récupéré avec EnumWindows. Enfin, le chemin de l'icône est remplacé par une DLL (qui a une extension .ico dans ce cas), ce qui amène l'explorateur à charger la DLL après clic sur le bouton OK.
C'est une façon très discrète d'injecter une DLL dans le processus de l'Explorateur car elle n'utilise pas l'API d'injection de DLL habituelle. Elle produit certes deux petites fenêtres contextuelles, qui ne sont toutefois pas trop dérangeantes. Elle peut donc être utilisée comme technique d'évasion antivirus par un acteur malveillant pour exécuter du code via le processus légitime de l'explorateur ou pour charger un rootkit UMD.
De plus, propager des DLL déguisées en fichiers .ico peut constituer un vecteur d'attaque intéressant.
Pour obtenir les bons handles de fenêtres, j'ai utilisé Spy++, un outil qui est installé avec Visual Studio.

Merci beaucoup à Bill G. de Microsoft pour la belle icône de dossier !
Merci, internaute anonyme, pour la belle icône d'injection !