Analyse statique vs dynamique en RE de malwares
Analyse statique vs dynamique en reverse engineering de malwares : avantages, inconvénients, quand utiliser chacune et comment l'anti-analyse les déjoue.
Les reverse engineers passent beaucoup de temps à choisir entre deux angles de vue complémentaires : examiner un programme au repos, ou le regarder s'exécuter. Comprendre l'analyse statique vs dynamique — quand chacune brille, où chacune échoue, et comment les auteurs de malwares exploitent cet écart — est fondamental pour tout workflow d'analyse de malwares.
Qu'est-ce que l'analyse statique ?
L'analyse statique consiste à inspecter un échantillon sans l'exécuter. Vous travaillez à partir des octets présents sur le disque : les en-têtes du fichier, les chaînes embarquées, les imports, les ressources et le code désassemblé ou décompilé.
Les techniques statiques typiques incluent :
- La lecture des en-têtes PE/ELF pour comprendre les sections, les points d'entrée et les imports.
- L'extraction des chaînes de caractères pour faire ressortir URL, clés de registre et messages d'erreur.
- Le désassemblage et la décompilation (IDA, Ghidra, Binary Ninja) pour reconstituer le flot de contrôle et la logique.
- Le calcul de hachages et de signatures (règles YARA, import hashing) pour le triage et le clustering.
Comme rien ne s'exécute, l'analyse statique est par nature sûre et offre, en principe, une couverture complète du code — chaque branche est visible, même celles qu'une exécution unique n'atteindrait jamais.
Qu'est-ce que l'analyse dynamique ?
L'analyse dynamique exécute l'échantillon dans un environnement instrumenté et isolé — un sandbox, une VM, ou sous un débogueur — et enregistre ce qu'il fait réellement. Au lieu de raisonner sur le code, vous observez ses effets.
Les techniques dynamiques typiques incluent :
- Le sandboxing pour capturer l'activité du système de fichiers, du registre et des processus.
- La surveillance réseau pour révéler les domaines C2 et l'exfiltration.
- Le débogage (x64dbg, WinDbg, GDB) pour avancer pas à pas et dumper la mémoire.
- Le traçage des API et des syscalls pour voir exactement quelles fonctions l'échantillon appelle.
Le grand avantage : les packers et l'obfuscation qui dissimulent le code sur le disque deviennent sans objet une fois que la charge utile se décompresse en mémoire. Vous voyez le comportement réel — mais uniquement le long des chemins que l'exécution emprunte effectivement.
Analyse statique vs dynamique : tableau comparatif
| Dimension | Analyse statique | Analyse dynamique |
|---|---|---|
| Échantillon exécuté ? | Non | Oui |
| Sûreté | Élevée — le code ne s'exécute jamais | Plus faible — nécessite une forte isolation |
| Couverture du code | Complète en principe | Uniquement les chemins exécutés |
| Rapidité de triage | Rapide pour les échantillons simples | Plus lente ; nécessite mise en place et exécution |
| Déjouée par | Packers, obfuscation, chiffrement | Anti-débogage, anti-VM, vérifications de timing |
| Révèle le comportement réel ? | Inféré, non observé | Directement observé |
| Environnement | Désassembleur / éditeur hexadécimal | Sandbox / VM / débogueur |
Quand utiliser laquelle
Choisissez votre angle de départ selon l'échantillon et votre objectif :
- Commencez en statique pour le triage, la classification, et lorsque vous avez besoin d'une couverture complète de la logique — par exemple pour écrire des règles de détection ou cartographier chaque commande du dispatcher d'une backdoor.
- Commencez en dynamique lorsque l'échantillon est packé, lorsque l'analyse statique bloque, ou lorsque vous avez spécifiquement besoin d'artefacts d'exécution comme des adresses C2, des fichiers déposés ou une configuration déchiffrée.
- Utilisez la statique pour guider la dynamique. Identifiez une fonction intéressante statiquement, puis posez-y un point d'arrêt à l'exécution.
- Utilisez la dynamique pour débloquer la statique. Laissez l'échantillon se décompresser en mémoire, dumpez la charge utile en clair, puis revenez au désassembleur avec du code lisible.
Comment les deux approches se complètent
En pratique, le workflow est une boucle, pas une bifurcation. Un schéma courant : trier en statique, exécuter l'échantillon pour le laisser se déchiffrer lui-même, dumper l'image décompressée, puis ré-analyser ce dump en statique. Les chaînes récupérées dynamiquement vous indiquent où regarder dans le désassemblage ; le flot de contrôle reconstitué statiquement vous indique quels points d'arrêt comptent. L'index navigable des techniques de reverse engineering est organisé précisément autour de cette interaction, et le glossaire définit les termes sous-jacents.
Comment les astuces anti-analyse ciblent chaque approche
Les auteurs de malwares savent vers quel angle vous allez vous tourner, et ils conçoivent des contre-mesures visant spécifiquement chacun. C'est là que la distinction statique/dynamique cesse d'être académique.
Déjouer l'analyse statique
L'objectif ici est de rendre les octets sur le disque illisibles ou trompeurs.
- Le packing compresse ou chiffre la charge utile derrière un petit stub de décompression. Votre désassembleur voit le stub, pas le malware. Voir la catégorie techniques de packing.
- L'obfuscation brouille une logique autrement visible — aplatissement du flot de contrôle, prédicats opaques et code parasite. Parcourez la catégorie techniques d'obfuscation.
- Les stackstrings construisent les chaînes octet par octet sur la pile, de sorte qu'elles n'apparaissent jamais dans un dump de chaînes. Voir stackstrings.
- L'API hashing résout les imports par hachage à l'exécution, de sorte que la table d'imports ne révèle rien d'utile statiquement. Voir API hashing.
Chacune de ces techniques émousse spécifiquement une technique statique tout en laissant intact le comportement à l'exécution — ce qui est exactement la raison pour laquelle les analystes basculent vers l'analyse dynamique lorsque l'analyse statique se heurte à un mur.
Déjouer l'analyse dynamique
Ici, l'objectif est de remarquer que l'échantillon est surveillé, puis de mal se comporter ou de rester dormant.
- L'anti-débogage détecte les points d'arrêt, les drapeaux de débogueur et les processus attachés.
- L'anti-VM prend l'empreinte du matériel virtualisé, des artefacts de sandbox et des environnements suspects.
- Les vérifications de timing comme le timing RDTSC mesurent la durée des opérations ; l'exécution pas à pas ou l'instrumentation ralentit suffisamment l'exécution pour trahir l'analyse.
L'éventail complet de ces contre-mesures se trouve dans la catégorie techniques d'anti-analyse. Les déjouer revient généralement à patcher les vérifications, à durcir le sandbox, ou à hooker les API concernées pour mentir au malware en retour.
À retenir
L'analyse statique et l'analyse dynamique ne sont pas des concurrentes — ce sont deux moitiés d'une même investigation. La statique vous donne la portée et la sûreté ; la dynamique vous donne la vérité terrain. Les astuces anti-analyse exploitent la jointure entre les deux, ce qui est précisément pourquoi un reverse engineer compétent garde les deux angles à portée de main et bascule dès que l'un bloque.
Prêt à aller plus loin ? Explorez le catalogue complet des techniques de reverse engineering pour voir exactement comment chaque astuce anti-analyse fonctionne — et comment la déjouer — à travers les workflows statiques et dynamiques.