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,uint8int16,uint16int32,uint32int64,uint64be后缀表示大端序(默认小端序)
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检测的方法:
- 完全规避CRT(C运行时库)的使用
- 删除PDB调试信息
- 使用非常规字符串编码
- 避免使用明显的API调用模式
12. 最佳实践
- 规则应尽可能具体,减少误报
- 使用元数据提供足够的信息
- 结合多种检测条件提高准确性
- 定期更新规则以适应新的威胁
- 测试规则确保不会产生过多误报
通过掌握这些YARA规则编写技巧,您可以有效地创建强大的恶意软件检测规则,提高安全分析效率。