Yara是一个流行的开源工具,用于识别和分类恶意软件样本。这是我的座右铭 Swiss knife
对于恶意软件研究人员和其他所有人。我认为这是值得的,因为它的特点。在本教程中,我们将了解yara的一些特性。
安装
Yara的安装对于Linux安装来说非常容易。我们将只使用包管理器获取并安装Yara。
Fedora、CentOS、RedHat:
$ sudo yum install yara -y
Ubuntu、Debian:
$ apt install yara
救命
Yara的帮助信息可以简单地列在下面。
$ yara -h

我们还可以看到yara命令的用法,如下所示。Yara支持将目标作为二进制文件、目录或进程id,如下所示。
yara [OPTION]... RULES_FILE FILE | DIR | PID
Yara入门
Yara工具从规则文件中读取规则,并在指定的配置中将这些规则实现到指定的二进制文件中。在实现之后,结果被打印到终端或控制台。我们将从定义规则文件的简单示例开始。
创建规则文件
在本例中,我们将使用规则文件名 myrule
此规则文件包含以下规则。
我的规则
rule dummy { condition: true }
下载二进制示例
我们将从网上下载我们的二进制样本。我们的示例二进制文件是名为 Putty
. 下载以下链接以获取。
https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe
我们使用 wget
用于Linux的下载操作。
$ wget https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe
跑呀跑呀
现在我们可以用雅拉来执行我们的第一条规则了。
$ yara myrule putty.exe
结果并非如此,但它是有效的。此规则文件仅打印文本 dummy
以及本例中的文件名 putty.exe
规则
Yara规则语法类似于C语言。下面是一个简单的规则,名为 myrule
.
rule myrule{ strings: $my_text_string = "text here" $my_hex_string = { E2 34 A1 C8 23 FB } condition: $my_text_string or $my_hex_string}
我们在规则定义中有两个主要部分。
相关文章: 什么是电脑病毒?
第一部分是 string:
用于定义变量。在本例中,变量的类型是字符串。如果我们有不同类型的变量,可能不止一个部分。
第二部分是 condition:
我们定义逻辑以匹配预期数据。例如,在这个示例规则中,如果存在两个字符串数据中的一个,我们希望匹配它们。
关键词
与其他编程语言一样,Yara为规则定义保留了关键字。此关键字不能用作变量或其他用户定义的东西。
全部的 | 和 | 任何 | ascii码 | 在 | 条件 | 包含 |
入口点 | 假 | 文件大小 | 全字 | 对于 | 全球的 | 在里面 |
进口 | 包括 | 国际8 | 国际16 | 国际32 | int8be公司 | int16be型 |
int32be型 | 比赛 | 元 | 无酶 | 不 | 或 | 属于 |
私有的 | 规则 | 串 | 他们 | 是的 | 单位8 | 单元16 |
uint32公司 | uint8be公司 | uint16be公司 | uint32be公司 | 宽的 |
评论
在一个大项目中,会有很多规则,我们需要记住并记录这些规则,而不是影响规则。注释用于记录规则文件或不在规则文件中使用。
有两种类型的评论;
-
Single Line
注释仅用于注释当前行。//
用于指定单行注释。 -
Multi Line
注释将换行,其中/*
指定开始和结束时间*/
指定的结束。这些分隔符之间的文本都是注释。
//Single line commen/*Multi line comments*/
串
现在我们将开始定义要在规则中使用的变量和数据。最常用的变量之一是字符串。我们可以设置一个字符串值并在二进制文件中查找它。
我们要找绳子 putty
在 putty.exe
遵循以下规则。我们设置规则名称 name_putty
.
rule name_putty { strings: $pname="putty" condition: $pname }
如果我们像下面这样运行规则,则规则将匹配条件并用二进制名称打印规则名称。
$ yara myrule putty.exe
正则表达式或正则表达式
yara规则最常见的用法之一是使用regex。Regex提供了定义一般或类似数据结构的灵活性。
相关文章: 如何在Linux、Ubuntu、Debian、Mint、Kali、Fedora、CentOS、RHEL中安装和使用ClamAV杀毒软件
在这个例子中,我们将看到如下字符串 p*tty
. 我们将使用通配符 *
. 这可以是字母数字字符。
rule name_putty { strings: $pname=/p[0-9a-zA-Z]tty/ condition: $pname }
这里我们具体说明
文件大小
文件大小 是写规则的另一个因素。我们可以使用如下运算符检查文件大小 <
, >
, =
提供如下尺寸。
-
KB
对于KB -
MB
兆字节
在本例中,我们将把大小条件指定为更高 比 500KB
通过使用 filesize
关键字。
rule name_putty { strings: $pname=/p[0-9a-zA-Z]tty/ condition: $pname and filesize > 500KB }
如果我们运行这个示例,规则将匹配,因为我们有两个条件,第一个条件是文件名,第二个条件是 一是尺寸
访问数据
我们检查了文件中的字符串或文件的大小。这些是有用的,但不足以完整的恶意软件分析。恶意软件通常在相关内存范围内有一些特征码。我们需要访问这些内存范围中的数据。我们将提供地址和数据,我们要检查以下关键字。
int8()int16( )int32( )uint8( )uint16( )uint32( )int8be( )int16be( )int32be( )uint8be( )uint16be( )uint32be( )
例如,在本例中,我们将检查给定的文件是否是 Portable Executable
(PE)文件。
rule ThisIsPE { 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 }
当我们用这个规则运行文件时,我们将得到 ThisIsPE
在下面的控制台中。我们已将此规则另存为 rule2.yara
全局规则
在恶意软件分析过程中,我们需要一些无法定义的通用规则。我们称之为全局规则,并影响此运行中的所有规则。我们将简单地把 global
全局规则的关键字start如下所示。
global rule SizeLimit{ condition: filesize < 2MB}
私人规则
Yara提供了类似于继承的特性来创建基本规则和创建继承这些基本规则的超级规则。在这种情况下,我们可以使用 private
规则定义前的关键字。我们将使用私有规则构建其他规则的构件。
private rule PrivateRuleExample{ ...}
规则标签
在打印匹配规则时使用标记以进行筛选。它们对匹配没有影响。标签计数没有限制。在本规则中 Foo
, Bar
和 Baz
是规则的标签。
rule TagsExample1 : Foo Bar Baz{ ...}rule TagsExample2 : Bar{ ...}
元数据
我们可能需要指定有关规则的其他信息。我们可以用 metadata
为了这份工作。我们将用 meta:
关键字如下。
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}
模块
模块是YARA的扩展。我们可以使用一些模块,比如 PE
或 Cuckoo
那些是雅拉的。 我们也可以自己写 模块也是。模块可以通过 import
声明。
相关文章: 如何使用Applocker保护Windows免受恶意软件和不需要的可执行文件的攻击?
在本例中,我们将导入并使用 PE
模块。
import "pe"rule Test{ strings: $a = "some string" condition: $a and pe.entry_point == 0x1000}
包括其他文件
我们可以包含其他规则文件 include
关键字。我们将在下面的示例中简单地包括其他yara规则文件。我们可以使用相对或绝对路径没有问题。
include "/home/poftut/basics.yara"