日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
YARA——惡意軟件模式匹配利器

YARA是一款旨在幫助惡意軟件研究人員識(shí)別和分類惡意軟件樣本的開(kāi)源工具(由virustotal的軟件工程師Victor M. Alvarezk開(kāi)發(fā)),使用YARA可以基于文本或二進(jìn)制模式創(chuàng)建惡意軟件家族描述信息,當(dāng)然也可以是其他匹配信息。

YARA的每一條描述或規(guī)則都由一系列字符串和一個(gè)布爾型表達(dá)式構(gòu)成,并闡述其邏輯。YARA規(guī)則可以提交給文件或在運(yùn)行進(jìn)程,以幫助研究人員識(shí)別其是否屬于某個(gè)已進(jìn)行規(guī)則描述的惡意軟件家族。比如下面這個(gè)例子:

rule silent_banker : banker
{
    meta:
        description = "This is just an example"
        thread_level = 3
        in_the_wild = true
    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"
    condition:
        $a or $b or $c
}

以上規(guī)則告訴YARA任何包含有$a、$b、$c字符串的文件都被標(biāo)識(shí)為slient_banker。這僅僅是一個(gè)簡(jiǎn)單的例子,YARA的規(guī)則可以復(fù)雜和強(qiáng)大到支持通配符、大小寫(xiě)敏感字符串、正則表達(dá)式、特殊符號(hào)以及其他特性。

一、YARA規(guī)則編寫(xiě)

YARA規(guī)則的標(biāo)識(shí)符類似于C語(yǔ)言結(jié)構(gòu),其規(guī)則聲明以rule標(biāo)識(shí),在規(guī)則描述中可以包括字母、數(shù)字甚至下劃線字符,但字符串第一個(gè)字符不能是數(shù)字,且單條描述不能超過(guò)128個(gè)字符。和C語(yǔ)言一樣,YARA規(guī)則也有關(guān)鍵字:

YARA規(guī)則由字符串區(qū)域和條件區(qū)域兩部分組成,其中條件區(qū)域必須存在,字符串區(qū)域則可有可無(wú),比如不依賴任何字符串的規(guī)則:

rule Dummy

    condition:
        false
}

字符串區(qū)域中的每條規(guī)則都由$開(kāi)頭的字符串定義,其規(guī)則內(nèi)容可以是字符形式或十六進(jìn)制形式,所定義的字符串由條件區(qū)域引用:

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
}

與C語(yǔ)言一樣,字符串規(guī)則使用雙引號(hào),而十六進(jìn)制規(guī)則使用大括號(hào)引用,每個(gè)十六進(jìn)制數(shù)字之間用空格間隔,且十進(jìn)制數(shù)字不允許出現(xiàn)在十六進(jìn)制規(guī)則中。

條件區(qū)域決定YARA規(guī)則的邏輯,因此該區(qū)域的描述必須包含布爾型表達(dá)式,以判別目標(biāo)文件或進(jìn)程是否滿足該規(guī)則。通常條件內(nèi)容都會(huì)引用字符串區(qū)域中的字符串定義,比如上例中的$my_text_string和$my_hex_string。條件區(qū)域的字符串表述方式為布爾型變量,若文件或進(jìn)程內(nèi)存符合字符串表達(dá)式則其結(jié)果為T(mén)rue,否則即為False。

注釋方式

YARA規(guī)則的注釋方式和類C語(yǔ)言一樣,可以用//進(jìn)行單行注釋,也可以用/**/進(jìn)行多行注釋。

/*
This is a multi-line comment …
*/
rule CommentExample // … and this is single-line comment
{
    condition:
        false // just an dummy rule, don't do this
}

字符串區(qū)域

YARA規(guī)則的字符串有三種類型:文本字符串、十六進(jìn)制字符串、正則表達(dá)式。文本字符串用來(lái)定義文件或進(jìn)程內(nèi)存中可讀型內(nèi)容,十六進(jìn)制字符串用來(lái)定義字節(jié)內(nèi)容,正則表達(dá)式可用在文本字符串和十六進(jìn)制字符串中。比如:

rule HexExample
{
    strings:
        $hex_string = { F4 23 ( 62 B4 | 56 | 45 ?? 67 ) 45 }
    condition:
        $hex_string
}

文本字符串在YARA規(guī)則中是大小寫(xiě)敏感的,但可以使用nocase關(guān)鍵字來(lái)取消大小寫(xiě)敏感,字符串中的特殊字符亦可以使用轉(zhuǎn)義符表達(dá),比如:

rule NocaseTextExample
{
    strings:
        $text_string = "\\\"foobar\"\\" nocase
    condition:
        $text_string
}

以上規(guī)則中所表示的字符串內(nèi)容是\"foobar"\,由于使用nocase關(guān)鍵詞,故亦可以表達(dá)\"FoObAr"\、\"FOOBAR"\等等大小寫(xiě)形式。

如果在目標(biāo)文件中一個(gè)字符由兩個(gè)字節(jié)表示,即寬字符形式,則可以使用wide關(guān)鍵詞來(lái)表示文本字符串。如果既想表示寬字符,也想表示ASCII碼,則可以再使用ascii關(guān)鍵詞。比如:

rule WideAsciiTextExample
{
    strings:
        $text_string = "\\\"foobar\"\\" nocase wide ascii
    condition:
        $text_string
}

如果想匹配單個(gè)詞組文本字符串,可以使用fullword關(guān)鍵詞。比如:

rule FullwordTextExample
{
    strings:
        $text_string = "foobar" fullword
    condition:
        $text_string
}

條件區(qū)域

條件區(qū)域的內(nèi)容為布爾類型表達(dá)式,因此該區(qū)域可以使用的符號(hào)可以是布爾操作符and、or和not,關(guān)系操作符>、<、==、<=、>=和!=,算數(shù)操作符+、-、*、/、%和按位操作符&、|、>>、<<、^、~。比如:

rule Example
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"
    condition:
        ($a or $b) and $c
}

如果想表達(dá)字符串描述在文件或進(jìn)程內(nèi)存中出現(xiàn)的次數(shù),則在條件表達(dá)式中將字符串定義中的$替換為#。比如:

rule CountExample
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"
    condition:
        #a == 1 or #b > 4 and #c < 6
}

如果想表達(dá)字符串在文件中的偏移量條件或虛擬地址的條件,則使用at關(guān)鍵詞表示,且表達(dá)式中的數(shù)字類型可以是十進(jìn)制或十六進(jìn)制。比如:

rule CountExample
{
    strings:
        $a = "text1"
        $b = "text2"
        $c = "text3"

    condition:
        $a at 100 and $b at 0x004C0000 and $c at 300
}

與at不同,使用in關(guān)鍵詞可以表示文件偏移范圍,比如:$a in (1..100)、$b in (100..filesize)。這里的filesize亦為關(guān)鍵詞,表示文件的大小(單位字節(jié)),但該關(guān)鍵詞僅適用于分析對(duì)象是文件形式。比如:

rule FileSizeExample
{
    condition:
        filesize > 200KB
}

另外一個(gè)特殊的關(guān)鍵詞是entrypoint,表示文件入口點(diǎn),適用于PE文件和ELF文件,當(dāng)然也可以用于在運(yùn)行進(jìn)程。比如:

rule FileSizeExample
{
    string:
        $a = {E8 00 00 00}
    condition:
        $a at entrypoint
}

定的文件位置表達(dá)可訪問(wèn)數(shù)據(jù)也是條件表達(dá)式可以做到的,需要用到uintXX或intXX關(guān)鍵詞以及以下函數(shù):

int8()
int16()
int32()
uint8()
uint16()
uint32()

利用以上關(guān)鍵詞和函數(shù),若想判斷目標(biāo)文件是否為PE文件,相應(yīng)的規(guī)則可寫(xiě)為:

rule IsPE
{
    condition:
        // MZ signature at offset 0
        uint16(0) == 0x5A4D and
        // PE signature at offset stored in MZ header at 0x3C
        uint32(uint32(0x3C)) == 0×00004550
}

此外,還可以使用of、for…of等關(guān)鍵詞表達(dá)字符串集合,使用them關(guān)鍵詞表示隱式字符串定義。比如:

rule AnonymousStrings
{
    strings:
        $ = "dummy1"
        $ = "dummy2"
     condition:
        1 of them
}

其他規(guī)則

除字符串區(qū)域和條件區(qū)域外,YARA還支持其他類型規(guī)則和形式,比如全局規(guī)則、私有規(guī)則、規(guī)則標(biāo)簽、元數(shù)據(jù)、額外變量。

全局規(guī)則(global rule)旨在進(jìn)行規(guī)則匹配前進(jìn)行全局篩選,因此比其他規(guī)則匹配優(yōu)先級(jí)要高,比如在匹配目標(biāo)文件之前需要先篩選出小于2MB的文件:

global rule SizeLimit
{
    condition:
        filesize < 2MB
}

私有規(guī)則(private rule)的使用可以避免規(guī)則匹配結(jié)果的混亂,即若使用私有規(guī)則進(jìn)行匹配則YARA不會(huì)輸出任何匹配信息。比如在規(guī)則文件Rule2引用規(guī)則文件Rule1時(shí)不希望Rule1的匹配信息輸出:

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

規(guī)則標(biāo)簽(Tag Rule)的目的在于對(duì)規(guī)則匹配結(jié)果進(jìn)行篩選,僅輸出用戶感興趣的匹配結(jié)果。比如:

rule TagRule : dummy1 dummy 2
{
    strings:
        $a = "dummy1"
        $b = "dummy2"
     condition:
        $a and $b
}

元數(shù)據(jù)(MetaData)的目的在于對(duì)規(guī)則描述進(jìn)行額外的描述存儲(chǔ),其構(gòu)成方式和字符串區(qū)域一致,但不可用于條件區(qū)域引用。比如本文開(kāi)頭的例子。

額外變量(External Variable)允許規(guī)則文件中存在YARA匹配時(shí)手動(dòng)添加的變量?jī)?nèi)容(見(jiàn)下文YARA命令行參數(shù)),比如:

rule ExternalVariableExample
{
    condition:
        ext_var == 10
}

二、YARA命令行參數(shù)

使用YARA進(jìn)行規(guī)則匹配時(shí)需要兩樣?xùn)|西:規(guī)則文件和目標(biāo)文件,目標(biāo)文件可以是文件、文件夾或進(jìn)程。

usage: yara [OPTION]… RULES_FILE FILE | PID
options:
-t print rules tagged as and ignore the rest.
-i print rules named and ignore the rest.
-n print only not satisfied rules (negate).
-g print tags.
-m print metadata.
-s print matching strings.
-p use the specified of threads to scan a directory.
-l abort scanning after matching a number of rules.
-a abort scanning after a number of seconds has elapsed.
-d = define external variable.
-r recursively search directories.
-f fast matching mode.
-w disable warnings.
-v show version information.

規(guī)則文件可以直接傳遞給YARA,也可以在規(guī)則匹配前通過(guò)YARAC進(jìn)行編譯,特別是在相同的規(guī)則文件需要進(jìn)行多次調(diào)用進(jìn)行模式匹配時(shí),后者可以節(jié)省許多時(shí)間。

三、平臺(tái)支持

YARA支持多平臺(tái),可以運(yùn)行在Windows、Linux、Mac OS X,并通過(guò)命令行界面或yara-python擴(kuò)展的Python腳本使用。

四、YARA使用者

VirusTotal Intelligence

jsunpack-n

We Watch Your Website

FireEye, Inc.

Fidelis XPS

RSA ECAT

CrowdStrike FMS

ThreatConnect

?五、下載鏈接

YARA 2.0.0:https://github.com/plusvic/yara/releases/tag/v2.0.0

漏網(wǎng)之余

在編寫(xiě)YARA規(guī)則時(shí)可以使用任何一款文本編譯器,且文件后綴無(wú)要求,但如果使用記事本編寫(xiě),則需要在使用YARA規(guī)則匹配前去除BOM(用vi編輯并使用“set nobomb”可以去除BOM),否則會(huì)提示“error:non-ascii character”。

在命令行下使用YARA進(jìn)行規(guī)則匹配后,若目標(biāo)文件或進(jìn)程符合規(guī)則,則輸出“<規(guī)則文件名> <目標(biāo)文件名>”,否則無(wú)任何輸出,而使用YARA命令參數(shù)“-n”可以反轉(zhuǎn)輸出提示,即匹配時(shí)無(wú)輸出,不匹配時(shí)有輸出。


網(wǎng)站名稱:YARA——惡意軟件模式匹配利器
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/cosidii.html