Skip to content

Section Mapping Injection

Injecter du code sans WriteProcessMemory en mappant une section partagée à la fois dans le processus local et distant, en écrivant le shellcode via la vue locale, puis en l'exécutant depuis la vue distante.

L'injection par mappage de section délivre une charge utile dans un processus distant sans jamais appeler WriteProcessMemory, déjouant l'API d'injection la plus surveillée. L'attaquant crée un objet section adossé à la mémoire et en mappe deux vues : une vue lecture/écriture dans le processus local et une vue lecture/exécution dans le processus distant. Le shellcode écrit via la vue locale est immédiatement visible dans la vue distante (mémoire partagée), de sorte qu'un thread distant peut l'exécuter sans aucune écriture inter-processus.

Fonctionnement

Un objet section adosse les deux vues aux mêmes pages physiques. La vue locale est mappée PAGE_READWRITE (pour rédiger le shellcode) et la vue distante PAGE_EXECUTE_READ (pour l'exécuter). Comme les deux descripteurs partagent la section, un memcpy dans la vue locale se propage au processus distant. L'exécution est lancée avec un thread distant, un APC mis en file, ou un détournement de thread.

text
NtCreateSection(&hSection, ..., PAGE_EXECUTE_READWRITE, SEC_COMMIT, NULL)
NtMapViewOfSection(hSection, GetCurrentProcess(), &localView, ..., PAGE_READWRITE)
NtMapViewOfSection(hSection, hRemoteProc, &remoteView, ..., PAGE_EXECUTE_READ)
memcpy(localView, shellcode, len)            // shared pages — appears in remoteView
CreateRemoteThread(hRemoteProc, NULL, 0, remoteView, arg, 0, NULL)
// or NtQueueApcThread(hThread, remoteView, ...) / thread hijack -> remoteView

Détection & contournement

  • Statique — Le chargeur importe les API natives de section NtCreateSection, NtMapViewOfSection et NtUnmapViewOfSection depuis ntdll, mais pas WriteProcessMemory et souvent pas VirtualAllocEx. Cette absence délibérée, associée à NtMapViewOfSection et à une primitive d'exécution distante (CreateRemoteThread/NtQueueApcThread), constitue la signature statique.
  • Dynamique — Surveillez NtMapViewOfSection appelé deux fois sur le même handle de section avec deux handles de processus différents, où le mappage distant est exécutable (PAGE_EXECUTE_READ) et où aucun WriteProcessMemory ne précède l'exécution. Un mappage de section exécutable inter-processus suivi d'un CreateRemoteThread / d'une mise en file d'APC vers cette vue est la chaîne comportementale clé (et Sysmon EID 8 enregistre toujours le thread distant).
  • Forensique mémoire — La région injectée est partagée (et non privée) et exécutable, non adossée à une image. Moneta signale les régions RX partagées et la mémoire partagée exécutable non adossée ; pe-sieve rapporte le mappage partagé exécutable sans appui disque. Les mêmes pages physiques apparaissant mappées dans deux processus sont en soi anormales.
  • Outils — Moneta (détection RX partagé / exéc non adossé), pe-sieve, Process Hacker (objets section + type/protection de région), API Monitor / ETW (appels et handles NtMapViewOfSection), Sysmon (EID 8 thread distant), et Volatility (vadinfo pour les régions exécutables partagées).
Votes

Commentaires(0)