大家好,奋战在安全前线的分析师们!🛡️
在进行恶意软件分析时,有时需要在成千上万个文件中精准地找出“我正在寻找的那个家伙”。我们不可能逐一打开检查,如果遇到现有杀毒软件无法捕获的新型恶意软件,那就更束手无策了。
这时,YARA就派上用场了。YARA被称为“文件的正则表达式”,它是通过定义恶意软件的模式(指纹)来对文件进行分类的最强大工具。
今天,我们将彻底剖析YARA规则编写的基本语法结构(三大要素)和编写原则。只要读完这篇文章,您也能创建自己的杀毒引擎!🚀

1. YARA规则的解剖:理解其骨架 🦴
YARA规则具有类似于C语言的直观结构。它主要分为四个部分:头部(Header)、元数据(Meta)、字符串(Strings)和条件(Condition)。
rule Malware_Example_Rule // [头部] 规则名称
{
meta: // [元数据] 描述和信息
author = "Security Analyst"
description = "This is a sample rule"
date = "2025-12-16"
strings: // [字符串] 要查找的模式
$text_string = "malicious_command"
$hex_string = { E2 34 A1 ?? 00 }
condition: // [条件] 检测逻辑
$text_string or $hex_string
}
我们来详细了解一下每个部分的作用吧?🧐
2. 第一个要素:元数据 (Meta) – “名片” 📝
meta部分完全不影响规则的运行。但在实际工作中,它可能最为重要。因为它是记录谁、为何创建此规则的“注释”和“名片”。
- 主要关键词:
- author: 作者姓名
- description: 规则描述 (捕获何种恶意软件)
- date: 创建日期或修改日期
- hash: 分析的恶意软件样本的哈希值 (非常重要!用于后续验证)
- version: 规则版本
💡 编写技巧: 即使是自己使用的规则,也要养成记录description和hash的习惯。这是为了三个月后的自己。
3. 第二个要素:字符串 (Strings) – “证据” 🧵
strings部分是定义文件中“想要查找的数据”的地方。它使用以$符号开头的标识符,类似于变量。
主要有三种类型:
① 文本字符串 (Text Strings)
查找常见的ASCII字符或Unicode字符串。使用双引号(” “)。
$s1 = "cmd.exe" ascii // 普通英文字符串
$s2 = "Attack" wide // Unicode字符串 (以2字节存储)
$s3 = "Error" nocase // 不区分大小写 (error, ERROR 均可检测)
$s4 = "hacker" fullword // 仅当整个单词匹配时 (不检测 yhacker)
② 十六进制字符串 (Hex Strings)
用于查找二进制代码(机器码)或特定的字节模式。使用大括号({ })。
$h1 = { E2 34 A1 C5 } // 精确匹配的字节
$h2 = { E2 34 ?? C5 } // 通配符(??): 此位置可以是任何内容
$h3 = { E2 [2-4] C5 } // 跳转: 中间跳过2~4个字节
- 通配符(??)在捕获变种恶意软件时扮演着核心角色!
③ 正则表达式 (Regular Expressions)
用于查找复杂模式,但它是导致性能下降的主要原因,因此仅在绝对必要时才使用。使用斜杠(/ /)。
$r1 = /md5: [0-9a-fA-F]{32}/
4. 第三个要素:条件 (Condition) – “法官” ⚖️
condition部分是组合已定义字符串,以决定“最终是否判断为恶意软件”的逻辑区域。如果返回True,则表示已检测到。
① 逻辑运算符 (Boolean Logic)
condition:
($s1 and $s2) or $h1 // 如果s1和s2都存在,或者h1存在,则检测
② 基于计数 (Counting)
condition:
#s1 > 3 // 如果字符串s1在文件中出现超过3次,则检测
③ 文件大小及头部检查 (File Properties)
这是最常用的模式。为了减少误报,会首先检查文件大小或头部。
condition:
uint16(0) == 0x5A4D and filesize < 2MB // 当是MZ头(exe文件)且小于2MB时
- uint16(0): 读取文件0地址开始的16位(2字节)。(Windows可执行文件总是以MZ,即0x5A4D开头)
5. YARA规则编写三大原则 (Best Practices) ⭐
编写不当的YARA规则可能导致系统停滞,或将正常文件误报为恶意软件,造成重大事故。请务必记住以下三点:
1️⃣ 禁止过短的字符串! (Performance)
- 坏例子: $a = “55” (不是十六进制值,而是字符串 “55”)
- 原因: 文件中“55”可能出现数万次。扫描速度会变得非常慢。请使用至少5-6字节以上独特的字符串。
2️⃣ 注意误报(False Positive)! (Specificity)
- 坏例子: $s = “CreateFile”
- 原因: CreateFile是所有正常程序都会使用的函数。如果以此作为条件,Windows记事本也会被误报为恶意软件。请寻找只存在于恶意软件中的特殊字符串(C2地址、拼写错误、特殊互斥体等)。
3️⃣ 遵守条件语句的顺序! (Short-Circuit Evaluation)
- 好例子: uint16(0) == 0x5A4D and $s1
- 说明: 计算机从左到右检查条件。如果文件头部不是MZ,后面的$s1将根本不会被检查。先放置轻量级条件(文件大小、头部),后放置重量级条件(字符串搜索),可以显著提高速度。
🎉 结语:现在您也是规则编写者了!
YARA规则看似简单,但它蕴含着分析师决定“使用哪些字符串作为签名”的洞察力。
将今天学到的Meta(描述)、Strings(证据)、Condition(判断)结构牢记于心,尝试将您分析过的恶意软件特征转化为规则。
下一次,我们将使用编写好的YARA规则,进行实际恶意软件文件的扫描和检测实践。敬请期待!👋
发表回复