(TAOMF) Dynamic Link Libraries

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.


Une DLL (Dynamic Link Librairy) est une librairie partagée contenant du code qui peut être utilisé par plusieurs processus. Ces DLL's sont dynamiquement chargées par un processus et, par conséquent, ont accès à toutes les ressources de ce processus (handlers, thread etc...).

Pour ces raisons, les DLL's sont très prisées des attaquants. Lorsque l'on analyse un dump mémoire il peut donc être très intéressant d'analyser les DLL's qui ont été chargé, depuis quelle location elles ont été chargés et surtout leurs noms. En effet certaines DLL's, bien que légitimes, peuvent paraître suspectes. Les DLL's ws2_32.dll, crypt32.dll, hnetcfg.dll et pstorec.dll sont notamment utilisées afin d'initier des connexions réseaux, chiffrer des données ou encore accéder à des données sensibles.

Une DLL peut être chargée de quatre manières différentes:

  • Linkage dynamique: un exécutable dispose d'une table IAT (Import Address Table). Dans cette table se trouve la liste de toutes les DLL's nécessaires au bon fonctionnement du processus ainsi que l'adresse mémoire des fonctions nécessaires. Ainsi lorsque l'exécutable est lancé, le PE loader (le processus chargé de lancer les binaires PE) va dynamiquement linker les DLL's au processus lancé.
  • Via dépendances: les DLL's elles-même disposent d'une IAT et donc dépendent d'autres DLL's qu'elles chargeront pour pouvoir bien fonctionner.
  • Linkage dynamique en run-time: la DLL est chargée dynamiquement par un thread en cours d'exécution.
  • Injections de DLL: la DLL est injectée dans un processus (on y reviendra un peu plus tard).

Avant d'étudier une DLL il va falloir les lister. La suite SysInternals permet de les lister via l'outil listdlls, volatility le permet aussi via le module dlllist.Chaque structure _EPROCESS contient une structure _PEB et chaque structure _PEB contient une structure _PEB_LDR_DATA dans laquelle se trouve trois doubles listes chaînées, LoadLinks, MemoryLinks et InitLinks:

Du coup, de la même manière que pour les structures _EPROCESS, il est possible de délinker une DLL de ces doubles listes chaînées de manière à le cacher:

Tout outils qui ne ferait que suivre cette double liste chaînée passerait à côté d'une DLL sûrement malveillante. C'est le cas du module dlllist.

Alors comment pourrait-on détecter ces attaques via déréférencement ? La manière la plus simple est de crawler les structures VAD des processus. En effet dans chaque structure VAD se trouve la liste des chemins absolus des DLL's chargées en mémoire (DLL's comprises). En analysant les DLL's chargées et listées dans la structure VAD on pourra assez aisément détecté la présence d'une DLL malveillant (c'est d'ailleurs ce que fait le module ldrmodules de volatility).

Une fois la DLL malveillant détectée on pourra la dumper à partir du module dlldump de volatility.