YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具(由virustotal的软件工程师Victor M. Alvarezk开发),使用YARA可以基于文本或二进制模式创建恶意软件家族描述信息,当然也可以是其他匹配信息。YARA的每一条描述或规则都由一系列字符串和一个布尔型表达式构成,并阐述其逻辑。YARA规则可以提交给文件或在运行进程,以帮助研究人员识别其是否属于某个已进行规则描述的恶意软件家族。比如下面这个例子:

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

}

以上规则告诉YARA任何包含有$a \$b \$c字符串的文件都被标识为slient_banker。这仅仅是一个简单的例子,YARA的规则可以复杂和强大到支持通配符、大小写敏感字符串、正则表达式、特殊符号以及其他特性。

一、YARA规则编写

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

all in private and include rule any index rva ascii indexes section at int8 strings condition int16 them contains int32 true entrypoint matches uint8 false meta uint16 filesize nocase uint32 fullword not wide for or global of

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规则的逻辑,因此该区域的描述必须包含布尔型表达式,以判别目标文件或进程是否满足该规则。通常条件内容都会引用字符串区域中的字符串定义,比如上例中的\$my_text_string和\$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

}

字符串区域

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

rule HexExample

{

strings:

$hex_string = { F4 23 ( 62 B4 | 56 | 45 ?? 67 ) 45 }

condition:

$hex_string

}

文本字符串在YARA规则中是大小写敏感的,但可以使用nocase关键字来取消大小写敏感,字符串中的特殊字符亦可以使用转义符表达,比如:

rule NocaseTextExample

{

strings:

$text_string = "\\\"foobar\"\\" nocase

condition:

$text_string

}

以上规则中所表示的字符串内容是\"foobar"\,由于使用nocase关键词,故亦可以表达\"FoObAr"\、\"FOOBAR"\等等大小写形式。

如果在目标文件中一个字符由两个字节表示,即宽字符形式,则可以使用wide关键词来表示文本字符串。如果既想表示宽字符,也想表示ASCII码,则可以再使用ascii关键词。比如:

rule WideAsciiTextExample

{

strings:

$text_string = "\\\"foobar\"\\" nocase wide ascii

condition:

$text_string

}

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

rule FullwordTextExample

{

strings:

$text_string = "foobar" fullword

condition:

$text_string

}

条件区域

条件区域的内容为布尔类型表达式,因此该区域可以使用的符号可以是布尔操作符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

}

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

rule CountExample

{

strings:

$a = "text1"

$b = "text2"

$c = "text3"

condition:

$a at 100 and $b at 0x004C0000 and $c at 300

}

与at不同,使用in关键词可以表示文件偏移范围,比如:\$a in (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()

int16()

int32()

uint8()

uint16()

uint32()

利用以上关键词和函数,若想判断目标文件是否为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

}

私有规则(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

}

二、YARA命令行参数

使用YARA进行规则匹配时需要两样东西:规则文件和目标文件,目标文件可以是文件、文件夹或进程。

usage: yara [OPTION]… RULES_FILE FILE | PID

options:

-t  print rules tagged as  and ignore the rest.

-i  print rules named  and ignore the rest.

-n print only not satisfied rules (negate).

-g print tags.

-m print metadata.

-s print matching strings.

-p  use the specified  of threads to scan a directory.

-l  abort scanning after matching a number of rules.

-a  abort scanning after a number of seconds has elapsed.

-d = define external variable.

-r recursively search directories.

-f fast matching mode.

-w disable warnings.

-v show version information.

规则文件可以直接传递给YARA,也可以在规则匹配前通过YARAC进行编译,特别是在相同的规则文件需要进行多次调用进行模式匹配时,后者可以节省许多时间。

三、平台支持

YARA支持多平台,可以运行在Windows、Linux、Mac OS X,并通过命令行界面或yara-python扩展的Python脚本使用。

四、YARA使用者

五、下载链接

漏网之余

在编写YARA规则时可以使用任何一款文本编译器,且文件后缀无要求,但如果使用记事本编写,则需要在使用YARA规则匹配前去除BOM(用vi编辑并使用“set nobomb”可以去除BOM),否则会提示“error:non-ascii character”。

在命令行下使用YARA进行规则匹配后,若目标文件或进程符合规则,则输出 ,否则无任何输出,而使用YARA命令参数“-n”可以反转输出提示,即匹配时无输出,不匹配时有输出。

yara 模式匹配 android,恶意软件模式匹配利器 – YARA相关推荐

  1. yara 模式匹配 android,YARA——恶意软件模式匹配利器

    YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具(由virustotal的软件工程师Victor M. Alvarezk开发),使用YARA可以基于文本或二进制模式创建恶意软件家 ...

  2. yara 模式匹配 android,YARA――恶意软件模式匹配利器

    YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具(由virustotal的软件工程师Victor M. Alvarezk开发),使用YARA可以基于文本或二进制模式创建恶意软件家 ...

  3. 编写yara规则 检测恶意软件

    Yara规则与C语言语法十分相像, 以下是一个简单的规则, 这个规则没有进行任何操作: rule HelloRule { condition: false } 规则标识符 规则标识符是上面简单规则示例 ...

  4. 编写yara规则,检测恶意软件(自定义yara规则)

    Yara规则与C语言语法十分相像, 以下是一个简单的规则, 这个规则没有进行任何操作: rule HelloRule {condition:false } 规则标识符 规则标识符是上面简单规则示例中跟 ...

  5. 静态扫描之Yara第一话--安装及使用Yara

    Yara安装及使用 概述 Yara是一款用于识别恶意软件及对其行为进行分类的安全利器.Yara会根据我们自己编写的yara规则,来对可疑软件进行一个模式匹配,若可疑软件中的一些特征与我们的yara规则 ...

  6. Android APP破解利器Frida之反调试对抗

    本文讲的是Android APP破解利器Frida之反调试对抗,在我发表了关于Frida的第二个博文后不久,@muellerberndt决定发布另外一个新的OWASP Android 破解APP,我很 ...

  7. Android恶意软件偷取Uber凭证

    近期,一种新的Android恶意软件变种Android.Fakeapp被研究人员所披露.据了解该Android恶意软件主要目标是窃取Uber用户的凭证信息,然后使用合法的Uber app的深层链接来隐 ...

  8. Android恶意软件特征及分类

    针对Android的恶意软件,除了熟知的木马.病毒,还有勒索软件(ransomware).广告(adware)和间谍软件(spyware). 要研究Android的恶意软件,首先需要知道,软件的哪些行 ...

  9. Android恶意软件的行为总结

    针对Android的恶意软件,除了熟知的木马.病毒,还有勒索软件(ransomware).广告(adware)和间谍软件(spyware). 要研究Android的恶意软件,首先需要知道,软件的哪些行 ...

最新文章

  1. IE6 IE7 IE8(Q) 不支持 JSON 对象
  2. UI自动化之特殊处理三(日期控件\表格\富文本)
  3. Linux_Centos中搭建nexus私服
  4. PHP——smarty模板(第一天)
  5. ping github超时问题
  6. 这是不是帮女朋友拍照时的你?哈哈哈哈
  7. Jax-RS自定义异常处理
  8. 自适应宽度元素单行文本省略用法探究
  9. [蓝桥杯]试题 基础练习 芯片测试
  10. 使用Zookeeper实现负载均衡原理
  11. 数学分析原理 定理 6.5
  12. 设计模式-单一职责原著
  13. 软件是如何驱动硬件的,代码是怎样对计算机实现控制的?
  14. Steam版XCOM: Enemy Within(内部敌人)不能启动的问题
  15. 卖衣服有什么引流产品?微商卖衣服引流推广?
  16. Tiled Map Editor(一)
  17. 静态代码检查-CheckStyle
  18. 4年外包终上岸,我只能说这类公司能不去就不去..
  19. jQuery实现拼图小游戏(实操案例)
  20. WINRAR -- CRC校验失败,文件被破坏

热门文章

  1. python江红书后第六章实验答案_C#NET程序设计教程实验指导(清华大学江红,余青松)实验源码第六章...
  2. 猜字母游戏java源代码
  3. BGP在数据中心的应用1——数据中心网络介绍
  4. input输入字符限制
  5. Android手电筒制作
  6. 小学信息技术用计算机画画说课,小学信息技术说课稿三篇
  7. python代码代写_python代写代码
  8. 关于采集插件的一些详细知识
  9. vue前端项目启动出错处理
  10. 本科、硕士、博士的区别(终极版)