yara规则--编写

news2024/11/15 11:48:38
编写 YARA 规则 — yara 4.2.0 文档
YARA规则易于编写和理解,并且它们的语法是 类似于 C 语言。这是您可以编写的最简单的规则 YARA,它什么都不做:
rule dummy
{
    condition:
        false
}

一、规则标识符

每个规则都以关键字“ rule”开头,后面跟着一个规则标识符。标识符必须遵循与C语言相同的词法约定,标识符命名有如下要求:
  • 英文字母、数字、下划线组成的字符串
  • 第一个字符不能是数字
  • 对大小写敏感
  • 不能超出128个字符长度
以下关键字是保留的,不能用作规则标识符:

二、注释

// 单行注释
/*
   多行注释
*/

三、字符串

Yara中有三种类型的字符串:

3.1、十六进制字符串

定义原始字节序列
// 通配符?:可以代替某些未知字节,与任何内容匹配
rule WildcardExample
{
    strings:
       // 使用‘?’作为通配符
       $hex_string = { 00 11 ?? 33 4? 55 }
    condition:
       $hex_string
}

这个规则可以匹配下面的两个字符串:

00 11 01 33 43 55
00 11 AA 33 4N 55
// 跳转:可以匹配长度可变的字符串
rule JumpExample
{
        strings:
           // 使用‘[]’作为跳转,与任何长度为0-2字节的内容匹配
           $hex_string1 = { 00 11 [2] 44 55 }
           $hex_string2 = { 00 11 [0-2] 44 55 }
           // 该写法与string1作用完全相同
           $hex_string3 = { 00 11 ?? ?? 44 55 }
        condition:
           $hex_string1 and $hex_string2
}
这个规则可以匹配下面的两个字符串:
00 11 01 22 44 55
00 11 AA 44 55
// 匹配无限长的字符串
rule BuzzLightyear
{
    strings:
        $hex_string = { F4 23 [-] 62 B4 }
    condition:
        $hex_string
}
这个规则可以匹配下面的两个字符串:
F4 23 AA FF 62 B4
F4 23 AA AA AA AA AA...FF FF 62 B4
// 也可以使用类似于正则表达式的语法
rule AlternativesExample1
{
    strings:
       $hex_string = { 00 11 ( 22 | 33 44 ) 55 }
    condition:
       $hex_string
}
可以匹配以下内容:
00 11  22  55
00 11  33 44  55
// 还可以将上面介绍的方法整合在一起用
rule AlternativesExample2
{
    strings:
       $hex_string = { 00 11 ( 33 44 | 55 | 66 ?? 88 ) 99 }
    condition:
       $hex_string
}
这个规则可以匹配下面的三个字符串:
00 11 33 44 99
00 11 55 99
00 11 66 AG 88 99

3.2、文本字符串

定义可读文本的部分。
转义符:
    \"        双引号
    \\        反斜杠
    \t        制表符
    \n        换行符
    \xdd      十六进制的任何字节
修饰符:
    nocase:  不区分大小写
    wide:      匹配2字节的宽字符, 这种宽字符串在许多二进制文件中都有出现
    ascii:      匹配1字节的ascii字符
    xor:        匹配异或后的字符串
    fullword: 匹配完整单词,用于匹配那些前后没有附加其他字符的单词
    private:  定义私有字符串
 
rule CaseInsensitiveTextExample
{
    strings:
        // 不区分大小写
        $text_string = "foobar" nocase

        // 匹配宽字符串
        $wide_string = "Borland" wide

        // 同时匹配2种类型的字符串
        $wide_and_ascii_string = "Borland" wide ascii

        // 匹配所有可能的异或后字符串
        $xor_string = "This program cannot" xor

        // 匹配所有可能的异或后wide ascii字符串
        $xor_string = "This program cannot" xor wide ascii

        // 限定异或范围
        $xor_string = "This program cannot" xor(0x01-0xff)

        // 全词匹配(匹配:www.domain.com  匹配:www.my-domain.com  不匹配:www.mydomain.com)
        $wide_string = "domain" fullword

        // 私有字符串可以正常匹配规则,但是永远不会在输出中显示
        $text_string = "foobar" private

    condition:
        $text_string
}

3.3、正则表达式

定义可读文本的部分。
yara规则允许使用正则表达式, 不过要用正斜杠而非双引号括起来使用(像Perl编程那样)
rule RegularShow
{
    strings:
        $re1 = /md5: [0-9a-fA-F]{32}/
        $re2 = /state: (on|off)/
    condition:
        $re1 and $re2
}
该规则将捕获任何状态下找到的所有md5字符串。
你也可以在正则表达式中使用文本修饰符, 如nocase,ascii,wide和fullword。

四、条件表达式

你可以在条件表达中使用如下运算符:

all any them

all of them // 匹配规则中的所有字符串
any of them // 匹配规则中的任意字符串
all of ($a*) // 匹配标识符以$a开头的所有字符串
any of ($a,$b,$c) // 匹配a, b,c中的任意一个字符串
1 of ($*) // 匹配规则中的任意一个字符串

#

// 匹配字符串在文件或内存中出现的次数
rule CountExample
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
    condition:
        //a字符串出现6次,b字符串大于10
        #a == 6 and #b > 10
}

@

//可以使用@a[i],获取字符串$a在文件或内存中,第i次出现的偏移或虚拟地址
//小标索引从1开始,并非0
//如果i大于字符串出现的次数,结果为NaN(not a number 非数值)

//可以使用!a[i],获取字符串$a在文件或内存中,第i次出现时的字符串长度
//下标索引同@一样都是从1开始
//!a 是 !a[1]的简写

at

// 匹配字符串在文件或内存中的偏移
rule AtExample
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
    condition:
        // ab字符串出现在文件或内存的100200偏移处
        $a at 100 and $b at 200
}

in

// 在文件或内存的某个地址范围内匹配字符串
rule InExample
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
    condition:
        $a in (0..100) and $b in (100..filesize)
}

filesize

// 使用关键字匹配文件大小
rule FileSizeExample
{
    condition:
       // filesize只在文件时才有用,对进程无效
       // KB MB后缀只能与十进制大小一起使用
       filesize > 200KB
}

entrypoint

// 匹配PEELF文件入口点(高版本请使用PE模块的pe.entry_point代替)
rule EntryPointExample1
{
    strings:
        $a = { E8 00 00 00 00 }
    condition:
       $a at entrypoint
}
rule EntryPointExample2
{
    strings:
        $a = { 9C 50 66 A1 ?? ?? ?? 00 66 A9 ?? ?? 58 0F 85 }
    condition:
       $a in (entrypoint..entrypoint + 10)
}

of

// 匹配多个字符串中的某几个
rule OfExample1
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
        $c = "dummy3"
    condition:
        // 3个字符串只需匹配任意2
        2 of ($a,$b,$c)
}

for xxx of xxx :(xxx)

功能:对多个字符串匹配相同的条件
格式:for AAA of BBB : ( CCC )
含义:
在BBB字符串集合中,至少有AAA个字符串,满足了CCC的条件表达式,才算匹配成功。
在CCC条件表达式中,可以使用'$'依次代替BBB字符串集合中的每一个字符串。
// for..of其实就是of的特别版,所以下面2个例子作用相同
any of ($a,$b,$c)
for any of ($a,$b,$c) : ( $ )
// abc这3个字符串集合中,至少有1个字符串,必须满足字符串内容与entrypoint相同的条件。$表示集合中的所有字符串. 本例中, 它是字符串$a, $b和$c.
for 1 of ($a,$b,$c) : ( $ at entrypoint  )
for any of ($a,$b,$c) : ( $ at entrypoint  )
// 所有字符串,在文件或内存中出现的次数必须大于3,才算匹配成功。
for all of them : ( # > 3 )
// 所有以$a开头的字符串,在文件或内存中第2次出现的位置必须小于9
for all of ($a*) : (@[2] < 0x9)

引用其它规则

rule Rule1
{
    strings:
        $a = "dummy1"
    condition:
        $a
}
rule Rule2
{
    strings:
        $a = "dummy2"
    condition:
        $a and Rule1
}

全局规则

// 全局规则(global rule)可以在匹配其他规则前优先筛选
// 比如在匹配目标文件之前需要先筛选出小于2MB的文件,在匹配其他规则
global rule SizeLimit
{
    condition:
        filesize < 2MB
}

私有规则

//私有规则(private rule)可以避免规则匹配结果的混乱
//比如使用私有规则进行匹配时,YARA不会输出任何匹配到的私有规则信息
//私有规则单独使用意义不大,一般可以配合"引用其它规则"的功能一起使用。比如为了判断文件是否恶意, 有这样一条私有规则, 要求文件必须是ELF文件. 一旦满足这个要求, 随后就会执行下一条规则. 但我们在输出里想看的并不是该文件它是不是ELF, 我们只想知道文件是否恶意, 那么私有规则就派上用场了.
//私有规则也可以和全局规则一起使用,只要添加“Private”、“global”关键字即可
private rule PrivateRuleExample
{
    ...
}

规则标签

// 规则标签,可以让你在YARA输出的时候只显示你感兴趣的规则,而过滤掉其它规则的输出信息(yara -t tagname
// 你可以为规则添加多个标签
rule TagsExample1 : Foo Bar Baz
{
    ...
}
rule TagsExample2 : Bar
{
    ...
}

导入模块

// 使用“import”导入模块
// 你可以自己编写模块,也可以使用官方或其它第三方模块
// 导入模块后,就可以开始使用模块导出的变量或函数
import "pe"
import "cuckoo"
pe.entry_point == 0x1000
cuckoo.http_request(/someregexp/)

外部变量

// 外部变量允许你在使用YARA -d命令时指定一个自定义数据
// 外部变量可以是int, str或boolean类型
// ext_var是一个外部变量, 它在运行时会分配有一个值
rule ExternalVariableExample2
{
    condition:
       ext_var == 10
}
/* 外部变量可以和操作符contains和matches一起使用
contains:如果字符串包含指定的子字符串,返回True
matches 如果字符串匹配给定的正则表达式时,返回True
*/
rule ExternalVariableExample3
{
    condition:
        string_ext_var contains "text"
}
rule ExternalVariableExample4
{
    condition:
        string_ext_var matches /[a-z]+/
}
// 也可以将matches操作符和正则表达式一起使用
rule ExternalVariableExample5
{
    condition:
        // [a-z]+/is中的i表示匹配时不区分大小写. s表示是在单行(single line)模式
        string_ext_var matches /[a-z]+/is
}

文件包含

// 作用于C语言一样,可以包含其它规则到当前文件中
include "other.yar"
// 相对路径
include "./includes/other.yar"
include "../includes/other.yar"
// 全路径
include "/home/plusvic/yara/includes/other.yar"

五、参考

编写 YARA 规则 — yara 4.2.0 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成功案例丨Fortinet为跨国汽配制造企业打造典型安全SD-WAN网络

某国际化汽车配件制造企业&#xff08;以下简称某企业&#xff09;为解决跨国数据传输难、单一网络费用贵等痛点&#xff0c;决定采用SD-WAN这一新的组网形式。Fortinet携手中企通信为其打造组网高效、云网一体化、集中管理和编排的安全SD-WAN网络&#xff0c;通过精准流量和应…

数据库实验 | 第5关:使用游标的存储过程

任务描述 本关任务&#xff1a; jdxx数据表有四个字段&#xff0c;分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。 例如&#xff0c;查询天心区(qxmc)的所有字段的值结果如图所示 任务要求 建立存储过程 tjdq(in sf varchar(10)) 输入省份的名称&#xff0c;将该省份…

创建web项目-----idea

创建项目 file—new—projiect java enterprise—next next 修改项目名字&#xff0c;finish 在此窗口打开新建的项目&#xff0c;选择this Window 新建好项目后是这样子的 配置项目的tomcat环境 file—project structure project 配置jdk和编译输入目录 libraries配…

【数据结构与算法】图像——四叉树自适应模糊(ppm图像为例)

源于大作业~~ 目录 前言 一、实现算法 二、结果展示 三、算法框架 (1) QuadTreeNode.h (2) 结点扩展、细化模糊层次 (3) 模糊化图像四叉树转为图像 (4) 主函数代码 四、说明 五、结语 前言 一张图片常常会存在空间冗余&#xff0c;即一大部分区域的色彩值相同&am…

Node.js二:fs模块

一.fs模块概述 2.fs异步写入 /*** 新建一个文件夹&#xff0c;座右铭.txt&#xff0c;写入内容三人行必有我师焉*///1.导入fs模块 const fs require(fs);//2.写入文件 fs.writeFile(./座右铭.txt,三人行必有我师焉,err >{//err写入失败&#xff1a;错误对象&#xff0c;写…

搭建CDH错误记录(踩坑无数)

搭建CDH流程记录 如何搭建本地yum源 1.配置yum源这里使用 阿里源 http://mirrors.aliyun.com/repo/Centos-7.repo wget http://mirrors.aliyun.com/repo/Centos-7.repo2.安装http软件 yum install httpd -y3.配置httpd.conf vi /etc/httpd/conf/httpd.conf在 AddType appli…

【社区图书馆】vue的生命周期

目录 vue的生命周期 生命周期流程 Init Events & Lifecycle beforeCreate Init injections & reactivity created beforeMount Create vm $el and replace ‘el’ with it mounted beforeUpdate Virtual Dom re-render and patch updated beforeDestroy vm…

python+vue 大学生社团管理系统

本系统分为学生&#xff0c;管理员&#xff0c;社团负责人三个角色&#xff0c;学生可以注册登陆系统&#xff0c;查看社团&#xff0c;申请入团&#xff0c;查看参加社团活动&#xff0c;查看社团新闻&#xff0c;社团负责人对社团信息&#xff0c;入团审核&#xff0c;社团新…

Opencv+Python笔记(五)图像阈值化处理

图像阈值化可以理解为一个简单的图像分割操作&#xff0c;阈值又称为临界值&#xff0c;它的目的是确定出一个范围&#xff0c;然后这个范围内的像素点使用同一种方法处理&#xff0c;而阈值之外的部分则使用另一种处理方法或保持原样。 阈值处理有2种方式&#xff0c;一种是固…

ijkplayer解码流程源码解读

ijkplayer是一款基于ffmpeg的在移动端比较流行的开源播放器。FFmpeg是一款用于多媒体处理、音视频编解码的自由软件工程&#xff0c;采用LGPL或GPL许可证。 要想理解ijkplayer源码&#xff0c;首先得知道视频播放器的基本原理。 视频播放器播放一个互联网上的视频文件&#xf…

win10怎么录屏幕视频带声音?有哪些需要注意的地方?

随着科技的不断发展&#xff0c;屏幕录制已成为常见的工具之一。在Win10系统中&#xff0c;录制屏幕视频带声音也变得越来越简单。本文将指导您如何在Win10上实现录制屏幕视频带声音&#xff0c;并介绍一些需要注意的地方。 需要用到的工具和步骤 在Win10系统中&#xff0c;自…

【u盘提示:驱动器未格式化】如何解决?

u盘虽然使用很方便&#xff0c;可随时拷贝资料到任何有电脑的地方&#xff0c;但它的问题也是比较多的&#xff0c;其中u盘提示驱动器未格式化故障最让人心虚&#xff0c;因为已经无法打开u盘了&#xff0c;里面的资料怎么办&#xff0c;很重要的怎么办&#xff0c;所以今天就教…

OAuth2.0 实战总结

title: OAuth2.0 实战总结 date: 2023-01-30 11:23:12 tags: OAuth2.0 categories:开发技术及框架 cover: https://cover.png feature: false 1. 引言 1.1 OAuth 2.0 是什么&#xff1f; 用一句话总结来说&#xff0c;OAuth 2.0 就是一种授权协议。那如何理解这里的“授权”…

前端调试技巧

前端工作中&#xff0c;不仅编码很重要&#xff0c;重现bug&#xff0c;解决bug的能力同样重要。而这些都离不开代码调试。本文就一些调试技巧做出总结&#xff0c;不足之处&#xff0c;欢迎大家多多补充。 PC调试 console.log() 在你觉得有问题的代码处&#xff0c;加上一句 …

基于HFSS软件24GHz雷达天线设计

前言&#xff1a;近年来&#xff0c;我国的汽车保有量不断增加&#xff0c;汽车交通事故引发的财产损失和人 员伤亡也在不断增加。为了有效减少交通事故发生&#xff0c;车载雷达得到了各大汽车厂商和各个研究机构的普遍重视。现在国际上主要国家都把 24GHz 和 77GHz 两个频段分…

解决谷歌翻译不能使用的问题

今天登录国外网站&#xff0c;发现谷歌翻译已无法正常使用&#xff0c;网上最多的方法就是更改host文件&#xff0c;在host内增加ip地址&#xff0c;但是经常失效&#xff0c;经常手动更改增加ip着实烦恼&#xff0c;还有可能有别的错误。 最终解决方式是&#xff1a;登录GitH…

新版本ProPhet时间序列预测1:模型解释和安装和初步使用

ProPhet时间序列预测1安装和初步使用 安装pip安装conda安装 Prophet模型使用读取数据将数据处理为ds和y两列看下数据的分布模型训练预测可视化预测结果可视化趋势、假期、每周、季节性、年度季节性的回归图1.0之前模型保存 安装 安装1.0版本之后: 区别: 1.0版本叫prophet <…

设计模式-行为型模式之策略模式

5. 策略模式 5.1. 模式动机 完成一项任务&#xff0c;往往可以有多种不同的方式&#xff0c;每一种方式称为一个策略&#xff0c;我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在软件开发中也常常遇到类似的情况&#xff0c;实现某一个功能有多个途径&#x…

【原理图专题】如何把PCB元件位号重排并反标到原理图

在画原理图时我们有时会复制以前项目或其他项目已经现成的模块进行电路的搭建。但可能会遇到一个问题,就是复制过来后位号也跟着过来了。比如说一个板子可能只有100个元件,但是会出现位号上千的元件。这对于后面我们焊接、维修等都很不利。 那可能有人会问,我直接在画完原理…

Redis持久化机制导致服务自启动后恢复数据过长无法使用以及如何关闭

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客 在上面搭建前后端分离的项目后&#xff0c;如果需要在windows服务上进行部署。 若依前后端分离版本&#xff0c;Windo…