YARA-Module: pe, elf, dotnet, math, hash und mehr
YARA-Module nutzen: pe-Imports und Sektionen, elf, macho, dotnet, lnk, Entropie mit math, hash und console — mit Hinweisen zu YARA-X und der Browser-Version.
Module erweitern Bedingungen um Formatparser und Hilfsfunktionen: Statt Offsets im PE-Header zu berechnen, fragen Sie pe.number_of_sections ab oder ob eine DLL VirtualAllocEx importiert.
Modul importieren
Ein Modul parst nur Dateien, die es erkennt: Bei einer Textdatei ist pe.is_pe falsch und die meisten pe-Felder sind undefiniert.
import "pe"
import "math"
rule Module_Import_Example
{
condition:
pe.is_pe and math.entropy(0, filesize) > 7.2
}
Die WebAssembly-Version von YARA-X in Scanner und Editor enthält pe, elf, macho, dotnet, lnk, math, hash, time, console, string, dex, crx, cuckoo und vt — nicht magic.
pe — Windows-Programmdateien
| Ausdruck | Zweck |
|---|---|
pe.is_pe, pe.is_dll(), pe.is_64bit() | Dateiart |
pe.number_of_sections, pe.sections[i].name | Sektionen |
pe.imports("kernel32.dll", "VirtualAllocEx") | Importierte Funktion |
pe.exports("ServiceMain") | Exportierte Funktion |
pe.imphash() | Import-Hash (Hex, Kleinbuchstaben) |
pe.entry_point, pe.timestamp | Einsprungpunkt, Kompilierzeit |
pe.number_of_signatures | Authenticode-Signaturen |
import "pe"
rule PE_Injection_Imports
{
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" )
}
elf, macho, dotnet, lnk
import "elf"
import "dotnet"
import "lnk"
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
}
rule DotNet_Assembly_Name
{
condition:
dotnet.is_dotnet and dotnet.assembly.name == "SharpExample"
}
rule LNK_Launches_Mshta
{
condition:
lnk.is_lnk and lnk.local_base_path contains "mshta"
}
macho leistet für macOS dasselbe wie elf, inklusive Fat-Binaries. Modul-GUID und Assembly-Name von .NET-Tools bleiben oft über Builds hinweg stabil.
math und hash
math.entropy(offset, größe) liefert die Shannon-Entropie (0–8); über etwa 7,2 sind Daten meist komprimiert oder verschlüsselt. hash.md5/sha1/sha256(offset, größe) liefern Hex in Kleinbuchstaben.
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"
)
}
Hash oder Entropie über die ganze Datei sind teuer — vorher mit filesize absichern (siehe Performance).
console, string, time, dex, crx, cuckoo, vt
console.log() hilft beim Debuggen, string.to_int() wandelt Werte um, time.now() liefert die Unix-Zeit. dex parst Android-Bytecode, crx Chrome-Erweiterungen. cuckoo und vt benötigen externe Daten und sind nur dort sinnvoll, wo diese geliefert werden (siehe YARA auf VirusTotal).
Unterschiede in YARA-X
Modul- und Feldnamen entsprechen weitgehend YARA 4.x; einige wurden umorganisiert, und unbekannte Felder sind in YARA-X Kompilierfehler. yr dump -m pe probe.exe zeigt die genaue Struktur. Die Seiten der Bibliothek zeigen, ob jede Regel mit YARA-X kompiliert.
Modul oder Bytes?
Für „ist das ein PE?“ genügt uint16(0) == 0x5A4D und ist schneller. Module lohnen sich für Imports, Signaturen, Ressourcen und Sektionstabellen. Der Linter meldet pe- oder elf-Aufrufe ohne vorherige Magic-Byte-Prüfung.
FAQ
- Muss ich ein Modul importieren?
- Ja. import "pe" (bzw. das benötigte Modul) gehört an den Dateianfang; pe.xyz ohne Import ist ein Kompilierfehler.
- Wie sehe ich, was ein Modul extrahiert?
- Mit yr dump datei.exe auf der YARA-X-Kommandozeile; yr dump -m pe datei.exe beschränkt die Ausgabe auf pe.
- Gibt es das magic-Modul in YARA-X?
- Je nach Build: Es benötigt libmagic und fehlt u. a. in der WebAssembly-Version, die die Tools dieser Website verwenden.