Modules YARA : pe, elf, dotnet, math, hash…
Utiliser les modules YARA pour interroger des formats analysés : imports et sections pe, elf, macho, dotnet, lnk, entropie math, hash, console, avec notes YARA-X.
Les modules étendent le langage des conditions avec des analyseurs de formats et des fonctions utilitaires. Plutôt que de calculer des offsets dans un en-tête PE, on interroge pe.number_of_sections ou on vérifie qu’une DLL importe VirtualAllocEx. Ce guide couvre les modules les plus courants dans les règles publiques et ceux disponibles dans les outils de ce site.
Importer un module
Déclarez les modules en tête de fichier avec import. Un module n’analyse que les fichiers qu’il reconnaît : sur un fichier texte, pe.is_pe est simplement faux et la plupart des champs pe sont indéfinis, ce qui rend faux les expressions qui les utilisent.
import "pe"
import "math"
rule Module_Import_Example
{
condition:
pe.is_pe and math.entropy(0, filesize) > 7.2
}
La version WebAssembly de YARA-X utilisée par le scanner et l’éditeur inclut pe, elf, macho, dotnet, lnk, math, hash, time, console, string, dex, crx, cuckoo et vt. Le module magic n’y est pas disponible.
| Module | Usage |
|---|---|
pe | Exécutables Windows |
elf | Binaires Linux/Unix |
macho | Binaires macOS |
dotnet | Assemblies .NET |
lnk | Raccourcis Windows |
hash | Empreintes sur des plages |
math | Entropie et statistiques |
pe — exécutables Windows
Le module le plus utilisé. Champs et fonctions fréquents :
| Expression | Usage |
|---|---|
pe.is_pe, pe.is_dll(), pe.is_64bit() | Nature du fichier |
pe.number_of_sections, pe.sections[i].name | Sections (packers, noms inhabituels) |
pe.imports("kernel32.dll", "VirtualAllocEx") | Fonction importée |
pe.exports("ServiceMain") | Fonction exportée |
pe.imphash() | Hash des imports, hexadécimal minuscule |
pe.entry_point | Offset fichier du point d’entrée |
pe.timestamp | Horodatage de compilation |
pe.number_of_signatures, pe.signatures[i].issuer | Signatures Authenticode |
import "pe"
rule PE_Injection_Imports
{
meta:
= "Petit PE important le trio classique d'injection distante"
condition:
uint16(0) == 0x5A4D and filesize < 2MB and
pe.imports("kernel32.dll", "VirtualAllocEx") and
pe.imports("kernel32.dll", "WriteProcessMemory") and
pe.imports("kernel32.dll", "CreateRemoteThread")
}
rule PE_Odd_Section_Name
{
condition:
uint16(0) == 0x5A4D and
for any s in pe.sections : ( s.name == ".detourd" or s.name == "UPX0" )
}
Le nom de DLL est comparé sans tenir compte de la casse. L’imphash se compare comme une chaîne en minuscules : pe.imphash() == "…".
elf et macho
elf expose l’en-tête, les sections, les segments et les symboles des exécutables Linux et Unix ; macho fait de même pour macOS, y compris les binaires universels (fat).
import "elf"
rule ELF_Small_x64_Executable
{
condition:
uint32(0) == 0x464C457F and
elf.type == elf.ET_EXEC and
elf.machine == elf.EM_X86_64 and
filesize < 1MB
}
dotnet
Pour les assemblies .NET : nom et version de l’assembly, GUID, ressources, flux, références de types. Le GUID de module (dotnet.guids) et le nom d’assembly sont souvent stables d’une compilation à l’autre d’un même outil.
import "dotnet"
rule DotNet_Assembly_Name
{
condition:
dotnet.is_dotnet and dotnet.assembly.name == "SharpExample"
}
lnk
Analyse les raccourcis Windows : chemin cible, arguments, répertoire de travail, icône, identifiant machine. Utile contre les raccourcis de phishing qui lancent powershell ou mshta.
import "lnk"
rule LNK_Launches_Mshta
{
condition:
lnk.is_lnk and lnk.local_base_path contains "mshta"
}
math et hash
math.entropy(offset, taille) renvoie l’entropie de Shannon d’une plage (0 à 8) : au-delà d’environ 7,2, les données sont probablement compressées ou chiffrées. hash.md5/sha1/sha256(offset, taille) renvoient des chaînes hexadécimales en minuscules ; hash.crc32 renvoie un entier.
import "math"
import "hash"
rule Encrypted_Overlay_Or_Known_Blob
{
condition:
filesize < 5MB and (
math.entropy(filesize - 4096, 4096) > 7.5 or
hash.sha256(0, 1024) == "0000000000000000000000000000000000000000000000000000000000000000"
)
}
Hacher ou mesurer l’entropie sur tout le fichier (0, filesize) coûte cher sur les gros fichiers. Protégez ces appels par filesize et des contrôles simples placés avant, comme expliqué dans le guide performance.
console, string et time
console.log("texte", valeur)affiche des valeurs pendant l’évaluation — une aide au débogage des conditions complexes. À retirer avant partage.string.to_int("123")etstring.length(…)aident à manipuler des valeurs extraites par d’autres modules.time.now()renvoie l’heure Unix courante, par exemple pour la comparer àpe.timestamp.
import "pe"
import "time"
rule PE_Timestamp_In_Future
{
condition:
pe.is_pe and pe.timestamp > time.now()
}
dex, crx, cuckoo et vt
dex analyse le bytecode Android DEX, crx les extensions Chrome. cuckoo lit un rapport de comportement de sandbox fourni avec le fichier, et vt expose les métadonnées VirusTotal dans Livehunt ; les deux nécessitent des données externes et n’ont de sens que sur les plateformes qui les fournissent. Le module vt est réservé à VirusTotal (voir YARA sur VirusTotal).
Différences YARA-X
Les noms de modules et la plupart des champs sont identiques à YARA 4.x ; la majorité des règles se portent sans changement. Quelques champs ont été renommés ou réorganisés, et YARA-X signale un champ inconnu comme une erreur de compilation au lieu de l’évaluer silencieusement à « indéfini ». En cas d’échec, yr dump -m pe echantillon.exe montre la structure exacte produite par YARA-X ; voir aussi le guide YARA-X vs YARA. Les pages de la bibliothèque indiquent si chaque règle compile avec YARA-X.
Module ou octets bruts ?
Un appel de module est expressif et robuste aux variations de structure, mais l’analyse a un coût. Pour un contrôle simple — « est-ce un PE ? » — uint16(0) == 0x5A4D est plus rapide et suffisant. Réservez les modules à ce que les octets expriment mal : imports, signatures, ressources, tables de sections. Le linter signale les règles qui appellent pe ou elf sans contrôle de magic bytes préalable.
Liste complète : modules YARA-X.
FAQ
- Faut-il importer un module pour l’utiliser ?
- Oui. Ajoutez import "pe" (ou le module voulu) en tête de fichier ; utiliser pe.xxx sans import est une erreur de compilation.
- Comment voir ce qu’un module extrait d’un fichier ?
- Avec la ligne de commande YARA-X : yr dump fichier.exe affiche la sortie de chaque module applicable ; yr dump -m pe fichier.exe se limite au module pe.
- Le module magic est-il disponible dans YARA-X ?
- Cela dépend de la compilation : il repose sur libmagic et manque dans certaines versions, dont la version WebAssembly utilisée par les outils de ce site.