Zum Inhalt springen

YARA-Strings: Text, Hex und reguläre Ausdrücke

YARA-Strings schreiben: Text und Escapes, Modifikatoren wie nocase, wide, xor und base64, Hex-Strings mit Wildcards und Sprüngen sowie reguläre Ausdrücke.

Veröffentlicht am 2 Min. Lesezeit

Muster — YARA nennt sie strings, auch wenn es Bytes oder Regex sind — sucht YARA, bevor die Bedingung ausgewertet wird. Ihre Wahl bestimmt Präzision und Geschwindigkeit einer Regel.

Text-Strings

rule Text_Strings
{
    strings:
        $a = "Global\\MyMutex_2024"
        $b = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0)"
        $c = "tab\there and a quote \" inside"
        $d = "\x4D\x5A with raw bytes"
    condition:
        any of them
}

Gültige Escapes: \", \\, \t, \n, \r, \xNN. YARA-X lehnt unbekannte Escapes ab statt sie zu ignorieren (siehe YARA-X vs. YARA).

Modifikatoren

ModifikatorWirkungHinweis
asciiBytes wie geschriebenStandard
wideUTF-16LEMit ascii kombinieren
nocaseGroß-/Kleinschreibung egalNicht bei kurzen Strings
fullwordDurch Nicht-Alphanumerisches begrenzt"evil" trifft nicht "devil"
xorAuch mit jedem 1-Byte-XOR-Schlüsselxor(1-255) zur Eingrenzung
base64 / base64wideInnerhalb von Base64-DatenNicht mit nocase, xor, fullword
privateTrifft, erscheint aber nicht in der AusgabeFür Hilfsmuster
rule Modifier_Examples
{
    strings:
        $cfg = "ConfigBlock" wide ascii
        $cmd = "invoke-expression" nocase
        $key = "SuperSecretKey!" xor(1-255)
        $b64 = "powershell -nop" base64
        $word = "backdoor" fullword
    condition:
        2 of them
}

xor, base64 und nocase nur für Strings ab etwa sechs bis acht Zeichen verwenden.

Hex-Strings

rule Hex_Syntax
{
    strings:
        $fixed = { 4D 5A 90 00 03 00 00 00 }
        $wild = { E8 ?? ?? ?? ?? 83 C4 04 }
        $nibble = { 6A 4? 68 00 30 00 00 }
        $jump = { 55 8B EC [2-6] 83 EC 20 }
        $alt = { 68 ( 00 10 | 00 20 ) 00 00 }
    condition:
        any of them
}
SyntaxBedeutung
??Beliebiges Byte
4? / ?AHalbbyte-Wildcard
[4], [2-6], [8-]Sprünge
( AA | BB CC )Alternativen
~00Jedes Byte außer 00

Operanden relativer Sprünge und Aufrufe als Wildcard setzen, aber mindestens vier feste Bytes am Stück behalten, damit YARA ein gutes Atom findet.

Reguläre Ausdrücke

Zwischen Schrägstrichen, Perl-ähnliche Syntax, Optionen i und s, Modifikatoren ascii, wide, nocase, fullword, private.

rule Regex_Examples
{
    strings:
        $url = /https?:\/\/[a-z0-9\-.]{3,64}\.(top|xyz|click)\/[a-z0-9]{8}/ nocase
        $mutex = /Global\\[A-F0-9]{8}-[A-F0-9]{4}/
    condition:
        any of them
}

Typische Fallen: kein Literalteil, führendes .*, unbegrenzte Wiederholungen, ungültige Escapes (/ als \/).

Den richtigen Typ wählen

GesuchtTyp
Eindeutiger lesbarer String (Mutex, User-Agent, PDB-Pfad)Text, ggf. wide
Code, Header, BinärstrukturenHex mit Wildcards
Wenige Byte-VariantenHex-Alternativen
Variable Teile (URL, GUID)Regex mit Literal
Verschleierter Stringxor / base64 auf langem String

Performance in Kürze

YARA extrahiert aus jedem Muster eine kurze feste Byte-Folge (Atom) und sucht alle Atome in einem Durchgang; nur dort wird das ganze Muster geprüft. Strings unter vier Bytes, Hex aus Wildcards, häufige Bytes wie 00 00 00 00 und Regex ohne Literal ergeben schlechte Atome. Mehr unter Performance; der Linter findet solche Fälle. Weiter mit Bedingungen.

FAQ

Was bewirkt der Modifikator wide?
wide sucht den String in UTF-16LE, also jedes ASCII-Zeichen gefolgt von einem Null-Byte. Ergänzen Sie ascii, wenn beide Kodierungen vorkommen können.
Wie erlaube ich ein beliebiges Byte in einem Hex-String?
?? steht für ein ganzes Byte, ein einzelnes ? für ein Halbbyte (z. B. 4? oder ?A), [n-m] für einen Sprung von n bis m beliebigen Bytes.
Wann Regex statt Text?
Nur wenn sich der variable Teil nicht als Text oder Hex ausdrücken lässt. Regex sind langsamer und brauchen einen Literalteil von einigen Bytes.