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 |
关键字解释:
rule:规则标识
strings:字符串区域
condition:条件区域
字符串末尾标注的关键字:
nocase:表示匹配大小写
wide:表示是宽字节
ascii:表示是ASCII码
fullword:表示匹配单个词组文本字符串
//
:单行注释
/**/
:多行注释
$
:字符串定义
#
:表示字符串在文件或内存中出现的次数
condtion:
#a == 1 or #b > 4 and #c < 6 //a出现1次或b大于四次且c小于6次
at
:表示字符串在文件中的偏移量条件或虚拟地址的条件
condition: $a at 100 and $b at 0x004C0000 and $c at 300 //a的地址为100且b的地址为0x004C00000且c的地址为300
in
:表示文件偏移范围
condition:
$a in(1..100) //a的地址在1与100之间
filesize
:表示文件大小(单位是字节)
condition:
filesize > 200KB//表示匹配文件大小大于200kb的文件
entrypoint
:表示文件入口点,适用于PE和ELF,也适用在运行进程
string:
$a = {E8 00 00 00}
condition:
$a at entrypoint //匹配文件入口点为E8 00 00 00的文件
uin
和int
:访问文件偏移和访问内存虚拟地址,intx,x可以是8、16、32,uin读取的是无符号整数,int读取的是有符号整数,默认读取的是小端
condition:
// MZ
uint16(0) == 0x5A4D and
// PE
uint32(uint32(0x3C)) == 0×00004550
global rule
:全局规则,优先级最高
private rule
:私有规则,进行匹配时不会输出任何匹配信息
rule TagRule
:仅输出用户感兴趣的匹配结果
rule TagRule : dummy1 dummy 2
{
strings:
$a = "dummy1"
$b = "dummy2"
condition:
$a and $b
}
of
:集合
condtion:
2 of ($a,$b,$c) //当abc中有两个字符串存在于文件时,表示匹配
符号:
??
:匹配一字节未知数
?
:匹配半字节未知数
[4-6]
:跳转,该跳转指示4-6个字节的任意序列可以占据跳转的位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGCLD4f1-1584786924950)(index_files/3ce98492-d89a-4771-b81c-1b1a21454e1f.png)]
\"
:双引号
\\
:反斜杠
\t
:制表符
\n
:换行符
\xdd:
16进制表示
语法说明:
1.规则声明以rule
标识
2.规则以字母、数字、下划线组成,字符串首字符不能是数字,单条描述不超过128字符
3.条件区域必须存在,字符串区域可有可无
4.字符串区域的每条规则由$开头的字符串定义
5.字符串规则使用""
,十六进制规则使用{}
6.条件区域的字符串表达式的表述方式为布尔型变量,结果只有True和False
7.接受正则表达式
使用记事本编写,则需要在使用YARA规则匹配前去除BOM(用vi编辑并使用“set nobomb”可以去除BOM),否则会提示“error:non-ascii character”
在命令行下使用YARA进行规则匹配后,若目标文件或进程符合规则,则输出“<规则文件名> <目标文件名>”,否则无任何输出
-n
:反转输出提示,匹配时无输出,不匹配时有输出