YARA:第二章-字符串之十六进制字符串(一)

1.简介

        Yara规则很容易编写和理解,它的语法很像C语言。下面是一个简单的YARA规则,且此条规则不检测任何信息。

rule dummy
{
    condition:
        false
}

        Yara规则的编写始于"rule"关键字,随后是规则的标识符(rule identifier)。这个标识符遵循C语言的命名规则,允许使用字母、数字、下划线,但不允许以数字开头。同时,标识符对大小写敏感,并且其长度不得超过128个字符。

        规则通常由两部分组成:字符串块(strings block)条件块(condition block)。如果规则不依赖于任何字符串,则可以省略字符串块部分,但条件块总是必需的。字符串块中包含至少一个字符串。每个字符串都有一个标识符(string identifier),由一个$字符开始,后跟一串字母数字字符和下划线组成,这些标识符可以在条件部分中用来引用相应的字符串。字符串可以以文本或十六进制形式定义,如下例所示:

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
}

        "rule"关键字标识着规则开始,ExampleRule是规则标识符。

        "string:"标识着字符串块开始,后面包含两个字符串规则,分别是$my_text_string和$my_hex_string。

        "condition"标识着条件快开始,后面包含条件规则。

2. 字符串块

        在YARA中,有三种类型的字符串:十六进制字符串文本字符串正则表达式。十六进制字符串用于定义原始的字节序列,而文本字符串和正则表达式则适用于定义可读文本的部分。

2.1 十六进制(Hex Strings)

        下面是一个包含十六进制字符串规则的示例。字符串标识符 $hex_string 代表的是一个十六进制规则,其内容由花括号{}包裹,并且其中的十六进制数值以空格分隔。

rule WildcardExample
{
    strings:
        $hex_string = { Aa Bb Cc Dd Ee }

    condition:
        $hex_string
}

        十六进制字符串支持4个特殊的字符,分别是"~"、"?"、"[]"、"()"。

        其中"?"类似于通配符,用于表示任何值(0~F)。示例如下:

rule WildcardExample
{
    strings:
        $hex_string = { E2 34 ?? C8 A? FB }  // 其中?可以表示任何值。

    condition:
        $hex_string
}

        其中"~"表示否定的意思。示例如下:

rule NotExample
{
    strings:
        // 这里~00表示匹配时,第三个字节不能为00
        $hex_string = { F4 23 ~00 62 B4 }   
        // 这里~?0表示匹配时,第三个字节不能为后四比特为0的值
        $hex_string2 = { F4 23 ~?0 62 B4 } 
    condition:
        $hex_string and $hex_string2
}

        其中"[]"适用于表示字节数量不确定,当不确定所匹配块长度,但是清楚部分关键字时可以使用。示例如下:

rule JumpExample
{
    strings:
        // [4-6]表示中间有4-6个字节长度的任意数据。
        $hex_string1 = { F4 23 [4-6] 62 B4 }
        // [4]表示中间有4个字节长度的任意数据。
        $hex_string2 = { F4 23 [4] 62 B4 }
        // [4-4]表示中间有4个字节长度的任意数据。
        $hex_string3 = { F4 23 [4-4] 62 B4 }
        // [4-]表示中间有至少有4个字节的数据,或者更多。
        $hex_string4 = { F4 23 [4-] 62 B4 }
        // [-]等价于[0-]]表示中间有任意多字节数据,或者没有。
        $hex_string5 = { F4 23 [-] 62 B4 }
        
    condition:
        $hex_string
}

        其中"()"包含或的概念。示例如下:

rule AlternativesExample1
{
    strings:
        // 表示从第三字节开始,可以是62 B4或者56中的任意一个。
        $hex_string1 = { F4 23 ( 62 B4 | 56 ) 45 }
        // "()"中可以包含其它字符,如"?"。
        $hex_string2 = { F4 23 ( 62 B4 | 56 | 45 ?? 67 ) 45 }
    condition:
        $hex_string
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_只道当时是寻常

打赏不得超过工资的一半呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值