Yara规则编写

YARA规则的标识符类似于C语言结构,其规则声明以rule标识,在规则描述中可以包括字母、数字甚至下划线字符,但字符串第一个字符不能是数字,且单条描述不能超过128个字符。

Yara关键字

Yara关键字

YARA规则由字符串区域和条件区域两部分组成,其中条件区域必须存在,字符串区域则可有可无,比如不依赖任何字符串的规则:

rule Dummy
{
    condition:
        false
}

字符串区域中的每条规则都由$开头的字符串定义,其规则内容可以是字符形式或十六进制形式,所定义的字符串由条件区域引用:

rule ExampleRule
{
    strings:
        $my_text_string = "text here"
        $my_hex_string = {E2 34 A1 C8 23 FB}

    condition:
        $my_text_string or $my_hex_string
}

与C语言一样,字符串规则使用双引号,而十六进制规则使用大括号引用,每个十六进制数字之间用空格间隔,且十进制数字不允许出现在十六进制规则中。

条件区域决定YARA规则的逻辑,因此该区域的描述必须包含布尔型表达式,以判别目标文件或进程是否满足该规则。通常条件内容都会引用字符串区域中的字符串定义,比如上例中的 mytextstring my_hex_string。条件区域的字符串表述方式为布尔型变量,若文件或进程内存符合字符串表达式则其结果为True,否则即为False。

注释

YARA规则的注释方式和类C语言一样,可以用//进行单行注释,也可以用/**/进行多行注释。

/*
This is a multi-line comment …
*/
rule CommentExample //and this is single-line comment
{
    condition:
        false // just an dummy rule, don't do this
}

字符串(Strings)

YARA规则的字符串有三种类型:文本字符串、十六进制字符串、正则表达式。文本字符串用来定义文件或进程内存中可读型内容,十六进制字符串用来定义字节内容,正则表达式可用在文本字符串和十六进制字符串中。比如:

rule HexExample
{
    strings:
        $hex_string = { F4 23 ( 62 B4 | 56 | 45 ?? 67 ) 45 }
    condition:
        $hex_string
}

十六进制字符串

文本字符串

常见文本字符串如下:

rule TextExample
{
    strings:
        $text_string = "foobar"

    condition:
       $text_string
}
转义符

转义符

不区分大小写
rule CaseInsensitiveTextExample
{
    strings:
        $text_string = "foobar" nocase

    condition:
        $text_string
}

nocase 修饰的字符串 foobar 将匹配 Foobar , FOOBAR , 和 fOoBaR 。

宽字符

如果在目标文件中一个字符由两个字节表示,即宽字符形式,则可以使用wide关键词来表示文本字符串。

rule WideCharTextExample1
{
    strings:
        $wide_string = "Borland" wide

    condition:
       $wide_string
}

如果既想表示宽字符,也想表示ASCII码,则可以再使用ascii关键词。

rule WideCharTextExample2
{
    strings:
        $wide_and_ascii_string = "Borland" wide ascii

    condition:
       $wide_and_ascii_string
}
单个词组文本字符串

如果想匹配单个词组文本字符串,可以使用fullword关键词,例如:

rule FullwordTextExample
{
    strings:
        $text_string = "foobar" fullword
    condition:
        $text_string
}

(不是很明白fullword关键字)

正则表达式

条件(Condition)

条件区域的内容为布尔类型表达式,因此该区域可以使用的符号可以是布尔操作符and、or和not,关系操作符>、<、==、<=、>=和!=,算数操作符+、-、*、/、%和按位操作符&、|、>>、<<、^、~。比如:

rule Example
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"
    condition:
        ($a or $b) and $c
}

如果想表达字符串描述在文件或进程内存中出现的次数,则在条件表达式中将字符串定义中的$替换为#。比如:

rule CountExample
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"
    condition:
        #a == 1 or #b > 4 and #c < 6
}

如果想表达字符串在文件中的偏移量条件或虚拟地址的条件,则使用at关键词表示,且表达式中的数字类型可以是十进制或十六进制。比如:

rule CountExample
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"
    condition:
        $a at 100 and $b at 0x004C0000 and $c at 300
}

与at不同,使用in关键词可以表示文件偏移范围,比如: ain(1..100) b in
(100..filesize)。这里的filesize亦为关键词,表示文件的大小(单位字节),但该关键词仅适用于分析对象是文件形式。比如:

rule FileSizeExample
{
    condition:
        filesize > 200KB
}

另外一个特殊的关键词是entrypoint,表示文件入口点,适用于PE文件和ELF文件,当然也可以用于在运行进程。比如:

rule FileSizeExample
{
    string:
        $a = {E8 00 00 00}
    condition:
        $a at entrypoint
}

在指定的文件位置表达可访问数据也是条件表达式可以做到的,需要用到uintXX或intXX关键词以及以下函数:

int8(<offset or virtual address>)
int16(<offset or virtual address>)
int32(<offset or virtual address>)
uint8(<offset or virtual address>)
uint16(<offset or virtual address>)
uint32(<offset or virtual address>)

利用以上关键词和函数,若想判断目标文件是否为PE文件,相应的规则可写为:

rule IsPE
{
    condition:
        // MZ signature at offset 0
        uint16(0) == 0x5A4D and
        // PE signature at offset stored in MZ header at 0x3C
        uint32(uint32(0x3C)) == 0×00004550
}

此外,还可以使用of、for…of等关键词表达字符串集合,使用them关键词表示隐式字符串定义。比如:

rule AnonymousStrings {
strings:
=dummy1 = “dummy2”
condition:
1 of them }

其他规则

除字符串区域和条件区域外,YARA还支持其他类型规则和形式,比如全局规则、私有规则、规则标签、元数据、额外变量。

全局规则(global rule)

旨在进行规则匹配前进行全局筛选,因此比其他规则匹配优先级要高,比如在匹配目标文件之前需要先筛选出小于2MB的文件:

global rule SizeLimit
{
    condition:
        filesize < 2MB
}

私有规则(private rule)

可以避免规则匹配结果的混乱,即若使用私有规则进行匹配则YARA不会输出任何匹配信息。比如在规则文件Rule2引用规则文件Rule1时不希望Rule1的匹配信息输出:

private rule Rule1
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
     condition:
        $a and $b
}
rule Rule2
{
    strings:
        $a = "dummy3"
     condition:
        $a and Rule1
}

规则标签(Tag Rule)

目的在于对规则匹配结果进行筛选,仅输出用户感兴趣的匹配结果。比如:

rule TagRule : dummy1 dummy 2
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
     condition:
        $a and $b
}

元数据(MetaData)

目的在于对规则描述进行额外的描述存储,其构成方式和字符串区域一致,但不可用于条件区域引用。比如本文开头的例子。

额外变量(External Variable)

允许规则文件中存在YARA匹配时手动添加的变量内容(见下文YARA命令行参数),比如:

rule ExternalVariableExample
{
    condition:
        ext_var == 10
}

参考文章

  1. 恶意软件模式匹配利器 – YARA
  2. Welcome to YARA’s documentation!
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值