Chapitre 2 — Analyse statique de malwares¶
Présentation de ce chapitre
1. Principe de l'analyse statique¶
L'analyse statique consiste à examiner un échantillon suspect sans jamais l'exécuter. C'est généralement la première étape d'une analyse de malware : elle est rapide, ne présente aucun risque d'exécution accidentelle de code malveillant, et permet souvent d'obtenir des informations exploitables (identification d'une famille connue, indicateurs de compromission) sans avoir à mettre en place un environnement d'exécution isolé.
Son inconvénient principal est qu'elle ne révèle que ce qui est visible dans le fichier lui-même : un malware bien obfusqué ou chiffré (packé) peut dissimuler l'essentiel de son comportement réel à une analyse purement statique, ce qui justifie de la compléter par l'analyse dynamique (chapitre 3).
2. Hachage et identification¶
La première étape d'une analyse statique est presque toujours le calcul d'une empreinte cryptographique (hachage) de l'échantillon, qui permet de l'identifier de façon unique et de vérifier s'il correspond à un échantillon déjà connu et documenté.
# Calcul de plusieurs empreintes standards d'un fichier
sha256sum echantillon.bin
md5sum echantillon.bin
sha1sum echantillon.bin
En pratique, le hachage SHA-256 est aujourd'hui la référence pour l'identification d'échantillons (le MD5 et le SHA-1 restent utilisés par certains outils historiques, mais présentent des faiblesses cryptographiques étudiées dans le module Cryptanalyse, sans que cela remette en cause leur usage comme simple identifiant, hors contexte de sécurité). Ce hachage peut ensuite être confronté à des bases de connaissances répertoriant des échantillons déjà analysés, afin de déterminer immédiatement si le fichier correspond à une menace connue et documentée.
Une limite importante : un hachage cryptographique change radicalement dès que le fichier est modifié d'un seul octet. Des variantes légèrement modifiées d'un même malware (recompilation, ajout d'un octet inoffensif) produisent donc des hachages complètement différents, ce qui a motivé le développement de techniques de hachage flou (fuzzy hashing), capables de détecter une similarité partielle entre deux fichiers proches sans être identiques.
3. Extraction de chaînes de caractères¶
Un exécutable contient souvent des chaînes de caractères en clair — messages d'erreur, noms de fonctions, adresses réseau, chemins de fichiers, clés de registre — qui donnent des indices précieux sur son comportement, même sans le désassembler.
# Extraction des chaînes imprimables d'au moins 6 caractères
strings -n 6 echantillon.bin | less
# Recherche ciblée d'indices réseau ou de persistance
strings -n 6 echantillon.bin | grep -Ei "http://|https://|\.php|CurrentVersion\\\\Run"
Cette technique simple révèle fréquemment des éléments exploitables : une URL de serveur de commande et contrôle, un nom de mutex utilisé pour éviter une double infection, une clé de registre de persistance, ou même des commentaires laissés par le développeur du malware. Sa principale limite est que les auteurs de malwares plus sophistiqués chiffrent ou encodent délibérément ces chaînes pour échapper à ce type d'inspection rapide (voir la section sur l'obfuscation ci-dessous).
4. Identification du format et de la structure du binaire¶
Avant d'aller plus loin, il est essentiel d'identifier le type de fichier réel (indépendamment de son extension, qui peut être trompeuse) et la structure de son format exécutable.
Les deux formats d'exécutables les plus courants sont :
- PE (Portable Executable) : format des exécutables Windows (
.exe,.dll). Sa structure comprend un en-tête MS-DOS historique, un en-tête PE proprement dit, une table de sections (.textpour le code,.datapour les données,.rsrcpour les ressources), et une table d'importation qui liste les fonctions des bibliothèques système utilisées par le programme. - ELF (Executable and Linkable Format) : format standard des exécutables sous Linux et de nombreux systèmes Unix, structuré de façon comparable (en-tête, table de sections, table des symboles).
La table d'importation d'un exécutable PE (ou la table des symboles dynamiques d'un ELF) est particulièrement instructive : elle liste les fonctions système que le programme prévoit d'appeler. Des importations telles que des fonctions de manipulation du registre, de création de processus distant, ou de chiffrement, constituent des indices — non des preuves à elles seules — sur les capacités potentielles du programme.
5. Désassemblage de base¶
Le désassemblage consiste à traduire le code machine binaire (une suite d'octets) en instructions assembleur lisibles par un humain. C'est une étape plus coûteuse en temps que les précédentes, mais qui permet une compréhension bien plus fine du comportement du programme.
# Désassemblage sommaire en syntaxe Intel avec un outil GNU standard
objdump -d -M intel echantillon.bin | less
En pratique professionnelle, l'analyse manuelle d'un désassemblage complet est rarement exhaustive : l'analyste cible d'abord les fonctions les plus suspectes (repérées via les chaînes de caractères ou la table d'importation), plutôt que de lire linéairement l'ensemble du code. Les outils de désassemblage interactifs les plus utilisés dans l'industrie et la recherche (IDA Pro, Ghidra — cette dernière étant un outil de la NSA publié en open source, ou encore radare2, également libre) offrent en plus une reconstruction du flux de contrôle sous forme de graphe, une identification automatique des fonctions, et parfois une décompilation partielle vers un pseudo-code proche du C, qui facilite grandement la lecture par rapport à l'assembleur brut. Ces bases de lecture d'un désassemblage sont approfondies au chapitre 4.
6. Limites de l'analyse statique : obfuscation et packing¶
Les auteurs de malwares cherchent activement à contourner l'analyse statique, principalement par deux familles de techniques :
- Obfuscation : transformation du code ou des données pour les rendre plus difficiles à lire sans changer leur comportement (chiffrement de chaînes de caractères, insertion de code mort, renommage systématique de symboles, aplatissement du flux de contrôle). L'objectif est de ralentir l'analyste humain et de tromper les outils d'analyse automatisée basés sur des motifs simples.
- Packing (empaquetage) : compression ou chiffrement de tout ou partie du code exécutable réel, qui n'est déchiffré en mémoire qu'au moment de l'exécution, par une petite routine de décompression (stub) placée au début du programme. Un exécutable packé présente, à l'analyse statique, une entropie élevée (données qui ressemblent à du bruit aléatoire) et une table d'importation très réduite, car la majorité des fonctions réellement utilisées ne sont résolues qu'au moment de l'exécution.
# L'entropie de Shannon par section aide à repérer un empaquetage
# (une entropie proche de 8 bits/octet sur une section de code est suspecte)
Un packing détecté (par exemple une entropie anormalement élevée, ou la signature d'un empaqueteur connu) est en soi un indicateur utile, mais il ne dit rien du comportement réel du programme une fois déballé : c'est précisément la limite fondamentale de l'analyse purement statique face à ce type de protection. La suite logique consiste alors à observer le comportement du programme au moment de son exécution — c'est l'objet de l'analyse dynamique, présentée au chapitre suivant.
7. Méthodologie type d'une analyse statique¶
- Calculer les empreintes cryptographiques de l'échantillon et les confronter à des sources documentées.
- Identifier le type de fichier réel et sa structure (PE, ELF, script, document).
- Extraire et examiner les chaînes de caractères pour repérer des indices immédiats (URL, chemins, clés de registre).
- Examiner la table d'importation pour évaluer les capacités potentielles du programme.
- Évaluer l'entropie et rechercher des signes d'obfuscation ou de packing.
- Si nécessaire et pertinent, procéder à un désassemblage ciblé des fonctions les plus suspectes.
- Documenter systématiquement les observations, même partielles : elles orienteront l'analyse dynamique.
À retenir¶
- L'analyse statique examine un échantillon sans l'exécuter : rapide et sans risque d'exécution accidentelle, mais limitée face à un code obfusqué ou packé.
- Le hachage cryptographique (SHA-256 en priorité) sert d'identifiant unique et permet de confronter un échantillon à des bases de connaissances existantes.
- L'extraction de chaînes de caractères et l'examen de la table d'importation fournissent des indices rapides et souvent très informatifs sur les capacités d'un programme.
- Les formats PE (Windows) et ELF (Linux) partagent une logique commune : en-tête, sections, table des symboles/importations.
- Le désassemblage traduit le code machine en assembleur lisible ; les outils modernes (Ghidra, IDA, radare2) facilitent cette lecture par une reconstruction du flux de contrôle et une décompilation partielle.
- Une entropie élevée et une table d'importation anormalement réduite sont des indices classiques de packing, qui limite fortement la portée de l'analyse statique seule.
Dr. Zakaria Sawadogo — École Polytechnique de Ouagadougou