L’analyse statique de malwares consiste à examiner un fichier malveillant sans l’exécuter. Cette approche sans risque permet d’identifier rapidement les capacités d’un malware, ses indicateurs de compromission (IoC) et ses mécanismes de persistance. Ce chapitre couvre les outils et méthodes employés par les analystes malware professionnels.
Identification initiale
# Identifier le type de fichier
file malware.exe
file malware.bin
# Calculer les hashes (pour recherche dans VirusTotal)
md5sum malware.exe
sha256sum malware.exe
# Rechercher sur VirusTotal
curl -s "https://www.virustotal.com/api/v3/files/$(sha256sum malware.exe | cut -d' ' -f1)" \
-H "x-apikey: VOTRE_CLE" | python3 -m json.tool | grep last_analysis_stats -A10
Analyse des strings
# Extraire les chaînes ASCII et Unicode
strings malware.exe
strings -e l malware.exe # Unicode 16-bit little-endian
# Chercher des IoC dans les strings
strings malware.exe | grep -iE "http|\.com|\.ru|cmd|powershell|registry"
strings malware.exe | grep -iE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
# FLOSS : extraire les strings obfusquées (FLARE team)
floss malware.exe
Analyse de l’en-tête PE (Windows)
# PE Studio : outil graphique complet (Windows)
# Analyse : imports, exports, sections, ressources, timestamps
# pestool (Linux)
pip install pefile
python3 -c "
import pefile
pe = pefile.PE('malware.exe')
print('Timestamp:', pe.FILE_HEADER.TimeDateStamp)
print('Architecture:', hex(pe.FILE_HEADER.Machine))
for imp in pe.DIRECTORY_ENTRY_IMPORT:
print('DLL:', imp.dll.decode())
for entry in imp.imports:
if entry.name: print(' ', entry.name.decode())
"
Sections PE suspectes
Section Taille virtuelle vs taille brute Indicateur
.text Très grande Code packed/chiffré
.data Entropie élevée (>7) Données chiffrées (AES, XOR)
.rsrc Exécutable embarqué Dropper (installe un autre malware)
UPX0 Présence Packer UPX détecté
# Mesurer l'entropie par section
python3 -c "
import pefile, math
pe = pefile.PE('malware.exe')
for s in pe.sections:
data = s.get_data()
if len(data) == 0: continue
freq = [data.count(bytes()) for i in range(256)]
entropy = -sum(f/len(data)*math.log2(f/len(data)) for f in freq if f)
print(s.Name.decode().strip(), f' → entropie: {entropy:.2f}')
"
Décompilation avec Ghidra / IDA Free
Workflow Ghidra :
1. File → New Project → Import File (malware.exe)
2. Auto-analyze (accepter les options par défaut)
3. Symbol Tree → Functions → identifier main() ou WinMain()
4. Décompiler → pseudo-code C à analyser
5. Renommer les variables et fonctions pour la lisibilité
6. Chercher les appels à : CreateProcess, WriteFile, RegSetValue, WSAConnect
Fonctions API Windows suspectes :
CreateRemoteThread → injection de code dans un autre processus
VirtualAllocEx → allouer mémoire dans un autre processus
WriteProcessMemory → écrire dans un autre processus (code injection)
RegSetValueEx → persistance dans le registre Windows
URLDownloadToFile → téléchargement de fichier depuis Internet
CryptEncrypt → chiffrement (ransomware)
Règles YARA
// Règle YARA pour détecter un ransomware XYZ
rule Ransomware_XYZ {
meta:
description = "Détecte le ransomware XYZ"
author = "Analyste"
date = "2024-01-15"
strings:
$s1 = "YOUR FILES HAVE BEEN ENCRYPTED" nocase
$s2 = { 68 74 74 70 3A 2F 2F } // "http://"
$s3 = "bitcoin" nocase
$api1 = "CryptEncrypt"
$api2 = "FindFirstFileW"
condition:
uint16(0) == 0x5A4D and // Magic bytes PE : MZ
($s1 or $s3) and $api1 and $api2
}
// Scanner avec YARA
yara -r malware_rules.yar /chemin/a/scanner/
- Les strings révèlent souvent les URLs C2, chemins de fichiers et clés de registre
- Une entropie > 7 dans une section PE indique du code chiffré ou compressé
- Les imports DLL trahissent les capacités du malware (réseau, registre, processus)
- Les règles YARA permettent de scanner des systèmes entiers à la recherche de malwares connus
📚 Formation : Cybersécurité avancée : exploitation et red team

-
Add a note