[理论] 恶意软件猎人的必备武器!🏹 YARA规则语法完全掌握 (Meta, Strings, Condition)

大家好,奋战在安全前线的分析师们!🛡️

在进行恶意软件分析时,有时需要在成千上万个文件中精准地找出“我正在寻找的那个家伙”。我们不可能逐一打开检查,如果遇到现有杀毒软件无法捕获的新型恶意软件,那就更束手无策了。

这时,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规则,进行实际恶意软件文件的扫描和检测实践。敬请期待!👋



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注