Chuleta YARA: sintaxis, modificadores, condiciones
Referencia de YARA y YARA-X en una página: esqueleto de regla, tipos de cadenas y modificadores, sintaxis hex, operadores, cuantificadores, bucles, magic bytes y CLI.
Una referencia densa para escribir reglas; prueba las tuyas en el editor.
Esqueleto de regla
import "pe"
rule PREFIX_Family_Detail : tag1 tag2
{
meta:
= "Qué detecta la regla"
= "tú"
= "2026-09-29"
strings:
$x1 = "very specific string" ascii wide
$s1 = { 8B 45 ?? 33 C9 [2-4] E8 }
$s2 = /config_[a-f0-9]{8}/
condition:
uint16(0) == 0x5A4D and filesize < 5MB and
(1 of ($x*) or all of ($s*)) and
pe.number_of_sections > 2
}
Solo condition es obligatoria; orden meta, strings, condition. private rule no se informa; global rule filtra su espacio de nombres.
Cadenas y modificadores
| Tipo | Sintaxis | Ejemplo |
|---|---|---|
| Texto | "…" | $a = "cmd.exe /c" |
| Hex | { … } | $h = { 4D 5A ?? 00 } |
| Regex | /…/is | $r = /evil[0-9]{2}\.exe/ |
| Modificador | Texto | Hex | Regex | Función |
|---|---|---|---|---|
ascii / wide | sí | – | sí | Bytes / UTF-16LE |
nocase | sí | – | sí | Sin mayúsculas |
fullword | sí | – | sí | Palabra completa |
xor | sí | – | – | Claves XOR de un byte |
base64 / base64wide | sí | – | – | Dentro de base64 (mín. 3 bytes en YARA-X) |
private | sí | sí | sí | Oculto en resultados |
Hex: ?? byte cualquiera, A?/?A medio byte, [4]/[2-6]/[8-] saltos, ( 01 | 02 ) alternativas, ~00 cualquier byte salvo 00.
Operadores y cuantificadores
| Categoría | Operadores |
|---|---|
| Booleanos | and or not |
| Aritmética | + - * \ % |
| Bits | & | ^ ~ << >> |
| Cadenas de módulos | contains icontains startswith endswith iequals matches |
| Patrones | $a #a @a[i] !a[i] $a at N $a in (A..B) |
| Archivo | filesize uint8/16/32(off) y variantes be |
any of them, all of them, none of them, 2 of ($s*), 50% of them, for any i in (1..#a) : ( … ), for all of ($x*) : ( # > 2 ), for any s in pe.sections : ( … ), with x = … : ( … ) (solo YARA-X).
Magic bytes
| Formato | Comprobación |
|---|---|
| PE (MZ) | uint16(0) == 0x5A4D |
| ELF | uint32(0) == 0x464C457F |
| Mach-O 64 | uint32(0) == 0xFEEDFACF |
uint32(0) == 0x46445025 | |
| ZIP / OOXML | uint32(0) == 0x04034B50 |
| OLE | uint32(0) == 0xE011CFD0 |
Módulos
import "pe"
import "math"
import "hash"
rule Module_Snippets
{
condition:
pe.is_pe and (
pe.imports("kernel32.dll", "VirtualAlloc") or
pe.exports("DllRegisterServer") or
math.entropy(0, 4096) > 7.0 or
hash.md5(0, 64) == "00000000000000000000000000000000"
)
}
CLI de YARA-X
yr scan rules.yar objetivo, yr scan -s (cadenas), yr check, yr fmt, yr compile rules.yar -o rules.yarc, yr dump -m pe archivo.exe.
Rendimiento
| Haz | Evita |
|---|---|
| 4+ bytes fijos por patrón | Cadenas de menos de 4 bytes |
Magic bytes y filesize primero | Módulos antes de los límites baratos |
| Literales en las regex | .* inicial |
Bucles sobre 1..#a | Bucles sobre 0..filesize |
Más detalle en sintaxis, cadenas, condiciones, módulos y rendimiento; revisa tus reglas con el linter.
FAQ
- ¿Hay una chuleta de YARA para imprimir?
- Esta página está pensada como referencia de una página; imprímela desde el navegador. Cada regla completa que contiene compila con YARA-X 1.20.
- ¿Cuál es el operador de división entera en YARA?
- YARA usa la barra invertida para la división entera, por ejemplo filesize \ 2, y % para el resto.