YARA规则编写与实战
字数 1214 2025-08-30 06:50:35

YARA规则编写与实战指南

1. YARA简介

YARA是一种强大的恶意软件模式匹配工具,可以根据二进制或文本内容进行模式匹配。它广泛应用于恶意软件分析、威胁检测和数字取证领域。

2. 基本规则结构

每条YARA规则必须包含一个名称和条件(condition)。最简单的规则如下:

rule dummy {
    condition: true
}
  • condition是关键字,必须包含一个布尔表达式
  • 这个例子中,规则总是会被匹配

3. 运行YARA规则

基本命令格式:

yara rule.yar dir

常用参数:

  • -r:递归搜索
  • -s:输出匹配到的字符串
  • -X:输出xor key
  • -p:多线程处理
  • -c:只输出匹配数量

4. 元数据(Meta)

元数据用于标注作者、版本号、描述、哈希等附加信息,不会影响匹配逻辑:

rule dummy {
    meta:
        a = 123456
        b = "description"
    condition:
        true
}

5. 字符串匹配

YARA支持多种字符串匹配方式:

5.1 文本字符串

大小写敏感的普通字符串,可通过修饰符调整匹配行为:

rule Example {
    strings:
        $text_string = "Hello World" nocase
    condition:
        $text_string
}

常用修饰符:

  • nocase:大小写不敏感
  • wide:匹配宽字符
  • xor:匹配进行1字节异或的字符串变体
  • base64:匹配base64编码的字符串变体

5.2 十六进制字符串

支持两种表示形式,支持通配符和非操作(~):

rule HexExample {
    strings:
        $hex_string = { 12 34 56 ?? 78 [2-4] 90 }
    condition:
        $hex_string
}

5.3 正则表达式

写在/之间:

rule RegExExample {
    strings:
        $re = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
    condition:
        $re
}

6. 条件表达式

条件部分支持多种逻辑运算和关键字:

6.1 基本逻辑运算

condition:
    ($a and $b) or (not $c)

6.2 字符串集操作

condition:
    all of them    // 匹配所有字符串
    1 of them      // 匹配任意一个字符串
    none of them   // 不匹配任何字符串

6.3 特殊关键字

  • filesize:文件大小
  • entrypoint:入口点(高版本已弃用,改用PE模块的entry_point)

6.4 循环结构

condition:
    for any of ($a, $b) : ( $ at pe.entry_point )

7. 取值操作

可以从指定偏移读取值:

condition:
    uint32(0) == 0x5A4D and  // MZ头
    uint32(uint32(0x3C)) == 0x00004550  // PE头

支持的类型:

  • int8, uint8
  • int16, uint16
  • int32, uint32
  • int64, uint64
  • be后缀表示大端序(默认小端序)

8. 实战示例

8.1 检测RWX内存申请

rule RWX_Memory {
    meta:
        description = "Detects RWX memory allocation"
    strings:
        $alloc = { 48 8D 0D ?? ?? ?? ?? 41 B8 40 00 00 00 }  // PAGE_EXECUTE_READWRITE = 0x40
    condition:
        $alloc
}

8.2 检测RC4加密

rule RC4_Encryption {
    meta:
        description = "Detects use of SystemFunction032/033 for RC4"
    strings:
        $func032 = "SystemFunction032"
        $func033 = "SystemFunction033"
    condition:
        any of them
}

8.3 检测高熵无签名代码

rule High_Entropy_No_Signature {
    meta:
        description = "Detects high entropy sections with no signature"
    condition:
        pe.sections[i].entropy > 7.0 and
        not pe.exports("CryptVerifyCertificateSignature")
}

9. yara-python使用

官方提供的Python库,用于程序化调用YARA:

import yara

rules = yara.compile(filepath='rules.yar')

def callback(data):
    print("Match found:", data)
    return yara.CALLBACK_CONTINUE

matches = rules.match('/path/to/file', callback=callback)

回调返回值:

  • CALLBACK_CONTINUE:继续搜索
  • CALLBACK_ABORT:终止搜索

9.1 进程扫描示例

import yara
import psutil

rules = yara.compile(source='''
rule RWX_Memory {
    strings:
        $alloc = { 48 8D 0D ?? ?? ?? ?? 41 B8 40 00 00 00 }
    condition:
        $alloc
}
''')

for proc in psutil.process_iter():
    try:
        matches = rules.match(pid=proc.pid)
        if matches:
            print(f"Found in PID {proc.pid}, killing...")
            proc.kill()
    except:
        continue

10. yarGen工具使用

yarGen是一款自动生成YARA规则的工具:

基本用法:

python yarGen.py -m suspicious_dir --excludegood -o rules.yar

参数说明:

  • -m:指定恶意样本目录
  • --excludegood:排除良性字符串
  • -o:输出规则文件

11. 规避技巧

从生成的规则中可以看出一些规避YARA检测的方法:

  1. 完全规避CRT(C运行时库)的使用
  2. 删除PDB调试信息
  3. 使用非常规字符串编码
  4. 避免使用明显的API调用模式

12. 最佳实践

  1. 规则应尽可能具体,减少误报
  2. 使用元数据提供足够的信息
  3. 结合多种检测条件提高准确性
  4. 定期更新规则以适应新的威胁
  5. 测试规则确保不会产生过多误报

通过掌握这些YARA规则编写技巧,您可以有效地创建强大的恶意软件检测规则,提高安全分析效率。

YARA规则编写与实战指南 1. YARA简介 YARA是一种强大的恶意软件模式匹配工具,可以根据二进制或文本内容进行模式匹配。它广泛应用于恶意软件分析、威胁检测和数字取证领域。 2. 基本规则结构 每条YARA规则必须包含一个名称和条件(condition)。最简单的规则如下: condition 是关键字,必须包含一个布尔表达式 这个例子中,规则总是会被匹配 3. 运行YARA规则 基本命令格式: 常用参数: -r :递归搜索 -s :输出匹配到的字符串 -X :输出xor key -p :多线程处理 -c :只输出匹配数量 4. 元数据(Meta) 元数据用于标注作者、版本号、描述、哈希等附加信息,不会影响匹配逻辑: 5. 字符串匹配 YARA支持多种字符串匹配方式: 5.1 文本字符串 大小写敏感的普通字符串,可通过修饰符调整匹配行为: 常用修饰符: nocase :大小写不敏感 wide :匹配宽字符 xor :匹配进行1字节异或的字符串变体 base64 :匹配base64编码的字符串变体 5.2 十六进制字符串 支持两种表示形式,支持通配符和非操作(~): 5.3 正则表达式 写在 / 之间: 6. 条件表达式 条件部分支持多种逻辑运算和关键字: 6.1 基本逻辑运算 6.2 字符串集操作 6.3 特殊关键字 filesize :文件大小 entrypoint :入口点(高版本已弃用,改用PE模块的 entry_point ) 6.4 循环结构 7. 取值操作 可以从指定偏移读取值: 支持的类型: int8 , uint8 int16 , uint16 int32 , uint32 int64 , uint64 be 后缀表示大端序(默认小端序) 8. 实战示例 8.1 检测RWX内存申请 8.2 检测RC4加密 8.3 检测高熵无签名代码 9. yara-python使用 官方提供的Python库,用于程序化调用YARA: 回调返回值: CALLBACK_CONTINUE :继续搜索 CALLBACK_ABORT :终止搜索 9.1 进程扫描示例 10. yarGen工具使用 yarGen是一款自动生成YARA规则的工具: 基本用法: 参数说明: -m :指定恶意样本目录 --excludegood :排除良性字符串 -o :输出规则文件 11. 规避技巧 从生成的规则中可以看出一些规避YARA检测的方法: 完全规避CRT(C运行时库)的使用 删除PDB调试信息 使用非常规字符串编码 避免使用明显的API调用模式 12. 最佳实践 规则应尽可能具体,减少误报 使用元数据提供足够的信息 结合多种检测条件提高准确性 定期更新规则以适应新的威胁 测试规则确保不会产生过多误报 通过掌握这些YARA规则编写技巧,您可以有效地创建强大的恶意软件检测规则,提高安全分析效率。