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 :

  1. Allocation : Demander au système d'exploitation de la mémoire pour y placer le code.

  2. É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