Zum Inhalt springen

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.

Veröffentlicht am 2 Min. Lesezeit

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

AusdruckBedeutung
#aAnzahl 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

TypPrüfung
Windows-PEuint16(0) == 0x5A4D
ELFuint32(0) == 0x464C457F
PDFuint32(0) == 0x46445025
ZIP / OOXMLuint32(0) == 0x04034B50
OLEuint32(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

AusdruckWahr, wenn
any of themmindestens ein Muster trifft
all of themalle treffen
none of ($fp*)keines der Menge trifft
2 of ($x*)mindestens zwei $x-Muster
50% of themmindestens 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 pe_offset = 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.