日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

yara 模式匹配 android,YARA——恶意软件模式匹配利器

發(fā)布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 yara 模式匹配 android,YARA——恶意软件模式匹配利器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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 < 6

}

如果想表達字符串在文件中的偏移量條件或虛擬地址的條件,則使用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 < 2MB

}

私有規(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ī)則匹配時需要兩樣東西:規(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使用者

五、下載鏈接

YARA 2.0.0:外鏈網(wǎng)址已屏蔽

漏網(wǎng)之余

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

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

(全文完)

總結(jié)

以上是生活随笔為你收集整理的yara 模式匹配 android,YARA——恶意软件模式匹配利器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。