Saltar al contenido

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.

Publicado el 2 min de lectura

Una referencia densa para escribir reglas; prueba las tuyas en el editor.

Esqueleto de regla

import "pe"

rule PREFIX_Family_Detail : tag1 tag2
{
    meta:
        description = "Qué detecta la regla"
        author = "tú"
        date = "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

TipoSintaxisEjemplo
Texto"…"$a = "cmd.exe /c"
Hex{ … }$h = { 4D 5A ?? 00 }
Regex/…/is$r = /evil[0-9]{2}\.exe/
ModificadorTextoHexRegexFunción
ascii / widesí–síBytes / UTF-16LE
nocasesí–síSin mayúsculas
fullwordsí–síPalabra completa
xorsí––Claves XOR de un byte
base64 / base64widesí––Dentro de base64 (mín. 3 bytes en YARA-X)
privatesí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íaOperadores
Booleanosand or not
Aritmética+ - * \ %
Bits& | ^ ~ << >>
Cadenas de móduloscontains icontains startswith endswith iequals matches
Patrones$a #a @a[i] !a[i] $a at N $a in (A..B)
Archivofilesize 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

FormatoComprobación
PE (MZ)uint16(0) == 0x5A4D
ELFuint32(0) == 0x464C457F
Mach-O 64uint32(0) == 0xFEEDFACF
PDFuint32(0) == 0x46445025
ZIP / OOXMLuint32(0) == 0x04034B50
OLEuint32(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

HazEvita
4+ bytes fijos por patrónCadenas de menos de 4 bytes
Magic bytes y filesize primeroMódulos antes de los límites baratos
Literales en las regex.* inicial
Bucles sobre 1..#aBucles 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.