(TAOMF) Les processus Windows

L'ensemble des articles tagués TAOMF ont été écrit à partir d'un ensemble de notes prises suite à la lecture du livre "The Art Of Memory Forensic" écrit par Michael Hale Ligh, Andrew Case, Jamie Levy et Aaron Walters.

Tout les crédits de ces articles leur reviennent donc de droits. Par ailleurs je vous invite vraiment à lire ce livre qui est une mine colossale d'informations.


Tous les processus Windows sont représentés par une stucture _EPROCESS. Cette structure est évidemment composée de tout un tas d'informations telles qu'un identifiant de processus, son nom ou encore la liste des threads actifs.

On y trouve aussi:

  • Un pointeur vers le Process Environment Block. Cette PEB contient tout un tas d'informations relatives variables du processus: les adresses mémoires des DLL's (Ldr) dont il a besoin pour s'exécuter, son répertoire courant absolu (ImageBaseAddress), les arguments passés aux programmes (ProcessParameters), les variables d'environnement, un pointer vers la heap (ProcessHeap), le nombre de heap en cours d'utilisation ainsi que leurs adresses de commencement (NumberOfHeaps et ProcessHeaps) et certains handlers standards

La structure PEB contient d'autres informations très utiles comme par exemple le flag BeingDebugged ou encore le flag NTGlobalFlags . Ces flags indiquent si le processus est actuellement en cours de debugging. Souvent les malware vont vérifier que leur processus n'a pas ces flags activés de manière à empêcher toute analyse active du malware. Ils peuvent aussi s'attacher à eux même de manière à empêcher tout autre debugger de s'attacher au processus malveillant puisqu'il ne peut y avoir qu'un debugger attaché à un processus.

  • La VadRoot: la racine de la structure VAD dont on reparlera plus tard.

La structure _EPROCESS contient une structures _LIST_ENTRY appellée ActiveProcessLinks qui elle même contient deux membres: un pointer Flink (Forward link) qui pointer vers la structure _LIST_ENTRY de la structure _EPROCESS suivante et un pointer Blink (Backward link) qui pointer vers la structure _LIST_ENTRY de la structure _EPROCESS précédente.

Cette structure en double liste chaînée permet, théoriquement, de garder une trace de l'ensemble des processus existants. Pour accéder à cette structure il va d'abord falloir parser le contenu de la structure _KDDDEBUGGER_DATA64 et récupérer l'adresse contenue dans la variable PsActiveProcessHead. L'adresse contenue dans cette variable pointe directement vers le début de la double liste chaînée de structures _EPROCESS:

Ainsi pour énumérer les processus actifs il suffit de parcourir la double liste chaînée de structures _EPROCESS mais ce n'est pas la seule manière. Actuellement volatility permet de lister les processus présents lors de l'acquisition de la RAM via quatre modules différents:

  • pslist:  parcourt la double liste chaînée de structures _EPROCESS et affiche un résumé des données trouvées
  • pstree: récupère l'output du plugin pslist et affiche l'arborescence des relations parents/fils entre processus
  • psscan: crawl le dump mémoire à la recherche de structures _EPROCESS. Ce plugin peut, contrairement au plugin pslist, lister les processus terminées ou cachés.
  • psxview: utilise des techniques de détection alternatives. Par exemple il va chercher l'ensemble des structures _ETHREAD (puisque tous processus doit obligatoirement avoir un thread) et lier ce thread à un processus. Il va aussi se baser sur le processus CSRSS. En effet csrss.exe est un binaire impliqué dans la création de tous processus/thread. Ce processus csrss détient une liste contenant l'ensemble des handlers vers les structures _EPROCESS de chaque processus. Il est ainsi possible de lister les processus via ce processus.

Alors pourquoi est-ce que je vous dis que psscan peut lister les processus cachés. Eh bien tout simplement car comme nous l'avons vu, chaque processus dans la double liste chaînée est liée au processus précédant ainsi qu'au processus suivant. Ainsi un analyste qui ne fait que parcourir la double liste pourrait passer à coter d'un processus qui se serait volontairement détaché de cette liste:

De cette manière le processus malveillant passe inaperçu. Cette attaque est un des nombreux types d'attaque DKOM (Direct Kernel Object Manipulation).