Aller au contenu principal
Expert Cybersécurité & IAv9.0
Centres de ressources conformité
Besoin d'un accompagnement expert ?
Devis personnalisé sous 24h — audit, conformité, incident
Checklists Sécurité — Audit & Durcissement
Formats disponibles
📄 PDF 📊 Excel 🌐 Web

11 checklists professionnelles couvrant 2 200+ points de contrôle. Téléchargement gratuit, aucune inscription.

Reflective Loading

hacking

Définition

Le Reflective Loading est une technique d'injection avancée qui charge un PE (Portable Executable — .exe ou .dll) directement depuis un buffer en mémoire sans utiliser les APIs Windows standard de chargement (LoadLibrary, CreateProcess), en implémentant manuellement les étapes du chargeur PE Windows. Cela permet de charger et exécuter du code malveillant sans aucune trace sur le disque. La bibliothèque ReflectiveDLLInjection de Stephen Fewer (2008) a popularisé cette technique pour les DLLs. La DLL inclut une fonction 'ReflectiveLoader' qui, quand exécutée, effectue toutes les étapes normalement réalisées par le système : 1) analyser les headers PE de la DLL, 2) allouer de la mémoire à la taille image correcte, 3) copier les sections PE, 4) appliquer les relocations (ajuster les adresses absolutes selon la base de chargement réelle), 5) résoudre les imports (remplir la IAT en trouvant les fonctions exportées dans les DLLs chargées), 6) appeler le DllMain. L'absence d'appel à LoadLibrary signifie que la DLL n'apparaît pas dans la liste des modules chargés du processus (obtenu via EnumProcessModules ou ToolHelp32), rendant la DLL invisible aux outils de surveillance qui listent les modules. Cette invisibilité dans la liste des modules est un avantage majeur par rapport à l'injection classique. Cobalt Strike utilise le reflective loading pour son Beacon : le stageless payload Beacon est une DLL réflective qui se charge elle-même. La commande 'dllinject' et 'shinject' de Cobalt Strike injectent respectivement une DLL réflective et du shellcode dans un processus cible. L'exécution d'assemblies .NET via Assembly.Load() est l'équivalent .NET du reflective loading : une assembly est chargée depuis un byte[] sans écrire un fichier sur disque.

Fonctionnement

Sequence reflective DLL : 1) allouer RW dans le processus cible (VirtualAllocEx), 2) y écrire la DLL réflective complète (WriteProcessMemory), 3) calculer l'adresse de ReflectiveLoader dans le buffer (offset depuis le début de la DLL), 4) CreateRemoteThread avec l'adresse de ReflectiveLoader comme point de départ. ReflectiveLoader se charge lui-même et appelle DllMain. La DLL apparaît uniquement dans les dumps mémoire raw, pas dans la liste des modules chargés.

Exploitation offensive

Le reflective loading est la technique de base de tous les frameworks C2 modernes pour leurs agents. Il permet d'utiliser tout l'écosystème d'outils .NET (SharpHound, Rubeus, Seatbelt) via Execute-Assembly sans aucun artefact disque. La persistance fileless associée (stocker l'assembly chiffrée en registre) complète l'approche pour des opérations sans trace disque.

Détection et mitigation

Les EDR avec memory scanning détectent les structures PE (MZ/PE headers) dans des régions mémoire non mappées depuis des fichiers disque — un indicateur fort de reflective loading. Les ETW Threat Intelligence events capturent les allocations mémoire et les créations de threads associées au reflective loading. Defender for Endpoint a des détections spécifiques pour les patterns Cobalt Strike Beacon et autres frameworks.

Articles liés

Un projet cybersécurité ?

Expert dispo · Réponse 24h

Devis