YARA 规则语法
字符串、条件与元数据。
YARA 规则语法 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
三个部分
YARA 规则包含一个名称以及最多三个部分:meta、strings 和 condition。condition 是唯一必需的部分,但实际规则通常会使用全部三个部分。
rule Example_Malware
{
meta:
author = "analyst"
description = "Detects Example family"
strings:
$a = "EvilConfig"
$b = { 6A 40 68 00 30 00 00 }
condition:
$a and $b
}meta 部分
meta 存放描述性元数据。它不会影响匹配,但对于初步研判和维护至关重要。
author、date、descriptionreference— 报告或公告链接hash— 构建规则所依据的样本哈希值tlp— 共享分类
值可以是字符串、整数或布尔值。请把 meta 当作文档:后续响应人员会依赖其中的信息。
文本字符串
strings 部分定义绑定到模式的标识符(以 $ 开头)。最简单的形式是带引号的文本字符串。
修饰符可以细化匹配:
nocase— 不区分大小写wide— UTF-16(每个字符占两个字节,Windows 中常见)ascii— ASCII(默认;与 wide 组合即可同时匹配两者)fullword— 仅匹配完整单词
strings:
$s1 = "cmd.exe /c" nocase
$s2 = "InjectDll" wide ascii
$s3 = "admin" fullword十六进制字符串
对于二进制模式,请在花括号中使用十六进制字符串。这些字符串匹配原始字节,非常适合匹配操作码、魔数和结构。
十六进制字符串支持灵活匹配:
??— 通配半字节/字节[n-m]— 跳过 n 到 m 个任意字节( A | B )— 备选项
strings:
$h1 = { 4D 5A 90 00 }
$h2 = { E8 ?? ?? ?? ?? 83 C4 04 }
$h3 = { 6A 00 [2-6] FF 15 ?? ?? ?? ?? }
$h4 = { ( B8 | B9 ) 00 00 00 00 }正则表达式
YARA 支持使用斜杠分隔的正则表达式模式,并支持与文本字符串相同的修饰符。当模式会变化但遵循某种结构时(例如配置标记或生成的互斥体名称),请使用正则表达式。
正则表达式功能强大,但代价较高;在可能的情况下,请优先使用固定字符串或十六进制,并对正则表达式进行严格锚定,以避免扫描整个文件。
strings:
$re1 = /mutex_[a-f0-9]{8}/ nocase
$re2 = /https?:\/\/[a-z0-9]{12,20}\.top\// ascii条件部分
condition 是决定是否匹配的布尔表达式。请直接引用字符串标识符;如果找到字符串,单独使用的 $a 就为真。
请使用 and、or、not 和括号进行组合。您可以在此处编码逻辑,将真正命中某个家族与偶然 совп合区分开来。
condition:
$a and ($b or $c) and not $benign计数与集合
YARA 提供了针对字符串集合的富表达力词:
any of them/all of them2 of ($s*)— 一个组中至少有两个#a > 3— $a 的匹配次数超过 3
借助这些功能,您可以要求五个家族标记中至少出现三个,在灵敏度与误报之间取得平衡。
condition:
3 of ($str*) and #marker >= 2偏移量与文件大小
条件可以引用匹配发生的位置以及文件的大小:
$a at 0— 匹配必须位于偏移量 0$a in (0..1024)— 位于某个字节范围内filesize— 总大小,例如filesize < 200KBuint16(0) == 0x5A4D— 在某个偏移量处读取整数(这里是 MZ 标头)
将匹配锚定到特定位置,可以大幅减少误报并加快扫描。
condition:
uint16(0) == 0x5A4D and filesize < 500KB and $payload模块
YARA 的模块提供结构化且了解格式的数据,使条件可以根据解析后的字段进行判断,而不必处理原始字节。
pe— PE imports、节、入口点、签名和 imphashhash— 计算区域的 md5/sha256 值math— entropy 和统计信息elf、dotnet、magic
例如,导入 pe 后,您可以根据导入的函数或特定的 imphash 进行匹配,这比匹配字面字符串可靠得多。
import "pe"
condition:
pe.imphash() == "a1b2c3d4e5f6..." and
pe.imports("kernel32.dll", "VirtualAllocEx")遍历集合
对于更丰富的逻辑,YARA 支持使用 for 遍历集合。您可以表达这样的条件:这些偏移量中至少有两个满足某个属性,或者任意节名称匹配某个模式。
处理 PE 节或 imports 等模块数据时,这一点非常重要,因为您必须检查长度可变的列表,而不是单个值。
import "pe"
condition:
for any i in (0..pe.number_of_sections - 1) : (
pe.sections[i].name == ".evil"
)全局、私有与标签
规则级关键字可以组织规则集:
global rule— 其条件会约束文件中的所有其他规则(例如仅扫描 PE 文件)private rule— 可复用的构建块,不会单独报告,但其他规则可以引用它- 规则名称后的标签用于对命中结果分类(例如用于筛选输出)
global private rule IsPE { condition: uint16(0) == 0x5A4D }
rule Dropper : trojan dropper {
strings: $a = "drop_payload"
condition: $a
}快速检查
请思考某个条件的稳健性。
回顾
YARA 的 rule 语法一览:
- 一个 rule =
meta+strings+condition - 带有 nocase/wide/ascii/fullword 修饰符的文本字符串
- 带有通配符
??、跳转[n-m]和替代项的十六进制字符串 - 用于结构化可变模式的正则表达式(请谨慎使用)
condition使用与/或/非组合字符串- 量词:any/all/N of,以及计数
#a - 锚定:at、in、filesize 和 uint 读取
- 模块(pe、hash、math)匹配结构化数据和 imphash
global、private和标签用于组织规则集
接下来:使用字符串和十六进制进行实战搜寻。
用 AI 导师学习 Cyber Security Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 76
- 课程
- 303
常见问题解答
「YARA 规则语法」课时是免费的吗?
是的 — 「YARA 规则语法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「YARA 规则语法」这节课中我会学到什么?
字符串、条件与元数据。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「YARA 规则语法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- YARA 的用途
- YARA 规则语法
- 使用字符串与十六进制进行威胁狩猎
- 扩展并自动化扫描