Cette bibliothèque Rust et cet outil CLI illustrent une méthode alternative pour trouver l'adresse de base des DLL chargées sans avoir recours à une marche du Process Environment Block (PEB). Cette technique est particulièrement utile dans les scénarios où la marche du PEB pourrait être détectée ou bloquée.
Différences entre les branches
Ce dépôt contient deux branches avec des approches différentes :
Branche principale
Utilise la crate winapi et VirtualQuery pour la validation de la mémoire
Les fonctions de la bibliothèque (lib.rs) ne contiennent aucune instruction d'impression pour une intégration propre
L'outil CLI (main.rs) inclut des sorties de débogage pour la preuve de concept
Idéal pour apprendre et comprendre la technique
Branche OPSEC
Aucune dépendance externe - entièrement autonome
Aucun appel aux API Windows - utilise un accès direct à la mémoire avec gestion des exceptions au lieu de
Aucune instruction d'impression dans les fonctions de la bibliothèque
Furtivité renforcée - n'effectue aucun appel API
Meilleur pour les implants/outils - laisse moins de traces et est plus difficile à détecter
Les deux branches sont sûres à utiliser, mais la branche OPSEC offre des avantages supplémentaires en matière de sécurité opérationnelle pour les scénarios où les appels API pourraient être surveillés ou bloqués.
Comment ça fonctionne
Le programme utilise une approche de parcours de pile (stack walking) pour localiser les DLL :
Accès au Thread Environment Block (TEB) :
Utilise l'assembleur inline pour lire le pointeur TEB à partir du registre de segment GS (GS:[0x30])
Récupère la base de la pile (GS:[0x08]) et la limite de la pile (GS:[0x10]) depuis le TEB
Parcours de la pile (Stack Walking) :
Démarre à partir du pointeur de pile actuel (RSP)
Remonte la pile à la recherche d'adresses de retour
Vérifie si chaque adresse correspond à de la mémoire exécutable
Branche principale : utilise VirtualQuery pour valider les régions mémoire
Branche OPSEC : utilise un accès direct à la mémoire avec gestion des exceptions
Identification du module :
Pour chaque adresse de retour potentielle, vérifie si elle pointe vers de la mémoire exécutable
Lorsqu'une mémoire exécutable est trouvée, remonte en arrière pour trouver l'en-tête PE
Valide le module en vérifiant :
la signature MZ (en-tête DOS)
la signature PE
les caractéristiques DLL
l'architecture 64 bits
le nom du module depuis le répertoire d'exportation
Validation :
Vérifie que le module est la DLL cible en contrôlant son nom dans le répertoire d'exportation
Confirme que toutes les structures de l'en-tête PE sont valides
Pourquoi cette approche ?
Les méthodes traditionnelles pour trouver les DLL impliquent souvent de parcourir la liste des modules du PEB. Bien que cette approche soit efficace, elle peut :
être détectée par les logiciels de sécurité
être bloquée dans certains environnements
Cette méthode de parcours de pile offre une alternative qui :
ne repose pas sur le PEB
peut fonctionner dans des environnements où le parcours du PEB est bloqué