yara 模式匹配 android,恶意软件模式匹配利器 – YARA-程序员宅基地

技术标签: yara 模式匹配 android  

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的规则可以复杂和强大到支持通配符、大小写敏感字符串、正则表达式、特殊符号以及其他特性。

bVbXWl

一、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”可以反转输出提示,即匹配时无输出,不匹配时有输出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33289873/article/details/117762296

智能推荐

反射全解_object 反射-程序员宅基地

文章浏览阅读2.3w次,点赞1.4k次,收藏861次。反射的概念反射的引入:Object obj = new Student();若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法:1.若编译和运行类型都知道,使用 instanceof判断后,强转。2.编译时根本无法预知该对象属于什么类,程序只能依靠运行时信息来发现对象的真实信息,这时就必须使用反射了。3.要是想得到对象..._object 反射

sass 自定义函数_sass定义函数-程序员宅基地

文章浏览阅读2.6k次。sass 自定义函数jcLee95 的 CSDN 博客CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343邮箱 :[email protected]本文地址:https://blog.csdn.net/qq_28550263/article/details/123350343相关文章推荐:Sass 预定义函数总结sass 混入(mixin)目 录1. Sass函数的概念2. Sass函数 与 Sass混_sass定义函数

兰州大学计算机科学考研科目,2019兰州大学计算机考研初试科目、参考书目、报录比汇总...-程序员宅基地

文章浏览阅读1.3k次。本次推荐院校是位于甘肃的兰州大学,作为老牌知名高校,兰州大学近年来因地理位置导致发展不如预期,优质生源匮乏,其中计算机专业报考人数较少,虽然复试线已经低于同一等级的高校,但上线人数依然严重不足。然而仅凭兰州大学的金字招牌,就值得各位同学报考兰州大学。本文由新祥旭徐老师系统介绍兰州大学计算机考研详情,主要有以下几个板块:学院介绍,专业情况介绍,2019录取情况分析,考研科目介绍,专业课参考书目及备考...

NR 5G 网络整体架构及功能总结_5gc下,ng -enb和gnb间为x2接口-程序员宅基地

文章浏览阅读2.9w次,点赞17次,收藏201次。5G网络的整体架构5G的网络架构主要包括5G接入网和5G核心网,其中NG-RAN代表5G 接入网,5GC代表5G核心网。5G接入网(NG-RAN)5G接入网主要包含一下两个节点:  1、gNB: 为5G网络用户提供NR的用户平面和控制平面协议和功能  2、ng-eNB:为4G网络用户提供NR的用户平面和控制平面协议和功能 其中gNB和gNB之间,gNB和ng-eNB之间,ng-eNB..._5gc下,ng -enb和gnb间为x2接口

c语言三个传教士和三个野人,有三个传教士和三个野人过河-Read.DOC-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏5次。有三个传教士和三个野人过河-Read传教士和野人渡河问题刘宪国 050422023野人过河问题描述如下: 有三个传教士和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会有危险.一、算法分析先来看看问题的初始状态和目标状态,假设分为甲岸和乙岸:初始状态:甲岸,3野人,3传教士; 乙岸,0野人,0传教士; 船停在甲岸,船上有0个人;..._有三个传教士m和三个野人c过河

logback root level logger level 日志级别覆盖?继承?-程序员宅基地

文章浏览阅读7.2k次。1. logback-spring.xml 配置 1 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 2 ... 3 </appender> 4 5 <appender name="ALL" class="ch.qos.logback..._logback root level

随便推点

一种常见的OkHttp错误调用方式_java okhttpclient 报错找不到-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。最近在工作中开发安卓项目。碰到了一个棘手的问题:代码在虚拟机中使用正常,但是在真机上一直出现网络问题。表现为网络联通性有规律的周期性,周期为2小时。从图表中可以轻易看出,在2小时里连续的40分钟内,网络是正常的,但在其他时间段是异常,异常反馈是读取数据超时。一开始以为是网络环境的问题,但经过排查,发现问题并没有这么简单。_java okhttpclient 报错找不到

马克飞象上下标写法_马克飞象图片语法-程序员宅基地

文章浏览阅读259次。1. 上标方法1,markdown自带语法:2N 的写法为:2^N^方法2,html语法:2N 的写法为:2<sup>N</sup>方法3,markdown公式表示法2N2^N2N表达式写法:$$2^N$$。注意:这种方式会强制要求换行,如果写公式用这种方式比较好。2. 下标方法1,markdown自带语法:2N 的写法为:2~N~方法2,html语法:2N 的写法为:2<sub>N</sub>..._马克飞象图片语法

8.1 图像腐蚀-程序员宅基地

文章浏览阅读6.5k次,点赞12次,收藏24次。一、什么是图像腐蚀? 比如左边的图像,白色是前景,黑色是背景。如果对当前的图像进行腐蚀,就会得到右边的图像。 简单点就是边被腐蚀掉了。 下面是官网上给的例子: 二、腐蚀的原理 腐蚀一般针对的是二值图像,也就是只有0和1两个。0就是黑色,1就是白色。我们所谓的腐蚀是指针对他的前景色,就是像素点的值为1的那些像素点。 我们进行腐蚀操作,有两个..._图像腐蚀

因子分析法之因子旋转-程序员宅基地

文章浏览阅读2.7w次,点赞9次,收藏72次。因子分析法之因子旋转1.因子旋转及其意义建立因子分析模型的目的不仅是要找出公因子以及对变量进行分组,更重要的是要知道每个公因子的意义,以便对实际问题做出科学分析。因子旋转即对因子载荷矩阵A,用一个正交矩阵T右乘A实现对因子载荷矩阵的旋转(一次正交变换即对应坐标系的一次旋转),旋转后因子载荷矩阵结构简化,更容易对公因子进行解释。结构简化就是重新分配每个因子所解释方差的比例,使每个变量仅在一个公因子上有较大的载荷,在其他公因子上的载荷较小,即是使因子载荷矩阵每行或者每列元素的平方值向0与1两极分化。2._因子旋转

【Python】输入一行字符(20 个以上字符),分别统计出其中英文字母、空格、数字和其它字 符的个数。_1.用户从键盘输入一行字符(不少于20个,至少包括数字、英文字母、空格及其他特殊符-程序员宅基地

文章浏览阅读5.3k次,点赞14次,收藏15次。输入一行字符(20 个以上字符),分别统计出其中英文字母、空格、数字和其它字 符的个数。运行结果如下:请输入一个字符串:45se r,d5d~ s58*英文字母=6 个,空格=4 个,数字=5 个,其他=3 个s=input('请输入一个字符串:\n')letters=0space=0digit=0others=0for c in s: if c.isalpha():..._1.用户从键盘输入一行字符(不少于20个,至少包括数字、英文字母、空格及其他特殊符

使用DBeaver连接达梦数据库,接上文安装达梦数据库_达梦连接工具有哪些-程序员宅基地

文章浏览阅读2k次。修改Idea配置文件找到idea的安装目录,在bin文件夹下找到以下两个文件,用记事本或者其他软件打开:idea.exe.vmoptionsidea64.exe.vmoptions_达梦连接工具有哪些

推荐文章

热门文章

相关标签