Que sont les packers et l'obfuscation, et comment les détecter dans un binaire ?
Réponse courte
L'empaquetage compresse ou chiffre la vraie charge utile et y préfixe un stub qui la dépaquette en mémoire à l'exécution ; l'obfuscation transforme le code ou les données pour résister à la lecture et aux signatures. On détecte l'empaquetage à une entropie de section élevée proche de 8,0, une table d'imports minuscule ou réduite au stub, des noms de section inhabituels ou inscriptibles-exécutables comme UPX0, un point d'entrée hors de .text, une grande taille virtuelle face à une petite taille brute, et des détecteurs comme Detect It Easy ou PEiD. Aucun de ces signaux n'est concluant seul, donc les analystes en pèsent plusieurs ensemble et confirment en observant le dépaquetage à l'exécution.
La plupart des malwares de masse et ciblés sont empaquetés pour réduire leur empreinte et, surtout, pour déjouer les signatures statiques et ralentir les analystes. Les recruteurs posent cette question pour vérifier que vous savez reconnaître rapidement un échantillon empaqueté plutôt que de gaspiller des heures à désassembler un stub.
Empaquetage contre obfuscation
Un packer prend la vraie charge utile, la compresse ou la chiffre, et l'enveloppe dans un petit stub de dépaquetage. À l'exécution, le stub alloue de la mémoire, restaure le code original et lui transfère l'exécution — donc sur le disque vous ne voyez que le stub plus un blob opaque. L'obfuscation est plus large : aplatissement du flux de contrôle, instructions parasites, prédicats opaques, chiffrement de chaînes et hachage d'API rendent tous le code plus difficile à lire et à identifier, que le fichier soit empaqueté ou non. L'empaquetage cache la charge utile ; l'obfuscation cache la logique.
Signaux de détection
Aucun signal seul n'est une preuve — on les empile :
- Entropie élevée. Des sections mesurant près de 8,0 bits par octet indiquent une compression ou un chiffrement. Réserve : les médias compressés et installeurs légitimes affichent aussi un score élevé, donc l'entropie est un indice, pas un verdict.
- Table d'imports minuscule. Un vrai programme importe des dizaines d'API ; un programme empaqueté n'importe souvent que
LoadLibraryetGetProcAddressparce qu'il résout tout dynamiquement après dépaquetage. - Sections étranges. Des noms comme
UPX0/UPX1, des sections marquées inscriptibles et exécutables, ou une petite taille brute avec une grande taille virtuelle. - Emplacement du point d'entrée. Un point d'entrée hors de
.text, dans une section inscriptible, est suspect. - Détecteurs. Detect It Easy (DIE), les signatures PEiD et les graphes d'entropie identifient nombre de packers connus par leur nom.
Le confirmer
La confirmation décisive est dynamique : exécuter l'échantillon et le regarder allouer de la mémoire exécutable et y écrire (le dépaquetage). Une bonne réponse dit que la détection est probabiliste statiquement et certaine dynamiquement.
Questions de suivi probables
- Pourquoi un binaire empaqueté n'a-t-il souvent que LoadLibrary et GetProcAddress dans ses imports ?
- Une entropie élevée prouve-t-elle l'empaquetage ? Qu'est-ce qui produit des faux positifs ?
- En quoi l'obfuscation diffère-t-elle de l'empaquetage quant à ce qu'elle protège ?