Loading...

文章背景图

YARA 保姆级部署教程:恶意软件识别与分类的模式匹配工具

2026-11-07
0
- 字
- 分钟
|

一、项目简介

YARA 是由 VirusTotal 开发维护的开源工具,面向(但不限于)恶意软件研究者,用于根据文本或二进制模式描述来识别和分类恶意软件样本。你可以为某个恶意软件家族编写一组规则(Rule),规则由一组字符串和一个布尔表达式组成,YARA 会在扫描文件时匹配这些规则并输出命中结果。

一个典型规则如下:定义若干字符串特征(二进制字节、明文字符串、正则等),再用 condition 子句描述这些字符串需要满足的逻辑关系,即可构成一条检测规则。

官方仓库:https://github.com/VirusTotal/yara

官方文档:https://yara.readthedocs.org/

注意:原版 YARA 已进入维护模式,官方推荐新的 Rust 重写版本 yara-x,但原版 YARA 仍被大量现有规则库和工具链使用。

YARA 所属组织 VirusTotal 官方标识

二、功能特点

  • 模式灵活:支持明文字符串、十六进制字节、通配符、大小写不敏感、正则表达式等多种字符串类型。
  • 逻辑组合:用布尔表达式(and/or/not/括号)自由组合字符串条件。
  • 跨平台:Windows、Linux、macOS 均可运行,提供命令行和 Python(yara-python)两种调用方式。
  • 元数据:规则可携带 description、author、threat_level 等元信息,便于规则管理。
  • 模块扩展:内置 pe、elf、macho、dotnet、hash 等模块,可对文件格式做结构化检测。
  • 生态丰富:大量开源规则库(如 Neo23x0/signature-base、YARA-Rules)可直接复用。

三、环境要求

  • 操作系统:Linux(Ubuntu/Debian/CentOS)、macOS、Windows。
  • 编译依赖(源码安装时):C 编译器(gcc/clang)、make、flex、bison、openssl 开发库。
  • Python 版本:使用 yara-python 扩展时需要 Python 3.6+。
  • 磁盘:工具本体约几十 MB;规则库和样本库视规模而定。

四、安装部署步骤

4.1 方式一:包管理器安装(Linux)

# Debian/Ubuntu
sudo apt update
sudo apt install -y yara

# CentOS/RHEL(需 EPEL)
sudo yum install -y epel-release
sudo yum install -y yara

# macOS
brew install yara

4.2 方式二:源码编译安装(最新版)

sudo apt install -y automake libtool make gcc flex bison openssl libssl-dev

git clone --recursive https://github.com/VirusTotal/yara.git
cd yara
./bootstrap.sh
./configure --enable-cuckoo --enable-magic --enable-dotnet
make -j$(nproc)
sudo make install
sudo ldconfig

yara --version

常用 configure 选项:--enable-cuckoo 启用 cuckoo 模块、--enable-magic 启用 libmagic 文件类型识别、--enable-dotnet 启用 .NET 模块。

4.3 方式三:Python 绑定 yara-python

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install yara-python

安装后可在 Python 脚本中 import yara 直接编译和匹配规则。

五、基础使用

5.1 编写第一条规则

新建 malware.yar 文件:

rule silent_banker : banker
{
    meta:
        description = "This is just an example"
        threat_level = 3
        in_the_wild = true

    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"

    condition:
        $a or $b or $c
}

5.2 命令行扫描

# 扫描单个文件
yara malware.yar suspicious.exe

# 扫描整个目录(递归)
yara -r malware.yar /path/to/samples/

# 输出 JSON 格式
yara -f -w malware.yar suspicious.exe

# 仅显示规则名,不输出数据
yara -m malware.yar suspicious.exe

5.3 使用 yara-python 编程调用

import yara

rules = yara.compile(filepath='malware.yar')
matches = rules.match('/path/to/suspicious.exe')
for m in matches:
    print(m.rule, m.meta)
    for s in m.strings:
        print('  offset:', s[0], 'identifier:', s[1])

5.4 加载开源规则库

git clone https://github.com/Neo23x0/signature-base.git
yara -r signature-base/yara/*.yar suspicious.exe

更多规则资源见 InQuest 维护的 awesome-yara 清单。

六、常见问题 FAQ

Q1:编译时报错 "flex/bison not found"

安装依赖即可:sudo apt install flex bison(Debian/Ubuntu)或 brew install flex bison(macOS)。

Q2:规则写了但匹配不上

先用 yara -d 调试;检查字符串大小写是否需要 nocase 修饰;十六进制字节注意空格和通配符写法;condition 中字符串是否用对了标识符。

Q3:扫描大目录很慢

YARA 会读取文件内容做匹配。可先用 hash 模块或文件大小过滤,再缩小扫描范围;也可用 --max-filesize 限制单文件大小。

Q4:YARA 和 yara-x 有什么区别?

yara-x 是官方用 Rust 重写的下一代版本,性能更好、语法更严格、规则兼容性仍在完善中。现有大量规则仍基于原版 YARA,生产环境可两者并存。

Q5:如何持续测试自己写的规则?

使用 YARA-CI,这是 VirusTotal 提供的 GitHub 应用,可对仓库中的 YARA 规则做持续测试,发现常见错误和误报。

七、参考链接

评论交流

文章目录