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.
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
| Modifikator | Wirkung | Hinweis |
|---|---|---|
ascii | Bytes wie geschrieben | Standard |
wide | UTF-16LE | Mit ascii kombinieren |
nocase | Groß-/Kleinschreibung egal | Nicht bei kurzen Strings |
fullword | Durch Nicht-Alphanumerisches begrenzt | "evil" trifft nicht "devil" |
xor | Auch mit jedem 1-Byte-XOR-Schlüssel | xor(1-255) zur Eingrenzung |
base64 / base64wide | Innerhalb von Base64-Daten | Nicht mit nocase, xor, fullword |
private | Trifft, erscheint aber nicht in der Ausgabe | Fü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
}
| Syntax | Bedeutung |
|---|---|
?? | Beliebiges Byte |
4? / ?A | Halbbyte-Wildcard |
[4], [2-6], [8-] | Sprünge |
( AA | BB CC ) | Alternativen |
~00 | Jedes 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
| Gesucht | Typ |
|---|---|
| Eindeutiger lesbarer String (Mutex, User-Agent, PDB-Pfad) | Text, ggf. wide |
| Code, Header, Binärstrukturen | Hex mit Wildcards |
| Wenige Byte-Varianten | Hex-Alternativen |
| Variable Teile (URL, GUID) | Regex mit Literal |
| Verschleierter String | xor / 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.