YARA-Bedingungen: Anzahl, Offsets, Schleifen
YARA-Bedingungen schreiben: boolesche Logik, Anzahl und Offsets von Treffern, filesize und Magic Bytes, Mengen mit any/all/N of, for-Schleifen, with und Regelverweise.
In der Bedingung entscheidet die Regel: Muster sagen nur, was gefunden wurde; die Bedingung sagt, welche Kombination — zusammen mit Dateieigenschaften — eine Detektion ist.
Boolesche Logik
rule Boolean_Logic
{
strings:
$a = "LoaderInit" ascii
$b = "GetProcAddress" ascii
$c = "debug build" ascii
condition:
($a and $b) and not $c
}
Anzahl, Offsets, Längen
| Ausdruck | Bedeutung |
|---|---|
#a | Anzahl der Treffer von $a |
@a[i] | Offset des i-ten Treffers (ab 1) |
!a[i] | Länge des i-ten Treffers |
$a at 0x40 | $a genau an Offset 0x40 |
$a in (0..1024) | $a im ersten KB |
rule Counts_And_Offsets
{
strings:
$mz = "MZ"
$section = ".text" ascii
$marker = { DE AD BE EF }
condition:
$mz at 0 and #section >= 1 and $marker in (0..0x10000) and @marker[1] > 0x200
}
Dateigröße und Magic Bytes
| Typ | Prüfung |
|---|---|
| Windows-PE | uint16(0) == 0x5A4D |
| ELF | uint32(0) == 0x464C457F |
uint32(0) == 0x46445025 | |
| ZIP / OOXML | uint32(0) == 0x04034B50 |
| OLE | uint32(0) == 0xE011CFD0 |
rule PE_With_PE_Header_Check
{
condition:
uint16(0) == 0x5A4D and
uint32(uint32(0x3C)) == 0x00004550 and
filesize < 10MB
}
Die zweite Zeile folgt dem e_lfanew-Zeiger bei 0x3C und prüft die Signatur PE\0\0 — ohne das pe-Modul. Ganzzahldivision schreibt man \ (filesize \ 2).
Mengen und Quantoren
| Ausdruck | Wahr, wenn |
|---|---|
any of them | mindestens ein Muster trifft |
all of them | alle treffen |
none of ($fp*) | keines der Menge trifft |
2 of ($x*) | mindestens zwei $x-Muster |
50% of them | mindestens die Hälfte |
rule Quantifier_Example
{
strings:
$x1 = "stage2_payload" ascii
$x2 = "BeaconSleep" ascii
$s1 = "cmd.exe" ascii
$s2 = "rundll32" ascii
$fp = "Microsoft Corporation" wide
condition:
uint16(0) == 0x5A4D and not $fp and (1 of ($x*) or 2 of ($s*))
}
„Ein sehr spezifischer Indikator ODER mehrere schwache“ ist das Grundgerüst vieler öffentlicher Regeln (siehe Konventionen).
Schleifen
rule Loop_Examples
{
strings:
$hdr = { 50 4B 03 04 }
$a = "config" ascii
$b = "payload" ascii
condition:
for any i in (1..#hdr) : ( uint16(@hdr[i] + 26) > 64 ) and
for all of ($a, $b) : ( # >= 2 )
}
In for … of stehen $, # und @ für das aktuelle Muster. Schleifen über Treffer (1..#a) statt über filesize begrenzen.
Lokale Variablen mit with (YARA-X)
rule With_Example
{
condition:
with = uint32(0x3C) : (
uint16(0) == 0x5A4D and pe_offset < filesize and uint32(pe_offset) == 0x00004550
)
}
Regeln mit with kompilieren nicht mit YARA 4.x.
Regeln referenzieren
Ein Regelname in einer Bedingung steht für das Ergebnis dieser Regel. Zusammen mit private-Regeln lassen sich gemeinsame Prüfungen — etwa „kleine PE-Datei“ — einmal definieren und in vielen Regeln wiederverwenden, wie im Leitfaden zur Syntax gezeigt. Die referenzierte Regel muss vorher deklariert sein.
Reihenfolge und Geschwindigkeit
YARA wertet von links nach rechts aus und stoppt, sobald das Ergebnis feststeht: günstige, selektive Prüfungen zuerst, teure (Module, math.entropy, Schleifen) zuletzt. Siehe Performance und den Linter; Beispiele im Editor testen, dann weiter mit Modulen.
FAQ
- Wie prüfe ich den Dateityp in einer Bedingung?
- Lesen Sie die Magic Bytes an Offset 0, z. B. uint16(0) == 0x5A4D für Windows-Programme oder uint32(0) == 0x464C457F für ELF. Ganzzahlen werden little-endian gelesen, die be-Varianten big-endian.
- Was bedeutet „N of them“?
- Mindestens N der deklarierten Muster müssen treffen; them lässt sich durch eine Menge wie ($a*) ersetzen.
- Bricht YARA die Auswertung früh ab?
- Ja, boolesche Operatoren werten verkürzt aus. Günstige Prüfungen wie filesize und Magic Bytes gehören deshalb nach vorn.