Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ReflectivePluginLoader — Mappeur PE réflexif et moteur de stomping de modules renforcé contre l'évasion pour Windows x64 | Kitploit
Outils/GitHubGitHub/racoten/reflectivepluginloader
Outils DéfensifsMécanismes de PersistanceRétro-ingénierieShellcodePost-ExploitationAnalyse de MalwareApprentissage et ÉducationRed TeamingDéveloppement de Charges UtilesExploitation de Binaires
GitHub
82116il y a 1 jourPas encore vérifié
racoten/reflectivepluginloader

ReflectivePluginLoader

Mappeur PE réflexif et moteur de stomping de modules renforcé contre l'évasion pour Windows x64

Voir le dépôt

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

ReflectivePluginLoader

License: MIT

Un mappeur PE réflexif minimal et un moteur de module stomping pour Windows x64, construit autour d'une ABI IPlugin propre. Mappe une DLL depuis un tampon d'octets en mémoire, résout les exports et appelle les fonctions du plugin — soit depuis une mémoire anonyme (chargement réflexif classique), soit depuis l'intérieur d'une DLL sacrificielle légitimement chargée (module stomping).

Le chemin de module stomping est durci contre l'évasion : protections par section (pas de RWX), nettoyage du mapping privé, restauration des octets d'origine et effacement du tas. Les analyses post-nettoyage avec pe-sieve, Moneta, hollows_hunter, BeaconEye et YARA ne retournent aucun résultat sur le module stompé.

Démarrage rapide

Nécessite CMake 3.15+ et soit MSVC, Clang, soit MinGW sous Windows.

# Configure (defaults to Release)
cmake -B build -G Ninja

# Build
cmake --build build

# The build produces:
#   build/Modules/CmdPlugin/cmdplugin.dll   (example plugin)
#   build/Testing/harness.exe               (test harness)

Pour une compilation Debug avec sortie de diagnostic complète :

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build

Utilisation

Chargement réflexif classique

.\harness.exe cmdplugin.dll whoami

Mappe le plugin dans une mémoire allouée par VirtualAlloc. Aucune entrée PEB, aucune notification du loader.

Module Stomping

.\harness.exe cmdplugin.dll whoami --stomp xpsservices.dll
.\harness.exe cmdplugin.dll "dir C:\" --stomp mscms.dll

Charge la DLL sacrificielle légitimement via LoadLibrary, puis écrase son .text avec le plugin en tant qu'image contiguë. L'exécution se produit depuis l'espace d'adressage de la DLL sacrificielle — les piles d'appels et les listes de modules attribuent le code au module sacrificiel.

Le harnais met en pause après le nettoyage afin que vous puissiez exécuter des scanners de mémoire contre le processus.

Comment fonctionne le Module Stomping

1. MapImage(plugin)               private reflective mapping
2. LoadLibrary(sacrificial)       legitimate load, PEB entry
3. Save original .text bytes      for later restoration
4. Copy plugin image -> .text     contiguous image preserves RIP-relative offsets
5. Relocate stomped code          fix addresses for new base
6. Patch entry point              mov eax,1; ret (safe FreeLibrary)
7. Per-section protections        RX / R / RW per section (never RWX)
8. Resolve exports                from private mapping, return stomped addresses
9. Free private mapping           eliminates floating PE artifact
10. Execute plugin                code runs inside "sacrificial.dll"

Nettoyage (Évasion)

11. Restore original .text bytes  sacrificial code back in place
12. FreeLibrary(sacrificial)      unloads the module
13. LoadLibrary(sacrificial)      fresh load = clean file-backed pages
14. Scrub heap buffers            zero saved bytes + raw DLL data

Après le nettoyage, la DLL sacrificielle est indiscernable d'un module chargé normalement. Les pages sont adossées à un fichier (non privées), le contenu correspond au fichier sur disque, et aucun artefact PE ne subsiste sur le tas.

Techniques d'évasion

IOCAtténuation
Régions mémoire RWXProtections par section : .text RX, .rdata R, .data RW
Mémoire exécutable privée (PE flottant)VirtualFree du mappage privé après résolution des exports
Code de module modifiéRestaurer les octets originaux de .text, puis FreeLibrary + LoadLibrary pour des pages propres adossées à un fichier
En-têtes PE sur le tasmemset(0) du tampon brut de la DLL et des octets sauvegardés avant libération
Plantage de DllMain au déchargementPoint d'entrée patché en mov eax,1; ret avant l'écrasement

Structure du projet

ReflectivePluginLoader/
├── CMakeLists.txt
├── Include/
│   ├── IPlugin.h                      Plugin ABI (TaskApi, IPlugin)
│   ├── ReflectiveLoaderEngine.h       PE mapper + export resolver
│   └── StompedLoaderEngine.h          Module stomping engine
├── Modules/
│   └── CmdPlugin/
│       ├── cmdplugin.cpp              Command execution plugin
│       └── CMakeLists.txt
├── Testing/
│   ├── main.cpp                       Test harness
│   └── CMakeLists.txt
└── Tools/
    └── file2hex.py                    DLL to C byte array converter

Écrire un plugin

  1. Créez un répertoire sous Modules/ et incluez IPlugin.h.
  2. Implémentez l'interface IPlugin :
#include "IPlugin.h"

class MyPlugin : public IPlugin {
public:
    void init()                  const override { /* setup */ }
    void execute(TaskApi* task)  const override { /* work  */ }
    void cleanup()               const override { /* tear  */ }
};
  1. Exporter les cinq points d'entrée (create_plugin, destroy_plugin, plugin_init, plugin_exec, plugin_cleanup). Utiliser HeapAlloc + placement new pour une allocation sûre vis-à-vis du CRT.

  2. Ajouter un CMakeLists.txt et l'enregistrer à la racine avec add_subdirectory().

Choisir une DLL sacrificielle

La section .text de la DLL sacrificielle doit être plus grande que la taille de l'image virtuelle du plugin. Elle ne doit pas être activement utilisée par le processus ni soumise à un contrôle d'intégrité à l'exécution.

Bons candidats : xpsservices.dll (1,8 Mo de .text), mscms.dll, colorui.dll, npmproxy.dll

Mauvais candidats : ntdll.dll, kernel32.dll (activement utilisés), clr.dll (contrôle d'intégrité)

Limitations

  • Pris en charge : les relocalisations de base, la résolution des imports, les protections par section, l'écrasement d'image contiguë, le nettoyage complet avec restauration des pages
  • Non pris en charge : les callbacks TLS, les imports à chargement différé, les exports redirigés, CFG, l'enregistrement de la table SEH
  • Écrasement : l'intégralité de l'image virtuelle du plugin doit tenir dans la section .text sacrificielle

Ce qui a changé (v2.0 — Renforcement de l'évasion)

Cette version est une réécriture complète de la preuve de concept originale :

  • Moteur d'écrasement de module (StompedLoaderEngine.h) — écrasement d'image contiguë avec nettoyage complet d'évasion
  • Protections mémoire par section — .text RX, .rdata R, .data RW ; plus de régions RWX
  • Élimination des pages privées — le cycle FreeLibrary + LoadLibrary remplace les pages privatisées par des pages propres adossées à un fichier
  • Nettoyage du tas — les octets bruts de la DLL et la .text originale sauvegardée sont mis à zéro avant la fenêtre de scan
  • Correctif du point d'entrée — mov eax,1; ret empêche le crash de DllMain pendant FreeLibrary
  • Nettoyage du mapping privé — VirtualFree du mapping réflectif après résolution des exports (élimine le PE flottant)
  • Réécriture du loader réflectif (ReflectiveLoaderEngine.h) — mapping direct depuis le tampon d'entrée, sans copie intermédiaire via VirtualAlloc
  • Nettoyage de l'ABI du plugin (IPlugin.h) — suppression des helpers morts (BeaconCout, CStrLenA, PluginAlloc, PluginFree)
  • Nettoyage de CmdPlugin — suppression de toutes les chaînes marqueurs et artefacts de débogage
  • Réécriture du harnais de test (main.cpp) — compilation conditionnelle via NDEBUG ; les builds Release n'affichent que la sortie des commandes et les commandes de scan
  • Valeurs par défaut CMake — type de build Release par défaut, -nostartfiles pour les DLL de plugin (pas de CRT dans le code chargé de manière réflective)

Résultats du scanner (après nettoyage)

image

Références

Télécharger l’outil