未分类

如何编写YARA规则

YARA 是一种旨在(但不限于)帮助恶意软件研究人员识别和分类恶意软件样本的工具。使用 YARA,您可以基于文本或二进制模式创建恶意软件系列(或任何您想描述的内容)的描述。每个描述,也就是规则,由一组字符串和一个确定其逻辑的布尔表达式组成。让我们看一个例子:

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
}

上述规则告诉 YARA,任何包含三个字符串之一的文件都能匹配为 Silent_banker。这只是一个简单的示例。您可以通过使用通配符、不区分大小写的字符串(nocase)、正则表达式、特殊运算符和本文档中介绍的许多其他功能来创建更复杂和更强大的规则。($a or $b or $c可以简写为any of them)

我们可以通过十六进制字符串、文本字符串和条件来识别恶意软件。

这是一个简单的通过十六进制字符串匹配内容的规则:

rule WildcardExample
{
    strings:
        $hex_string = { E2 34 ?? C8 A? FB }

    condition:
        $hex_string
}

YARA规则支持半字节和全字节的通配符。

下面是文本字符串的规则示例:

rule TextExample
{
    strings:
        $text_string = "foobar"

    condition:
        $text_string
}

这是最简单的情况:ASCII 编码、区分大小写的字符串。但是,文本字符串可以附带一些有用的修饰符,这些修饰符可以改变字符串的解释方式。这些修饰符附加在由空格分隔的字符串定义的末尾,如fullword(全字匹配)、nocase(不区分大小写)等。

有时我们不仅需要知道某个字符串是否存在,还需要知道该字符串在文件或进程内存中出现了多少次。每个字符串出现的次数由一个变量表示,该变量的名称是字符串标识符,但用 # 字符代替 $ 字符。例如:

rule CountExample
{
    strings:
        $a = "dummy1"
        $b = "dummy2"

    condition:
        #a == 6 and #b > 10
}

此规则与包含字符串 $a 的任何文件或进程正好匹配六次,并且字符串 $b 出现十次以上。

在大多数情况下,当在条件中使用字符串标识符时,我们愿意知道关联的字符串是否在文件或进程内存中的任何位置,但有时我们需要知道字符串是否在某个特定的偏移量文件或进程地址空间内的某个虚拟地址。在这种情况下,操作符at就是我们所需要的。此运算符的使用如下例所示:

rule AtExample
{
    strings:
        $a = "dummy1"
        $b = "dummy2"

    condition:
        $a at 100 and $b at 200
}

仅当在文件中的偏移量 100 处(或如果应用于正在运行的进程时在虚拟地址 100 处)找到字符串 $a 时,上述示例中的表达式才为真。字符串 $b 应该出现在偏移量 200 处。请注意,两个偏移量都是十进制的,但是十六进制数可以通过在数字前添加前缀 0x 来编写,就像在 C 语言中一样,这在编写虚拟地址时非常方便。还要注意操作的优先级高过。

字符串标识符不是唯一可以出现在条件中的变量(事实上,规则可以在没有任何字符串定义的情况下定义,如下所示),还有其他特殊变量也可以使用。这些特殊变量之一是filesize,顾名思义,它保存正在扫描的文件的大小。大小以字节表示。

rule FileSizeExample
{
    condition:
        filesize > 200KB
}

前面的示例还演示了KB后缀的使用。这个后缀,当附加到一个数字常量时,会自动将常量的值乘以 1024。MB后缀可用于将值乘以 2^20。两个后缀只能与十进制常量一起使用。

使用filesize时,该规则适用于文件才有意义。如果规则应用于正在运行的进程,它将永远不会匹配,因为 filesize在这种情况下没有意义。

如何编写YARA规则已关闭评论