A.Développer un loader de shellcode qui utilise l'API Windows
1.Définition
Loader : Un Loader (ou Dropper s'il contient le fichier) est un programme conçu pour charger et exécuter une charge utile (payload) en mémoire.
Son objectif principal n'est pas d'être malveillant en soi, mais de préparer le terrain pour que le code malveillant (souvent un shellcode ou une DLL) puisse s'exécuter sans être détecté par les antivirus (AV) ou les systèmes EDR.
Ses rôles clés :
Allocation : Demander au système d'exploitation de la mémoire pour y placer le code.
Évasion : Utiliser des techniques discrètes (comme les syscalls ou l'API Hashing) pour contourner la surveillance des API Windows.
Packer : Un Packer est un outils qui prend un programme exécutable (votre .exe ou .dll final) et le compresse ou le chiffre pour le rendre illisible.
Le but : L'obfuscation et la compression. Il s'agit de changer la "signature" du fichier pour qu'il ne ressemble pas à un programme connu (et pour échapper aux antivirus statiques).
Le fonctionnement : Il ajoute un petit morceau de code au début du fichier (appelé le Stub). Quand vous lancez le fichier "packé", le Stub s'exécute en premier, déchiffre/décompresse le programme original en mémoire, puis lui donne la main.
2.Logique et Architecture
Objectif
Lancer un code binaire (Shellcode) dans l'espace mémoire du processus hôte (simple_loader.exe) en utilisant les fonctions de l'API Windows.
🧱 Architecture
Étape
Action
API / Fonction C
1. Déclaration
Le Shellcode est stocké dans le code source en tant que tableau de bytes bruts.
unsigned char payload[]
2. Allocation
Demander au système une zone mémoire avec les droits Exécution, Lecture et Écriture.
VirtualAlloc avec PAGE_EXECUTE_READWRITE
3. Copie
Déplacer le Shellcode du code source (section .data du programme) vers la nouvelle zone mémoire allouée.
memcpy
4. Exécution
Créer un nouveau Thread qui commence son exécution à l'adresse du Shellcode.
CreateThread
3.Génération d'un shellcode
On va générer avec msfvenom un shellcode pour ouvrir une calculatrice :

4. Code C
Donc pour ce faire on va devoir alloué une zone mémoire pour ce faire on va utilisé la fonction VirtualAlloc (https://learn.microsoft.com/fr-fr/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc) :

Cette fonction vient de la DLL kernel32.dll et disponible dans windows.h :

On va disséquer cette fonction :
LPVOID : Valeur de retour de type LPVOID (P = pointeur) -> Pointeur vers n’importe quel type.
Premier paramètre lpAddress : Adresse de départ de la région à allouer en gros à quelle adresse on va démarrer notre zone mémoire (optionnel)
Second paramètre dwSize : Taille de la région mémoire qu'on souhaite alloué en octet
Troisième paramètre flAllocationType : Type d’allocation de mémoire MEM_COMMIT, MEM_RESERVE, MEM_RESET, MEM_RESET_UNDO
Quatrième paramètre flprotect: Protections qui déterminent si le code s'exécutant dans le processus peut lire, écrire et/ou exécuter les données stockées dans cette région de mémoire.
Ainsi ça nous donne le code suivant :
Étape 1 : Déclaration
Étape 2 : Allocation
Étape 3 : Copie
Étape 4 : Exécution
Code complet :
4. Compilation

Last updated