Saltar al contenido

Cadenas YARA: texto, hexadecimal y regex

Cómo escribir las cadenas de una regla YARA: texto y escapes, modificadores nocase, wide, xor y base64, cadenas hexadecimales con comodines y saltos, y regex.

Publicado el 3 min de lectura

Los patrones —YARA los llama strings aunque sean bytes o regex— son lo que YARA busca antes de evaluar la condición. Elegirlos bien determina la precisión y la velocidad de la regla.

Cadenas de texto

Se escriben entre comillas y se comparan byte a byte:

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
}

Escapes válidos: \", \\, \t, \n, \r y \xNN. YARA-X rechaza las secuencias desconocidas en lugar de ignorarlas, un error habitual al portar reglas antiguas (ver YARA-X vs YARA).

Modificadores

ModificadorEfectoNotas
asciiBytes tal cualPor defecto si no hay otro de codificación
wideUTF-16LE (cada carácter seguido de 00)Combínalo con ascii para buscar ambas
nocaseSin distinguir mayúsculasMultiplica variantes; evítalo en cadenas cortas
fullwordDelimitada por caracteres no alfanuméricos"evil" ya no coincide con "devil"
xorTambién la cadena con XOR de cada clave de un byte (1–255)xor(1-255) o xor(0x20) para acotar
base64 / base64wideLa cadena dentro de datos base64Alfabeto propio opcional; incompatible con nocase, xor, fullword
privateCoincide pero no aparece en los resultadosÚtil para patrones auxiliares
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
}

Reserva xor, base64 y nocase para cadenas de al menos seis a ocho caracteres: cada modificador multiplica el patrón y las variantes cortas coinciden con datos aleatorios.

Cadenas hexadecimales

Describen bytes en bruto entre llaves; son la herramienta para código, cabeceras y estructuras binarias.

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
}
SintaxisSignificado
??Cualquier byte
4? / ?AComodín de medio byte
[4], [2-6], [8-]Salto de exactamente 4, de 2 a 6 o de 8 o más bytes
( AA | BB CC )Alternativas, incluso de distinta longitud
~00Cualquier byte salvo 00 (YARA 4.3+ y YARA-X)

Pon comodines en los operandos de instrucciones con direcciones relativas (call, jmp) y deja al menos cuatro bytes fijos consecutivos para que YARA extraiga un buen átomo.

Expresiones regulares

Van entre barras con sintaxis tipo Perl; admiten las opciones i y s y los modificadores ascii, wide, nocase, fullword y 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
}

Errores típicos: regex sin parte literal (/[a-z]{5,}/), .* al principio (los patrones ya no están anclados), repeticiones sin límite y escapes inválidos (la barra se escribe \/).

Elegir el tipo adecuado

Buscas…Usa
Una cadena legible y única (mutex, user agent, ruta PDB)Texto, con wide si puede estar en UTF-16
Código, cabeceras, estructuras binariasHexadecimal con comodines en direcciones
Unas pocas variantes de bytesAlternativas hexadecimales
Algo variable o estructurado (URL, GUID)Regex con un literal de anclaje
Una cadena ofuscadaxor o base64 sobre una cadena larga

Rendimiento en un párrafo

YARA extrae de cada patrón una secuencia fija corta (un átomo) y busca todos los átomos en una sola pasada; solo verifica el patrón completo donde aparece su átomo. Cadenas de menos de cuatro bytes, hex hecho de comodines, bytes comunes como 00 00 00 00 y regex sin literales producen malos átomos. La guía de rendimiento lo explica y el linter lo detecta.

Siguiente paso: combinar patrones en las condiciones YARA.

FAQ

¿Qué hace el modificador wide?
wide busca la cadena codificada en UTF-16LE, es decir, cada carácter ASCII seguido de un byte nulo. Añade ascii si la cadena puede aparecer en ambas codificaciones.
¿Cómo acepto cualquier byte en una cadena hexadecimal?
?? sustituye un byte completo, un ? sustituye medio byte (por ejemplo 4? o ?A) y [n-m] salta entre n y m bytes cualesquiera.
¿Cuándo usar una regex en lugar de una cadena de texto?
Solo cuando la parte variable no se puede expresar con texto o hexadecimal. Las regex son más lentas y deben incluir una parte literal de unos cuantos bytes para ser eficientes.