一、安装
官方文档(含python调用yara):https://yara.readthedocs.io/en/v4.1.1/gettingstarted.html
开源yara规则库:https://github.com/Yara-Rules/rules
bash;gutter:true;
git clone https://github.com/VirusTotal/yara.git</p>
<p>cd yara
./bootstrap.sh
./configure
make
最后可以看到安装到的路径,不配置默认应该是/usr/local/bin
sudo make install</p>
<pre><code>
## 二、规则的基本写法
将如下结果保存为test_rule.yar:
</code></pre>
<p>/<em>
块注释
https://yara.readthedocs.io/en/v4.1.1/writingrules.html
</em>/</p>
<p>// 行注释
// rule_name为设置的规则名
// rule_tag为规则标签,方便后边设置只启用隶属某个tag的规则集;可省略(冒号和tag一起)
rule rule_name1 : rule_tag1 rule_tag2
{
// 一条规则一般由strings + condition组成,meta节区可省略</p>
<pre><code>// meta节区主要用于放置一些备注、规则说明,并不用于实际匹配
meta:
rule_desc = "this just a rule comment."
// 基础规则一般有十六进制字符串、字符串、正则三种类型
strings:
// 其中十六进字符串内也可以用正则,但匹配元素只能是十六进制字符
// $hex_string = { E2 34 A1 C? 23 FB }
$text_string = "root"
// 虽然yara不再使用PCRE库,但支持的正则写法和PCRE基本一致
// $re_string = /md5: [0-9a-fA-F]{32}/
// 配置条件。由基础规则进行逻辑运算而得,运算结果为true则命中,为false则未命中
condition:
$text_string
</code></pre>
<p>}</p>
<p>// 一个文件内可以写多个规则,但rule_name不要重复
rule rule_name2
{
//
condition:
false
}</p>
<pre><code>
## 三、命令行使用
上边我们写了一个规则文件,按rule_name1这条规则的condition,只要被审查文件中出现"md5: 加空格 加一个md5值"的字符串就会命中。
我们来准备一个会命中和一个不会命中的文件,然后看实际如何使用yara及命不命中会是什么现像。
</code></pre>
<p>使用test_rule.yar中的规则去匹配/etc/passwd文件的内容
/etc/passwd有root字符串,会打印出匹配的规则,即rule_name1
yara test_rule.yar /etc/passwd</p>
<p>可以使用-s参数打印出具体匹配的位置
yara -s test_rule.yar /etc/passwd</p>
<p>/etc/profile没有root字符串,没有匹配的规则,什么都不会打印
yara test_rule.yar /etc/profile</p>
<pre><code>
![Yara安装使用教程](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/1116722-20210811170545049-1005925754.png)
## 四、通过python调用yara
python调用yara我们可以通过python执行系统命令的方式调用,但这种方式比较丑,建议还是通过作者提供的yara-python库去调用(虽然我们还是得先安装yara)。
</code></pre>
<p>pip install yara-python</p>
<pre><code>
### 4.1 匹配字符串
</code></pre>
<p>import yara</p>
<p>编译规则
当规则文件编写有语法错误时,compile会报错,但不会具体指出是哪一行出了什么错
此时建议用命令行来查看具体错误。如yara ./test_rule.yar /etc/passwd
rules = yara.compile(filepath='./test_rule.yar')
使用data参数来指定要匹配的字符串
matches = rules.match(data="root:toor")
matches是一个匹配的规则名对象列表,形如[rule_name1]
print(matches)
对象属性包括rule/namespace/tags/meta/strings
print(f"{matches[0].rule}--{matches[0].strings}")</p>
<pre><code>
![Yara安装使用教程](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/1116722-20210811171627299-108347365.png)
### 4.2 匹配文件
</code></pre>
<p>import yara</p>
<p>编译规则
当规则文件编写有语法错误时,compile会报错,但不会具体指出是哪一行出了什么错
此时建议用命令行来查看具体错误。如yara ./test_rule.yar ./be_test_file1.txt
rules = yara.compile(filepath='./test_rule.yar')</p>
<p>匹配文件可以是文本文件
使用filepath来指定要进行匹配的文件,由于filepath是第一个参数所以也可以省略
matches = rules.match(filepath='/etc/passwd')
matches是一个命中的规则对象列表
print(matches)
print(f"{matches[0].rule}--{matches[0].strings}")</p>
<p>匹配文件也可以是二进制文件
使用filepath来指定要进行匹配的文件,由于filepath是第一个参数所以也可以省略
matches = rules.match('/usr/bin/passwd')
print(matches)
print(f"{matches[0].rule}--{matches[0].strings}")</p>
<pre><code>
![Yara安装使用教程](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/1116722-20210811172146654-1101259413.png)
### 4.3 即时处理
上边的rules.match()返回的只是一个命中的规则对象列表,我们可以对他进行处理;但有时我们可能想完成一条规则匹配就进行处理,这可借助回调函数实现。
</code></pre>
<p>import yara</p>
<p>编译规则
rules = yara.compile(filepath="./test_rule.yar")</p>
<p>回调函数,默认一
def match_callback(data):
"""</p>
<pre><code>:param data: {
'matches': False, # 表示该条规则是否有匹配内容
'rule': 'rule_name2', # 该条规则规则名
'namespace': 'default',
'tags': [], # 该条规则所属标签
'meta': {}, # 该条规则的meta节区内容
'strings': [] # 该条规则匹配的内容列表
}
:return:
</code></pre>
<p>"""
# 打印匹配信息
print(data)
# 指示程序继续进行
return yara.CALLBACK_CONTINUE</p>
<p>filepath--要进行匹配的文件。可以是文本文件,也可以是二进制文件
callback--回调函数,默认匹配完一条规则回调一次
which_callbacks--回调函数过滤参数,yara.CALLBACK_ALL(默认)、yara.CALLBACK_MATCHES(规则有匹配回调)、
yara.CALLBACK_NON_MATCHES(规则不匹配时回调)
matches = rules.match(filepath='/etc/passwd', callback=match_callback, which_callbacks=yara.CALLBACK_ALL)
还是一样,matches只是最终的匹配规则名列表
print(matches)
Original: https://www.cnblogs.com/lsdb/p/14977924.html
Author: 诸子流
Title: Yara安装使用教程
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552594/
转载文章受原作者版权保护。转载请注明原作者出处!