简介
- yara工具用来帮助安全研究人员鉴别和对恶意软件进行分类的工具。我们可以通过编写规则来进行恶意软件的识别。
yara 规则
最新规则官方文档V3.6.3
规则示例:1
2
3
4
5
6
7
8
9
10
11
12
13rule silent_banker : banker
{
meta:
description = "This is just an example"
thread_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
}
这个就是一个名为rule silent_banker的规则,其中banker是规则的tag字段(可以有多个tag),meta字段是规则的描述信息,strings是规则字段,condition则是条件判断的字段,这个规则的意思就是只要满足了字符串或a或b或c就会命中规则。
这里只是一个简单的规则,规则的创建可以使用通配符、大小写非敏感的字符串、正则表达式、特殊的操作符号等其它的特征。
通过python使用yara
yara语法
silent-_banker叫做identifiers,是大小写敏感的且不能超过128个字符,且不能用以下的关键词,因为这些是yara的关键词1
2
3
4
5
6all and any ascii at condition contains
entrypoint false filesize fullword for global in
import include int8 int16 int32 int8be int16be
int32be matches meta nocase not or of
private rule strings them true uint8 uint16
uint32 uint8be uint16be uint32be wide
字符串可以是文本字符串也可以是十六进制,ascii类型的使用双引号包裹,十六进制字符串使用大括号包裹。
注释语法和c语言相同。
* 三种string;
1.文本类型字符串
2.十六进制字符串
3.正则表达式
- 十六进制Example
1
2
3
4
5
6
7
8rule AlternativesExample1
{
strings:
$hex_string = { F4 23 ( 62 B4 | 56 ) 45 }
condition:
$hex_string
}
valid
F42362B445或者F4235645
- 字符串Example
默认是敏感的,但是可以通过nocase关键字设置成不敏感的1
2
3
4
5
6
7
8rule CaseInsensitiveTextExample
{
strings:
$text_string = "foobar" nocase
condition:
$text_string
}
这样Foobar, FOOBAR, and fOoBaR都会被匹配到。
宽字节的匹配
一个字符占两个字节1
2
3
4
5
6
7
8rule WideCharTextExample1
{
strings:
$wide_string = "Borland" wide
condition:
$wide_string
}fullword关键词
rule WideCharTextExample11
2
3
4
5
6
7{
strings:
$fullword_string = "domain" fullword
condition:
$fullword_string
}www.mydomain.com www.my-domain.com www.domain.com
- 正则表达式
使用斜线包裹,而非双引号或者大括号。1
2
3
4
5
6
7
8
9rule RegExpExample1
{
strings:
$re1 = /md5: [0-9a-fA-F]{32}/
$re2 = /state: (on|off)/
condition:
$re1 and $re2
}
条件判断语句Conditions
可以没有特征strings但是不能没有strings字段
可以设定特征出现的次数1
2
3
4
5
6
7
8
9rule CountExample
{
strings:
$a = "dummy1"
$b = "dummy2"
condition:
#a == 6 and #b > 10
}偏移地址offset
1
2
3
4
5
6
7
8
9rule InExample
{
strings:
$a = "dummy1"
$b = "dummy2"
condition:
$a in (0..100) and $b in (100..filesize)
}
特征a出现在0-0x100偏移且特征b出现在0x100之后。
- 文件大小
1
2
3
4
5rule FileSizeExample
{
condition:
filesize > 200KB
}
这个只能匹配文件,如果是运行着的程序的话,那么将永远不会匹配,因为这个时候filesize没有意义。
- 特定位置的数据获取
PE文件的判断1
2
3
4
5
6
7
8rule IsPE
{
condition:
// MZ signature at offset 0 and ...
uint16(0) == 0x5A4D and
// ... PE signature at offset stored in MZ header at 0x3C
uint32(uint32(0x3C)) == 0x00004550
}
PE文件结构中的前两个字节是DOS签名5A4D,即“MZ”。
特征集合
rule OfExample1
{
strings:$a = "dummy1" $b = "dummy2" $c = "dummy3"
condition:
2 of ($a,$b,$c)
}
满足两个特征即可
- 正则表达式
引用其他规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17rule Rule1
{
strings:
$a = "dummy1"
condition:
$a
}
rule Rule2
{
strings:
$a = "dummy2"
condition:
$a and Rule1
}全局规则
1
2
3
4
5global rule SizeLimit
{
condition:
filesize < 2MB
}规则标签
方便对输出的信息进行归类。1
2
3
4
5
6
7
8
9rule TagsExample1 : Foo Bar Baz
{
...
}
rule TagsExample2 : Bar
{
...
}Metadata
1
2
3
4
5
6
7
8
9
10
11
12
13
14rule MetadataExample
{
meta:
my_identifier_1 = "Some string data"
my_identifier_2 = 24
my_identifier_3 = true
strings:
$my_text_string = "text here"
$my_hex_string = { E2 34 A1 C8 23 FB }
condition:
$my_text_string or $my_hex_string
}模块引用
1
2
3
4
5
6
7
8
9
10import "pe"
rule Test
{
strings:
$a = "some string"
condition:
$a and pe.entry_point == 0x1000
}文件包含
1
include "other.yar"
其它
- 容易踩坑的点
当进程扫描的时候,这时是没有filesize属性的,也就永远不会满足的。此外还有通过文件偏移来判断PE也是不可行的。 - web
https://github.com/Tigzy/yaraeditorReference
恶意软件模式匹配利器 – YARA
YARA:抗击恶意代码的神兵利器
PEScanner
yara规则自动生成
UNLEASHING YARA – PART 2
教你构建自己的yara数据库
yarAnalyzer
yara简介及API解析
两个开源恶意代码的查杀引擎 clamav yara
http://bruteforcelab.com/yara-a-beginners-guide.html
https://blog.malwarebytes.com/threat-analysis/2013/10/using-yara-to-attribute-malware/
https://securityintelligence.com/signature-based-detection-with-yara/