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.
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
| Modificador | Efecto | Notas |
|---|---|---|
ascii | Bytes tal cual | Por defecto si no hay otro de codificación |
wide | UTF-16LE (cada carácter seguido de 00) | Combínalo con ascii para buscar ambas |
nocase | Sin distinguir mayúsculas | Multiplica variantes; evítalo en cadenas cortas |
fullword | Delimitada por caracteres no alfanuméricos | "evil" ya no coincide con "devil" |
xor | También la cadena con XOR de cada clave de un byte (1–255) | xor(1-255) o xor(0x20) para acotar |
base64 / base64wide | La cadena dentro de datos base64 | Alfabeto propio opcional; incompatible con nocase, xor, fullword |
private | Coincide 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
}
| Sintaxis | Significado |
|---|---|
?? | Cualquier byte |
4? / ?A | Comodí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 |
~00 | Cualquier 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 binarias | Hexadecimal con comodines en direcciones |
| Unas pocas variantes de bytes | Alternativas hexadecimales |
| Algo variable o estructurado (URL, GUID) | Regex con un literal de anclaje |
| Una cadena ofuscada | xor 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.