SecurityInsider
Le blog des experts sécurité Wavestone

Reverse Engineering : focus sur l’analyse statique de malware




Pour analyser un malware prévu pour Windows, il est nécessaire de bien comprendre ce système d’exploitation, et notamment son utilisation par les malwares. Trois points nécessitent une attention particulière pour une analyse statique avancée réussie : l’API Windows, les registres Windows et l’API réseau.
D’autres éléments souvent utilisés par les malwares, et qu’il est donc important de savoir détecter sont les DLLs, les processus, les threads, les mutexes et les services. Ces différents éléments seront brièvement décrits plus bas.
Comme vous pouvez le voir il y a beaucoup d’éléments à regarder lors d’une analyse d’un code assembleur, d’autant plus que les programmes représentent souvent plusieurs dizaines de milliers d’instructions. Il faut donc s’armer de patience et avancer petit à petit, en se basant sur les résultats des analyses précédentes pour déterminer ce qu’il est le plus probable de trouver jusqu’à avoir une bonne idée de ce que fait le malware.

L’API Windows

L’API Windows est très complète, et il arrive souvent que des programmes ne nécessitent aucune fonction externe à celle-ci. C’est également le cas chez les malwares et c’est pourquoi il est important d’en connaitre au moins les bases.
La liste des types les plus communément utilisés dans les programmes est un premier élément à connaître. Cette liste est décrite ci-dessous :

Type (préfixe)
Description
WORD (w)
Une valeur de 16 bits non signée.
DWORD (dw)
Un double WORD, donc une valeur de 32 bits non signée.
Handles (H)
Une référence à un objet.
Long Pointer (LP)
Un pointeur vers un autre type. Par exemple « LPByte » est un pointeur vers un octet.
Callback
Une fonction appelé par l’API Windows.

Une manière d’interagir avec le système qui est très répandue chez les malwares est de créer ou modifier des fichiers. L’API Windows fournit des fonctions permettant d’interagir avec le système de fichiers parmi lesquelles on retrouve :
  • CreateFile utilisée pour créer ou ouvrir des fichiers. Le paramètre dwCreationDispsition contrôle laquelle des deux actions est réalisée.
  • ReadFile et WriteFile comme leur nom l’indique elles permettent de lire ou d’écrire dans des fichiers.
  • CreateFileMapping et MapViewOfFile la première de ces fonctions permet de charger un fichier depuis le disque dur vers la mémoire, le rendant plus facile à manipuler. La deuxième renvoie un pointeur vers l’adresse utilisée pour accéder au fichier en mémoire.
Remarque : Windows propose différents types de fichiers qui sont accessible autrement que par la lettre du disque ou le dossier comme le sont les fichiers classiques. On retrouve notamment les fichiers partagés dont le nom commence par \\serverName\share ou \\?\serverName\share, ou certains fichiers accessibles par leur namespace.
De nombreuses autres fonctions Windows sont bien sûr utilisés par les malwares, leur nom est souvent explicite, et il est toujours possible de rechercher dans la documentation de l’API si ce n’est pas le cas.

Les registres Windows

Les registres Windows sont très importants pour l’analyse de malware étant donné qu’ils servent souvent à la persistance de ceux-ci (comme vous pourrez très prochainement le voir dans la lettre du CERT-Solucom n°5). Regedit est un outil Windows permettant de voir et d’éditer les registres.



Tout comme pour les fichiers, l’API Windows propose plusieurs fonctions pour interagir avec les registres. On retrouve notamment :
  • RegOpenKeyEx : qui permet d’ouvrir un registre pour l’éditer. Il existe également des fonctions permettant d’éditer des registres sans les ouvrir mais la plupart des programmes préfèrent celle-ci.
  • RegSetValueEx : ajoute une nouvelle valeur dans un registre.
  • RegGetValue : renvoie les données correspondantes à une valeur d’un registre.

L’API réseau

Comme il a déjà été expliqué précédemment, les malwares établissent souvent des connexions externes. Pour cela ils utilisent souvent les Berkeley Compatible sockets qui sont des fonctionnalités réseau implémentées dans la bibliothèque Winsock. Les fonctions que l’on retrouve sont alors les suivantes :
Fonction
Description
socket
Crée une socket.
bind
Attache une socket à un port particulier.
listen
Indique à une socket d’attendre une connexion entrante.
accept
Ouvre une connexion avec une socket distante et l’accepte.
connect
Ouvre une connexion avec une socket distante. Nécessite que la socket distante soit en attente.
recv
Reçoit les données d’une socket distante.
send
Envoie des données à une socket distante.
Dans le cas où le malware représente le client d’une application, il sera sûrement utilisé les fonctions socket suivie de connect, et enfin autant de send et recv que nécessaire.
Si par contre le malware correspond au côté serveur, les fonctions utilisées seront dans l’ordre socket, bind, listen et accept, suivies d’autant de send et recv que nécessaire.
Remarque : Il existe une API réseau de plus haut niveau que Winsock et qui est souvent utilisée. Cette API s’appelle WinINet et implémente des protocoles tels que HTTP ou FTP.

Les DLLs (Dynamic link libraries)

Les DLLs ont été présentées précédemment et ne seront donc pas détaillées ici. Ce qu’il est important de retenir est que les malwares les utilisent de trois façons :
  • Pour déposer du code malveillant, comme ils le feraient dans un exécutable.
  • En utilisant les DLLs Windows afin d’interagir avec le système d’exploitation.
  • En utilisant les DLLs d’autres sources.

Les processus

Les processus sont une autre technique utilisée par les malwares pour exécuter du code qui n’est pas présent directement dans leur programme. Une analyse des processus grâce à des outils comme ProcMon a déjà été présentée auparavant mais il peut être intéressant de repérer les interactions du malware avec les processus à partir du code assembleur.
La fonction la plus utilisée par les malwares est la fonction CreateProcess qui permet de créer un processus. Cette fonction utilise de nombreux paramètres, laissant un large contrôle sur la manière dont le processus est créé. Par exemple un malware peut créer un processus dans lequel il exécute du code malveillant, dans le but de passer outre les firewalls basés sur l’hôte et d’autres mécanismes de sécurité.
Souvent les malwares utilisent cette fonction pour créer une invite de commande distante accessible grâce à une simple commande. Pour cela ils relient les valeurs de la structure STRATUPINFO à un socket afin que la sortie standard du programme soit ce socket.

Les threads

Les programmes créent souvent des threads afin d’exécuter des actions sans attendre la réponse d’autres threads. Pour réaliser cela la fonction CreateThread est utilisée. Deux des raisons les plus probables de l’utilisation de cette fonction par un malware sont le chargement d’une bibliothèque dans un processus, auquel cas l’adresse de la fonction LoadLibrary est spécifiée en argument de CreateThread en tant qu’adresse de départ, et la création de deux threads pour les entrées et sorties du programme, les reliant généralement à un socket.

Les mutexes

Afin de gérer les processus et les threads, les programmes utilisent des mutexes. Ils représentent en effet le moyen le plus commun pour contrôler l’accès à des ressources partagées.
Les fonctions OpenMutex, CreateMutex, WaitForSingleObject et ReleaseMutex sont les signes que de tels objets sont utilisés.

Les services

Une autre manière pour un malware d’exécuter du code externe est de l’installer en tant que service. L’avantage de cette méthode pour les malwares est que les services sont généralement lancés en tant que SYSTEM, lui donnant tous les privilèges nécessaires. Ils sont d’ailleurs également utilisés comme moyen de persistance afin d’être automatiquement exécutés au démarrage du système d’exploitation par exemple. Ils peuvent également être invisibles au gestionnaire de tâche.
Trois fonctions principales servent à la manipulation de services : OpenSCManager, CreateService et StartService.


L’analyse de malware n’est pas une activité simple, nous espérons néanmoins que ces quelques éléments vous donneront des pistes pour vos prochaines analyses !
Nicolas DAUBRESSE

Aucun commentaire:

Enregistrer un commentaire