成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

惡意軟件模式匹配利器 – YARA

meteor199 / 1919人閱讀

摘要:比如其他規(guī)則除字符串區(qū)域和條件區(qū)域外,還支持其他類型規(guī)則和形式,比如全局規(guī)則私有規(guī)則規(guī)則標簽元數(shù)據(jù)額外變量。比如元數(shù)據(jù)的目的在于對規(guī)則描述進行額外的描述存儲,其構(gòu)成方式和字符串區(qū)域一致,但不可用于條件區(qū)域引用。

YARA是一款旨在幫助惡意軟件研究人員識別和分類惡意軟件樣本的開源工具(由virustotal的軟件工程師Victor M. Alvarezk開發(fā)),使用YARA可以基于文本或二進制模式創(chuàng)建惡意軟件家族描述信息,當然也可以是其他匹配信息。YARA的每一條描述或規(guī)則都由一系列字符串和一個布爾型表達式構(gòu)成,并闡述其邏輯。YARA規(guī)則可以提交給文件或在運行進程,以幫助研究人員識別其是否屬于某個已進行規(guī)則描述的惡意軟件家族。比如下面這個例子:

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字符串的文件都被標識為slient_banker。這僅僅是一個簡單的例子,YARA的規(guī)則可以復(fù)雜和強大到支持通配符、大小寫敏感字符串、正則表達式、特殊符號以及其他特性。

一、YARA規(guī)則編寫

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

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

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

rule?Dummy
{
????condition:
????????false
}

字符串區(qū)域中的每條規(guī)則都由$開頭的字符串定義,其規(guī)則內(nèi)容可以是字符形式或十六進制形式,所定義的字符串由條件區(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語言一樣,字符串規(guī)則使用雙引號,而十六進制規(guī)則使用大括號引用,每個十六進制數(shù)字之間用空格間隔,且十進制數(shù)字不允許出現(xiàn)在十六進制規(guī)則中。

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

注釋方式

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

/*
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ī)則的字符串有三種類型:文本字符串、十六進制字符串、正則表達式。文本字符串用來定義文件或進程內(nèi)存中可讀型內(nèi)容,十六進制字符串用來定義字節(jié)內(nèi)容,正則表達式可用在文本字符串和十六進制字符串中。比如:

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

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

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

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

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

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

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

rule?FullwordTextExample
{
????strings:
????????$text_string?=?"foobar"?fullword
????condition:
????????$text_string
}
條件區(qū)域

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

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

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

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

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

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)鍵詞僅適用于分析對象是文件形式。比如:

rule?FileSizeExample
{
????condition:
????????filesize?>?200KB
}

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

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

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

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

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

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)鍵詞表達字符串集合,使用them關(guān)鍵詞表示隱式字符串定義。比如:

rule?AnonymousStrings
{
????strings:
????????$?=?"dummy1"
????????$?=?"dummy2"
?????condition:
????????1?of?them
}
其他規(guī)則

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

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

global?rule?SizeLimit
{
????condition:
????????filesize?

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

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

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

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

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

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

rule?ExternalVariableExample
{
????condition:
????????ext_var?==?10
}
二、YARA命令行參數(shù)

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

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ī)則匹配前通過YARAC進行編譯,特別是在相同的規(guī)則文件需要進行多次調(diào)用進行模式匹配時,后者可以節(jié)省許多時間。

三、平臺支持

YARA支持多平臺,可以運行在Windows、Linux、Mac OS X,并通過命令行界面或yara-python擴展的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)之余

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

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


via freebuf

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11132.html

相關(guān)文章

  • 反病毒時代已終結(jié)?

    摘要:或者,如果反病毒系統(tǒng)還沒有沒落,那也正走在即將終結(jié)的路上。但僅僅如此還不夠,純粹的技術(shù)對抗在未來勢必難上加難,反病毒技術(shù)及常識的普及對于廠商安全人員才是以柔克剛之策。 無意中看到英國的安全愛好者Graham Sutherland的一篇舊文《The anti-virus age is over》,盡管是一年前所寫,但仍舊可以以呵呵的態(tài)度一覽作者之AV觀: 就目前我的關(guān)注,我認為反...

    Lemon_95 評論0 收藏0
  • 5分鐘即可掌握的前端高效利器:JavaScript 策略模式

    摘要:策略模式由兩部分構(gòu)成一部分是封裝不同策略的策略組,另一部分是。策略模式的典型應(yīng)用場景是表單校驗中,對于校驗規(guī)則的封裝。然而圖像的壓縮及上傳錯誤處理等部分是公用的。遂考慮使用策略模式封裝。 淺談 JavaScript 中策略模式的使用: 什么是設(shè)計模式 什么是策略模式 策略模式在 JavaScript 中的應(yīng)用(使用策略模式封裝百度AI識別調(diào)用) 策略模式在 Vue 組件封裝中的應(yīng)用(...

    BlackFlagBin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<