本發(fā)明涉及一種基于函數(shù)流關(guān)鍵點(diǎn)監(jiān)控的安卓惡意軟件檢測方法。
背景技術(shù):
隨著智能手機(jī)的快速發(fā)展和大量普及,移動互聯(lián)網(wǎng)的安全已是當(dāng)今主流安全威脅之一。Android是目前市場占有量最大的移動智能設(shè)備平臺,它也成為眾多惡意代碼攻擊的目標(biāo)。近幾年來,Android平臺已經(jīng)成為了一個(gè)非常流行的手機(jī)操作系統(tǒng)平臺,并且占據(jù)了世界上超過一半的手機(jī)操作系統(tǒng)市場份額。滲透到各個(gè)行業(yè),給我們的生活,工作和學(xué)習(xí)帶來了巨大的變化。隨著Android智能手機(jī)與Android平板電腦的普及,基于Android惡意軟件也發(fā)展迅猛,因此基于Android平臺的惡意代碼檢測技術(shù)開始被提出。盡管Android智能系統(tǒng)相比蘋果的IOS系統(tǒng)更年輕,一些Android平臺上的安全檢測技術(shù)研究已經(jīng)發(fā)布,如系統(tǒng)訪問控制機(jī)制、惡意軟件檢測、應(yīng)用權(quán)限分析、內(nèi)核加固等。大量的Android平臺需要提出更加穩(wěn)健的安全檢測技術(shù)。安卓惡意軟件檢測是對終端上的應(yīng)用進(jìn)行靜態(tài)和動態(tài)行為監(jiān)控,現(xiàn)在傳統(tǒng)的一般都是利用靜態(tài)和動態(tài)結(jié)合的方式進(jìn)行分析以及利用安全團(tuán)隊(duì)累積的經(jīng)驗(yàn)對軟件的行為進(jìn)行分析,分析出相應(yīng)的行為信息,包括文件、網(wǎng)絡(luò)、Android的四大組件及權(quán)限等內(nèi)容。該平臺上的惡意軟件的數(shù)量不斷增多,Android成為了惡意軟件主要的攻擊目標(biāo)。根據(jù)趨勢科技統(tǒng)計(jì)Android惡意大致分為七類,幾乎有一半都是會濫用增值服務(wù)的惡意軟件,它們會替用戶訂閱并不需要的服務(wù)。廣告軟件最近也增多了,這類軟件會不停地發(fā)布偽裝成緊急通知的廣告,位居第二。數(shù)據(jù)竊取軟件、惡意下載軟件、惡意破解軟件、點(diǎn)擊詐騙軟件,以及間諜工具都緊隨其后。這些移動軟件會帶來個(gè)人和金融數(shù)據(jù)被竊的危險(xiǎn)。
目前國內(nèi)對Android應(yīng)用惡意檢測主要使用殺毒軟件特征查殺和基于框架層(Framework)函數(shù)掛鉤(API Hook)的方法技術(shù),通常惡意應(yīng)用通過利用加殼、加密等方法改變自身特征逃避殺毒軟件檢測。
技術(shù)實(shí)現(xiàn)要素:
為了克服現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明提供了一種基于函數(shù)流關(guān)鍵點(diǎn)監(jiān)控的安卓惡意軟件檢測方法,通過對apk文件進(jìn)行解壓,對其中的dex進(jìn)行分析得到函數(shù)流的調(diào)用序列樹狀結(jié)構(gòu),并對清單文件進(jìn)行靜態(tài)分析;動態(tài)執(zhí)行還原后應(yīng)用程序,跟蹤記錄執(zhí)行流程行為信息;綜合靜態(tài)分析和動態(tài)分析提取出應(yīng)用函數(shù)關(guān)鍵流調(diào)用序列。本發(fā)明可以很好解決現(xiàn)有技術(shù)不能對整個(gè)應(yīng)用的函數(shù)流調(diào)用序列進(jìn)行細(xì)粒度的監(jiān)控問題,包含了自定義函數(shù)和Framework層函數(shù)的監(jiān)控,可以對應(yīng)用行為進(jìn)行更細(xì)粒度的分析,避免了行為的漏分析情況,提高了應(yīng)用行為分析的準(zhǔn)確度。
傳統(tǒng)分析通常提取應(yīng)用程序組件、權(quán)限、網(wǎng)絡(luò)、資源文件、配置文件、設(shè)備信息、Content Observers、Content Queries、用戶賬號等靜態(tài)信息進(jìn)行簡單分析;或者對Intent、Uri、File IO、Network IO、Database、ContentResolver、SMS、電話管理器、Digest、Cipher等動態(tài)行為進(jìn)行攔截監(jiān)控,進(jìn)行惡意行為發(fā)現(xiàn)。本發(fā)明采用的是一種基于函數(shù)流關(guān)鍵點(diǎn)監(jiān)控技術(shù)的安卓惡意軟件檢測方法,通過分析程序和靜態(tài)資源,重建并執(zhí)行應(yīng)用程序,分析關(guān)鍵的函數(shù)流的調(diào)用序列,然后對關(guān)鍵流的函數(shù)調(diào)用序列進(jìn)行細(xì)粒度的監(jiān)控檢測和日志存儲和分析,根據(jù)規(guī)則庫生成相應(yīng)的詳細(xì)行為分析報(bào)告。程序執(zhí)行流的監(jiān)控范圍從對框架層函數(shù)流的監(jiān)控,擴(kuò)展到了對系統(tǒng)層以上的每層函數(shù)流的監(jiān)控。
本發(fā)明所采用的技術(shù)方案是:一種基于函數(shù)流關(guān)鍵點(diǎn)監(jiān)控的安卓惡意軟件檢測方法,包括如下步驟:
步驟一、靜態(tài)行為分析模塊對apk文件進(jìn)行解壓,對其中的dex進(jìn)行分析得到一個(gè)函數(shù)流的調(diào)用序列樹狀結(jié)構(gòu),并對清單文件進(jìn)行靜態(tài)分析;
步驟二、動態(tài)執(zhí)行重建還原應(yīng)用程序,跟蹤記錄執(zhí)行行為;
步驟三、綜合靜態(tài)行為分析和應(yīng)用動態(tài)行為得到函數(shù)關(guān)鍵流調(diào)用序列;
步驟四、對函數(shù)關(guān)鍵流調(diào)用序列進(jìn)行細(xì)粒度的監(jiān)控檢測和日志存儲及分析,生成詳細(xì)行為分析報(bào)告。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果是:
1.本發(fā)明是通過函數(shù)控制流調(diào)用序列進(jìn)行靜態(tài)和動態(tài)分析相結(jié)合對函數(shù)流進(jìn)行監(jiān)控,此方法解決了傳統(tǒng)監(jiān)控系統(tǒng)孤立調(diào)用點(diǎn)的分析,提高惡意程序行為準(zhǔn)確性和詳細(xì)行為分析。
2.本發(fā)明對應(yīng)用的整個(gè)函數(shù)流中調(diào)用序列進(jìn)行細(xì)粒度的詳細(xì)監(jiān)控,生成更詳細(xì)的函數(shù)流函數(shù)調(diào)用信息,為復(fù)雜挖掘更多有價(jià)值的惡意代碼行為信息提供數(shù)據(jù)基礎(chǔ)。
3.本發(fā)明提出的細(xì)粒度分析方案,不再局限于傳統(tǒng)部分性敏感系統(tǒng)函數(shù)的監(jiān)控,而是對整個(gè)應(yīng)用函數(shù)流調(diào)用序列的監(jiān)控,有效避免了應(yīng)用行為信息缺漏監(jiān)控的情況。
附圖說明
本發(fā)明將通過例子并參照附圖的方式說明,其中:
圖1為本發(fā)明的流程示意圖;
圖2為本發(fā)明的系統(tǒng)架構(gòu)圖;
圖3為一個(gè)程序函數(shù)流調(diào)用序列的樹型結(jié)構(gòu)示意圖;
圖4為關(guān)鍵數(shù)據(jù)流函數(shù)結(jié)構(gòu)生成示意圖。
具體實(shí)施方式
一種基于函數(shù)流關(guān)鍵點(diǎn)監(jiān)控的安卓惡意軟件檢測方法,如圖1所示,包括如下步驟:
步驟1:通過apktool對apk文件進(jìn)行反編譯,會將apk文件中的dex文件中的類、方法等映射成對象,得到反編譯后的smali代碼和AndroidManifest.xml清單文件。
步驟2:對dex文件中的類、方法進(jìn)行一次源碼級的深層次分析,生成一個(gè)函數(shù)調(diào)用關(guān)系的執(zhí)行流樹結(jié)構(gòu)。
步驟3:通過對AndroidMainfest.xml的靜態(tài)分析,得到Service、receivers、permissions等敏感組件信息。
步驟4:通過動態(tài)執(zhí)行應(yīng)用程序,記錄應(yīng)用執(zhí)行函數(shù)流調(diào)用序列。對函數(shù)調(diào)用流樹形結(jié)構(gòu)中的敏感API和Service、Receivers、permissions等組件的詳細(xì)調(diào)用序列進(jìn)行分析,并對其中的invoke、return等操作進(jìn)行記錄。
步驟5:通過invoke相應(yīng)地址得到硬盤上的文件偏移,在每次動態(tài)加載后,根據(jù)相應(yīng)模塊基地址加上文件偏移得到函數(shù)的入口,通過return指令得到函數(shù)的結(jié)束地址。
步驟6:為有效克服現(xiàn)有惡意軟件的反hook技術(shù),在函數(shù)入口地址之后,插入跳轉(zhuǎn)代碼,插入點(diǎn)定位在函數(shù)入口加相應(yīng)偏移處(根據(jù)dalvik虛擬機(jī)或者art虛擬機(jī)指令原理設(shè)置偏移)。在進(jìn)行中轉(zhuǎn)器設(shè)置之前,要先保存現(xiàn)場環(huán)境、插入中代碼、執(zhí)行代理函數(shù)、獲取寄存器、棧等現(xiàn)場環(huán)境值、恢復(fù)當(dāng)前函數(shù)的現(xiàn)場環(huán)境等。
步驟7:根據(jù)前面靜態(tài)分析的整個(gè)應(yīng)用的函數(shù)流調(diào)用序列與動態(tài)行為相應(yīng)的執(zhí)行點(diǎn),綜合分析出關(guān)鍵函數(shù)流調(diào)用序列。
步驟8:通過對程序代碼執(zhí)行至代理函數(shù)中運(yùn)行情況的監(jiān)控,以及,從棧上獲取函數(shù)的參數(shù)和返回值,生成相應(yīng)的檢測模塊。
步驟9:重載系統(tǒng)的孵化器進(jìn)程(zygote),通過注入檢測模塊到該進(jìn)程。
步驟10:加載apk至系統(tǒng)運(yùn)行環(huán)境,通過檢測模塊的代理函數(shù)對函數(shù)的參數(shù)值和返回值以及函數(shù)現(xiàn)場環(huán)境進(jìn)行記錄,傳給相應(yīng)的日志存儲模塊。
步驟11:日志分析模塊在日志存儲器中讀出通過函數(shù)關(guān)鍵流和靜態(tài)行為引擎分析出的日志,進(jìn)行匹配及分析。
步驟12:通過制定的規(guī)則庫對存儲的日志進(jìn)行分析后生成相應(yīng)的報(bào)告。
圖2為本發(fā)明的系統(tǒng)架構(gòu)圖,包括函數(shù)流分析模塊、函數(shù)靜態(tài)行為分析模塊、動態(tài)檢測模塊、關(guān)鍵函數(shù)流檢測模塊、日志分析模塊、日志存儲模塊。
所述函數(shù)流生成模塊是通過靜態(tài)分析解壓后的apk文件,得到應(yīng)用的函數(shù)流的調(diào)用序列樹結(jié)構(gòu),然后通過加載apk,執(zhí)行重建應(yīng)用程序,對動態(tài)執(zhí)行流進(jìn)行記錄及跟蹤,分析調(diào)用序列樹結(jié)構(gòu),優(yōu)化出最精準(zhǔn)的行為函數(shù)流關(guān)鍵點(diǎn)。在得到函數(shù)流的關(guān)鍵點(diǎn)后,插入檢測模塊;動態(tài)運(yùn)行并跟蹤記錄關(guān)鍵流函數(shù)執(zhí)行行為;結(jié)合保存的當(dāng)前函數(shù)執(zhí)行環(huán)境狀態(tài),綜合分析出最終比較精確的報(bào)告。
所述靜態(tài)行為分析模塊通過apktool或者通過andrguard等類似的工具對應(yīng)用apk文件進(jìn)行逆向分析。對生成的清單文件進(jìn)行權(quán)限、Android四大組件、反射函數(shù)、加密函數(shù)、本地(native method)函數(shù)進(jìn)行分析,生成詳細(xì)的分析結(jié)果。
所述動態(tài)行為檢測模塊,插入檢測到當(dāng)前檢測的應(yīng)用中,根據(jù)應(yīng)用模塊加載狀態(tài)自動執(zhí)行檢測功能。對行為的執(zhí)行流程進(jìn)行記錄,結(jié)合靜態(tài)生成的函數(shù)調(diào)用序列進(jìn)行綜合分析,得到敏感的關(guān)鍵函數(shù)流的調(diào)用序列。
所述關(guān)鍵函數(shù)流檢測模塊重載孵化器(zygote),并通過其注入的模塊,每當(dāng)啟動新的應(yīng)用時(shí)檢測模塊會自動加載到應(yīng)用獨(dú)立的環(huán)境中去,當(dāng)判斷應(yīng)用相應(yīng)的模塊加載成功后,執(zhí)行關(guān)鍵函數(shù)流點(diǎn)檢測。
所述日志存儲模塊,對檢測模塊中關(guān)鍵函數(shù)流各檢測點(diǎn),保存函數(shù)環(huán)境中棧,寄存器、返回值,參數(shù)等信息;結(jié)合并與AndroidMainfest.xml文件中敏感點(diǎn)靜態(tài)信息,一并存放于數(shù)據(jù)庫或者其它的存儲結(jié)構(gòu)中。
所述日志分析模塊是通過應(yīng)用包名、CRC或者M(jìn)D5等取出存儲結(jié)構(gòu)中的日志信息進(jìn)行綜合判斷。
圖3為靜態(tài)生成函數(shù)流調(diào)用序列原理圖。一個(gè)函數(shù)里面有一個(gè)或者多個(gè)調(diào)用點(diǎn),函數(shù)調(diào)用關(guān)系形成樹形調(diào)用序列,整個(gè)調(diào)用序列包含自定義函數(shù)和框架層函數(shù)調(diào)用流。
當(dāng)程序在模擬還原行為運(yùn)行當(dāng)前函數(shù)fun1時(shí),函數(shù)fun1既包含被調(diào)用時(shí)的輸入輸出數(shù)據(jù),也包含調(diào)用下層函數(shù)的各個(gè)關(guān)鍵函數(shù)點(diǎn)。通過保存函數(shù)現(xiàn)場環(huán)境(如保存監(jiān)控點(diǎn)位置的opcode,保證執(zhí)行完監(jiān)控后還原到相應(yīng)執(zhí)行環(huán)境),通過對檢測方法入口處進(jìn)行地址偏移修改內(nèi)存段權(quán)限,并加入監(jiān)控代碼;通過設(shè)置的跳轉(zhuǎn)代碼執(zhí)行到代理函數(shù)中執(zhí)行的檢測代碼,避免函數(shù)環(huán)境的破壞,檢測完后能繼續(xù)執(zhí)行自身的原始行為。檢測時(shí)可獲得棧數(shù)據(jù),或者當(dāng)前函數(shù)執(zhí)行狀態(tài)環(huán)境信息,如一定范圍內(nèi)的字符信息和參數(shù)等。行為數(shù)據(jù)涵蓋傳統(tǒng)framework層和關(guān)鍵函數(shù)流調(diào)用序列中的自定義函數(shù)。提取完成函數(shù)當(dāng)前環(huán)境值后,可恢復(fù)函數(shù)最初環(huán)境,繼續(xù)函數(shù)原始路徑執(zhí)行。當(dāng)程序運(yùn)行到最后一個(gè)函數(shù),系統(tǒng)對函數(shù)執(zhí)行結(jié)束操作,釋放操作系統(tǒng)資源。最終根據(jù)動態(tài)執(zhí)行函數(shù)流結(jié)果記錄和靜態(tài)分析結(jié)果生成關(guān)鍵函數(shù)流調(diào)用序列。
圖4為關(guān)鍵函數(shù)流結(jié)構(gòu)生成示意圖,所述函數(shù)流生成模塊是通過靜態(tài)分析對解壓后的dex文件代碼,得到應(yīng)用函數(shù)流調(diào)用序列的樹形結(jié)構(gòu);通過加載運(yùn)行重建還原應(yīng)用,對執(zhí)行流進(jìn)行跟蹤記錄,分析調(diào)用序列提取出最精準(zhǔn)的行為函數(shù)流關(guān)鍵點(diǎn)。
Android系統(tǒng)架構(gòu)分為四層結(jié)構(gòu),從上層分別是應(yīng)用層、應(yīng)用程序框架層、系統(tǒng)運(yùn)行庫層以及Linux內(nèi)核層;本發(fā)明通過靜態(tài)函數(shù)流的調(diào)用序列和動態(tài)應(yīng)用行為,可覆蓋上述全部四層結(jié)構(gòu)函數(shù)流關(guān)鍵點(diǎn)的行為檢測。