yara使用说明

简介

  • yara工具用来帮助安全研究人员鉴别和对恶意软件进行分类的工具。我们可以通过编写规则来进行恶意软件的识别。

    yara 规则

    最新规则官方文档V3.6.3

    规则示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    rule 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
6
all	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
    8
    rule 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
    8
    rule CaseInsensitiveTextExample
    {
    strings:
    $text_string = "foobar" nocase

    condition:
    $text_string
    }

这样Foobar, FOOBAR, and fOoBaR都会被匹配到。

  • 宽字节的匹配

    一个字符占两个字节

    1
    2
    3
    4
    5
    6
    7
    8
    rule WideCharTextExample1
    {
    strings:
    $wide_string = "Borland" wide

    condition:
    $wide_string
    }
  • fullword关键词

    rule WideCharTextExample1

    1
    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
      9
       rule 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
      9
       rule CountExample
      {
      strings:
      $a = "dummy1"
      $b = "dummy2"

      condition:
      #a == 6 and #b > 10
      }
    • 偏移地址offset

      1
      2
      3
      4
      5
      6
      7
      8
      9
      rule 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
      5
       rule FileSizeExample
      {
      condition:
      filesize > 200KB
      }

    这个只能匹配文件,如果是运行着的程序的话,那么将永远不会匹配,因为这个时候filesize没有意义。

    • 特定位置的数据获取
      PE文件的判断
      1
      2
      3
      4
      5
      6
      7
      8
       rule 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
    17
    rule Rule1
    {
    strings:
    $a = "dummy1"

    condition:
    $a
    }

    rule Rule2
    {
    strings:
    $a = "dummy2"

    condition:
    $a and Rule1
    }
  • 全局规则

    1
    2
    3
    4
    5
    global rule SizeLimit
    {
    condition:
    filesize < 2MB
    }
  • 规则标签
    方便对输出的信息进行归类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    rule TagsExample1 : Foo Bar Baz
    {
    ...
    }

    rule TagsExample2 : Bar
    {
    ...
    }
  • Metadata

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    rule 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
    10
    import "pe"

    rule Test
    {
    strings:
    $a = "some string"

    condition:
    $a and pe.entry_point == 0x1000
    }
  • 文件包含

    1
    include "other.yar"

其它