本發(fā)明涉及一種基于惡意行為函數(shù)調(diào)用圖的安卓應(yīng)用程序安全可視化分析方法,屬于信息安全技術(shù)領(lǐng)域。
背景技術(shù):
根據(jù)德國網(wǎng)絡(luò)安全公司G DATA最新公布的一份調(diào)查報告顯示,2015年Android惡意軟件樣本數(shù)量達(dá)到了2333777個。形象點(diǎn)來描述就是差不多每隔11秒就會出現(xiàn)一個新的Android惡意樣本。Android惡意軟件增長速度極快,該數(shù)值同比2014年增長了50%。而在2015年第四季度,新出現(xiàn)的Android惡意軟件數(shù)量達(dá)到了758133個,同比2014年第四季度增長了32%。目前Android系統(tǒng)與我們的工作生活息息相關(guān),如何快速識別新型的Android惡意軟件對于信息安全人員是一個嚴(yán)峻的挑戰(zhàn)。
近年來,研究人員已經(jīng)采用了多種自動化Android惡意軟件分析技術(shù)來幫助識別惡意軟件。雖然在Android惡意軟件分析領(lǐng)域已經(jīng)有了不少有效的方法,但是在惡意軟件可視化方面仍有很多需要研究的地方。
現(xiàn)有的惡意軟件分析方法可以大致分為靜態(tài)分析、動態(tài)分析和機(jī)器學(xué)習(xí)。但是這些方法和流行的反病毒引擎都存在不小的漏報率和誤報率,人工分析的準(zhǔn)確率依然優(yōu)于機(jī)器分析。
對于已有的、新出現(xiàn)的惡意軟件,安全分析人員和研究人員都會想深入了解它們包含的具體的惡意行為以幫助日后的研究工作,可是這些信息很難從網(wǎng)絡(luò)上獲取。
現(xiàn)有的Androguard技術(shù)可以在java代碼層生成Android軟件的基本的調(diào)用圖和控制流圖。但是它的調(diào)用圖規(guī)模龐大且調(diào)用鏈通常是不完整的,也不能給出不同的類之間調(diào)用的相關(guān)性。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)的缺陷,本發(fā)明的目的是實現(xiàn)一種先自動化分析Android軟件再將其可視化的輔助人工惡意軟件分析的方法。本方法在極大程度的縮小函數(shù)調(diào)用關(guān)系圖的規(guī)模的同時保存惡意軟件中包含的核心惡意行為,另外還可以完整的顯示惡意行為觸發(fā)過程的調(diào)用鏈。本方法還可以幫助人工分析提高惡意軟件分析的效率及準(zhǔn)確率。
為了實現(xiàn)上述目的,本發(fā)明采用了如下技術(shù)方案:一種基于惡意行為函數(shù)調(diào)用圖的安卓應(yīng)用程序安全可視化分析方法,包括如下步驟。
一種基于惡意行為函數(shù)調(diào)用圖的安卓應(yīng)用程序安全可視化分析方法,其特征在于包括如下步驟。
(1)生成函數(shù)調(diào)用關(guān)系圖:反編譯Android APK,用節(jié)點(diǎn)表示基本代碼塊,節(jié)點(diǎn)間的有向調(diào)用邊表示控制流路徑,生成APK的函數(shù)調(diào)用關(guān)系圖,即Call Graph(CG);對函數(shù)調(diào)用關(guān)系圖中的節(jié)點(diǎn),根據(jù)節(jié)點(diǎn)中的類名、方法名、代碼以及分類規(guī)則為節(jié)點(diǎn)分類并添加標(biāo)簽值,得到一張新圖稱之為添加標(biāo)簽值的函數(shù)調(diào)用關(guān)系圖。該圖中節(jié)點(diǎn)共有9種分類,第1類為普通,第2類為活動Activity,第3類為服務(wù)Service,第4類為廣播接收器Broadcast Receiver,第5類為用戶行為user-behavior,第6類為事件event,第7類為額外的被調(diào)用者callee-extra,第8類為調(diào)用者caller,第9類為危險接口riskyapi,其中第2、3、4、7類統(tǒng)稱為被調(diào)用者callee;每個節(jié)點(diǎn)可能屬于其中一種或者多種分類,只屬于2至9類中一類的節(jié)點(diǎn)為單屬性節(jié)點(diǎn),屬于2至9類中兩種及以上分類的節(jié)點(diǎn)為多屬性節(jié)點(diǎn);
(2)拆分多屬性節(jié)點(diǎn):將步驟(1)所得的添加標(biāo)簽值的函數(shù)調(diào)用關(guān)系圖中多屬性節(jié)點(diǎn)拆分為多個節(jié)點(diǎn),使得每個節(jié)點(diǎn)只包含原多屬性節(jié)點(diǎn)的一個標(biāo)簽值;將所有多屬性節(jié)點(diǎn)拆分后,得到一張新圖稱之為經(jīng)過拆分的函數(shù)調(diào)用關(guān)系圖;
(3)添加隱式調(diào)用邊:在步驟(2)所得的經(jīng)過拆分的函數(shù)調(diào)用關(guān)系圖中,為存在隱式調(diào)用關(guān)系的節(jié)點(diǎn)之間添加調(diào)用邊;得到一張新圖稱之為添加隱式調(diào)用邊的函數(shù)調(diào)用關(guān)系圖;這種根據(jù)隱式調(diào)用關(guān)系添加的調(diào)用邊稱之為隱式調(diào)用邊;
(4)裁剪:對步驟(3)所得的添加隱式調(diào)用邊的函數(shù)調(diào)用關(guān)系圖進(jìn)行裁剪,刪除不直接或者間接調(diào)用riskyapi類節(jié)點(diǎn)的非riskyapi類節(jié)點(diǎn),得到一張新圖稱之為經(jīng)過裁剪的函數(shù)調(diào)用關(guān)系圖;
(5)添加顏色和尺寸:為步驟(4)所得的經(jīng)過裁剪的函數(shù)調(diào)用關(guān)系圖中的節(jié)點(diǎn)根據(jù)節(jié)點(diǎn)類型設(shè)置尺寸和顏色,得到經(jīng)過裁剪及自定義設(shè)置的函數(shù)調(diào)用關(guān)系圖,即PMCG;
(6)采用現(xiàn)有或自開發(fā)的可視化界面,利用可視化軟件打開PMCG中的文件,可視化展示PMCG,協(xié)助用戶分析判斷是否存在惡意行為。
所述步驟(1)中,根據(jù)節(jié)點(diǎn)中的類名、方法名、代碼以及分類規(guī)則為節(jié)點(diǎn)分類并添加標(biāo)簽值,具體如下:
J.第1類為普通節(jié)點(diǎn),分類規(guī)則為:2至9類以外的節(jié)點(diǎn),沒有標(biāo)簽值;
K.第2類為活動Activity節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼的類繼承于Activity,方法名為OnCreate,標(biāo)簽值為:Activity;
L.第3類為服務(wù)Service節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼的類繼承于Service,方法名為OnCreate,標(biāo)簽值為:Service;
M.第4類為廣播接收器Broadcast Receiver節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼的類繼承于BroadcastReceiver,方法名為OnReceive,標(biāo)簽值為:Broadcast Receiver&這個廣播接收器監(jiān)聽的廣播;
N.第5類為用戶行為user-behavior節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼屬于用戶觸發(fā)的事件,標(biāo)簽值為:該節(jié)點(diǎn)的方法名;
O.第6類為事件event節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼屬于用戶觸發(fā)事件以外的事件,標(biāo)簽值為:該節(jié)點(diǎn)的方法名;
P.第7類為額外的被調(diào)用者callee-extra節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼的方法名屬于用戶自定義的(caller,callee)對列表中callee類中的方法名,標(biāo)簽值為:該節(jié)點(diǎn)的方法名;
Q.第8類為調(diào)用者caller節(jié)點(diǎn),分類規(guī)則為:包含調(diào)用callee類節(jié)點(diǎn)函數(shù)的節(jié)點(diǎn),調(diào)用callee類節(jié)點(diǎn)的函數(shù)集合可以根據(jù)Android操作系統(tǒng)變化以及用戶自定義(caller,callee)對列表進(jìn)行調(diào)整,標(biāo)簽值為:調(diào)用callee類節(jié)點(diǎn)所用到的函數(shù)名;
R.第9類為危險接口riskyapi節(jié)點(diǎn),分類規(guī)則為:節(jié)點(diǎn)中代碼使用了用戶自定義的敏感應(yīng)用程序編程接口API列表中的API,敏感API列表用戶可以根據(jù)自身需要進(jìn)行定義,標(biāo)簽值為:代碼中的敏感API。
所述步驟(2)中,多屬性節(jié)點(diǎn)拆分為多個節(jié)點(diǎn)的方法為:
對每個多屬性節(jié)點(diǎn)執(zhí)行以下步驟:
E.設(shè)多屬性節(jié)點(diǎn)屬于n個類;
F.生成n-1個新節(jié)點(diǎn),為新節(jié)點(diǎn)設(shè)置編號;
G.n-1個新節(jié)點(diǎn)與原多屬性節(jié)點(diǎn)每個節(jié)點(diǎn)不重復(fù)的保存原多屬性節(jié)點(diǎn)的一個分類及該分類對應(yīng)的標(biāo)簽值;
H.添加原多屬性節(jié)點(diǎn)到這n-1個新節(jié)點(diǎn)的雙向邊。
所述步驟(3)中,為存在隱式調(diào)用關(guān)系的節(jié)點(diǎn)之間添加調(diào)用邊的方法為:
I.對于每一個代碼中包含啟動活動Activity的函數(shù)的節(jié)點(diǎn),它屬于caller,查找到它啟動的Activity節(jié)點(diǎn)。被啟動的Activity節(jié)點(diǎn)為該caller節(jié)點(diǎn)對應(yīng)的callee節(jié)點(diǎn),為該caller節(jié)點(diǎn)與其對應(yīng)的callee節(jié)點(diǎn)之間添加一條調(diào)用邊;
J.對于每一個代碼中包含啟動服務(wù)Service的函數(shù)的節(jié)點(diǎn),它屬于caller,查找到它啟動的Service節(jié)點(diǎn)。被啟動的Service節(jié)點(diǎn)為該caller節(jié)點(diǎn)對應(yīng)的callee節(jié)點(diǎn),為該caller節(jié)點(diǎn)與其對應(yīng)的callee節(jié)點(diǎn)之間添加一條調(diào)用邊;
K.對于每一個代碼中包含注冊Broadcast Receiver的函數(shù)的節(jié)點(diǎn),它屬于caller,查找到它注冊的Broadcast Receiver,被注冊的Broadcast Receiver節(jié)點(diǎn)為該caller節(jié)點(diǎn)對應(yīng)的callee節(jié)點(diǎn),為該caller節(jié)點(diǎn)與其對應(yīng)的callee節(jié)點(diǎn)之間添加一條調(diào)用邊;
L.對于每一個代碼中包含發(fā)送廣播函數(shù)的節(jié)點(diǎn),它屬于caller,查找到接收該caller節(jié)點(diǎn)發(fā)送的廣播的Broadcast Receiver節(jié)點(diǎn)。接收該caller節(jié)點(diǎn)發(fā)送的廣播的Broadcast Receiver節(jié)點(diǎn)為該caller節(jié)點(diǎn)對應(yīng)的callee節(jié)點(diǎn),為該caller節(jié)點(diǎn)與其對應(yīng)的callee節(jié)點(diǎn)之間添加一條調(diào)用邊;
M.對于每一個callee-extra類節(jié)點(diǎn),它屬于callee,找到它的方法名,節(jié)點(diǎn)中代碼的方法名是這個方法名對應(yīng)的caller的節(jié)點(diǎn)是這個callee節(jié)點(diǎn)對應(yīng)的caller節(jié)點(diǎn),為該caller節(jié)點(diǎn)與其對應(yīng)的callee節(jié)點(diǎn)之間添加一條調(diào)用邊。
N.為在同一個Android組件的生命周期內(nèi),狀態(tài)轉(zhuǎn)換的節(jié)點(diǎn)對之間添加一條調(diào)用邊。
O.為觸發(fā)user-behavior和event的節(jié)點(diǎn)與被其觸發(fā)的節(jié)點(diǎn)之間添加一條調(diào)用邊。
P.為發(fā)送消息到消息隊列和從消息隊列中接收消息的節(jié)點(diǎn)對之間添加一條調(diào)用邊。
所述步驟(4)中,裁剪,刪除不直接或者間接調(diào)用riskyapi類節(jié)點(diǎn)的非riskyapi類節(jié)點(diǎn)的方法為:
F.定義所得的新圖中所有節(jié)點(diǎn)的集合為N,有向調(diào)用邊的集合為E,在集合N上定義一個用來判斷是否存在從一個節(jié)點(diǎn)到另一個節(jié)點(diǎn)有向路徑的函數(shù)Dpath,對于N中任意兩個節(jié)點(diǎn)n1,n2:
如果Dpath(n1,n2)=1,則說明存在從n1到n2有向路徑,反之不存在;
G.定義所有要被刪除的節(jié)點(diǎn)集合TN={ni|ni∈N且對于任意一個riskyapi類節(jié)點(diǎn)c,Dpath(ni,c)=0};
H.定義所有要被刪除的有向調(diào)用邊集合TE={ej|ej∈E且ej的源節(jié)點(diǎn)或者目標(biāo)節(jié)點(diǎn)屬于集合TN};
I.將所得的添加隱式調(diào)用邊的函數(shù)調(diào)用關(guān)系圖中屬于集合TN的節(jié)點(diǎn)刪除;
J.將所得的添加隱式調(diào)用邊的函數(shù)調(diào)用關(guān)系圖中屬于集合TE的邊刪除。
所述步驟(5)中,根據(jù)節(jié)點(diǎn)類型設(shè)置尺寸和顏色的方法為:
D.為類型1至9分別定義對應(yīng)的尺寸;
E.為類型1至9分別定義對應(yīng)的顏色;
F.根據(jù)節(jié)點(diǎn)的類型,找到該屬性值對應(yīng)的尺寸和顏色,為該節(jié)點(diǎn)設(shè)置尺寸和顏色。
所述步驟(6)中,利用可視化軟件打開PMCG文件,可視化展示PMCG圖,協(xié)助用戶分析判斷是否存在惡意行為的方法如下:
C.調(diào)用可視化軟件如Gephi打開PIMCG的文件;
D.用戶根據(jù)PIMCG圖中節(jié)點(diǎn)函數(shù)代碼、節(jié)點(diǎn)之間的調(diào)用關(guān)系以及riskyapi類節(jié)點(diǎn)包含的敏感API信息,判斷程序中是否存在隱私竊取、遠(yuǎn)程控制、惡意傳播、資費(fèi)消耗、系統(tǒng)破壞、誘騙欺詐、惡意扣費(fèi)以及流氓行為這些惡意行為。
本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點(diǎn)在于:
(1)本發(fā)明通過裁剪無害節(jié)點(diǎn)可以極大的縮小函數(shù)調(diào)用關(guān)系圖的規(guī)模,平均可以縮小至原先的三十分之一。
(2)本發(fā)明雖然對函數(shù)調(diào)用關(guān)系圖進(jìn)行了裁剪但是依然保存了APK中核心的惡意行為。
(3)本發(fā)明通過為(caller,callee)對之間添加有向調(diào)用邊,可以完整的顯示大部分惡意行為及其觸發(fā)過程。
(4)本發(fā)明將函數(shù)調(diào)用關(guān)系圖可視化展現(xiàn)輔助人工分析,使得軟件分析過程更加簡便,分析效率及準(zhǔn)確率得到提高。
附圖說明
圖1為本發(fā)明的方法實現(xiàn)流程圖;
圖2為本發(fā)明的可視化操作界面;
圖3為實施例1的PMCG圖。
具體實施方式
下面選取文件hash值為4E850BF087512F14A7AEA84909982569的一款A(yù)PK軟件作為實例結(jié)合附圖對本發(fā)明作進(jìn)一步描述:
如圖1所示,本發(fā)明具體實現(xiàn)步驟為:
第一步,反編譯APK,生成APK的函數(shù)調(diào)用關(guān)系圖CG。每個節(jié)點(diǎn)所包含的信息結(jié)構(gòu)如下:
(1)該節(jié)點(diǎn)的編號;
(2)該節(jié)點(diǎn)的類名;
(3)該節(jié)點(diǎn)的方法名;
(4)該節(jié)點(diǎn)的代碼段。
每條有向調(diào)用邊包含的信息結(jié)構(gòu)如下:
(1)該邊的編號;
(2)該邊的源節(jié)點(diǎn);
(3)該邊的目標(biāo)節(jié)點(diǎn)。
第二步,為函數(shù)調(diào)用關(guān)系圖中的節(jié)點(diǎn)添加分類屬性,添加分類屬性可以便于分析人員按類型查看節(jié)點(diǎn)。添加了分類屬性后節(jié)點(diǎn)信息結(jié)構(gòu)如下:
(1)該節(jié)點(diǎn)的編號;
(2)該節(jié)點(diǎn)的類名;
(3)該節(jié)點(diǎn)的方法名;
(4)該節(jié)點(diǎn)的代碼段;
(5)該節(jié)點(diǎn)的分類以及標(biāo)簽值列表;
第三步,將第二步所得的添加標(biāo)簽值的函數(shù)調(diào)用關(guān)系圖圖中多屬性節(jié)點(diǎn)拆分為多個節(jié)點(diǎn),拆分多屬性節(jié)點(diǎn)可以將單個節(jié)點(diǎn)包含的多種信息分散到多個節(jié)點(diǎn),便于分析人員查看,拆分多屬性節(jié)點(diǎn)后節(jié)點(diǎn)信息結(jié)構(gòu)如下:
(1)該節(jié)點(diǎn)的編號;
(2)該節(jié)點(diǎn)的類名;
(3)該節(jié)點(diǎn)的方法名;
(4)該節(jié)點(diǎn)的代碼段;
(5)該節(jié)點(diǎn)的分類;
(6)該節(jié)點(diǎn)的標(biāo)簽值。
第四步,為第三步所得的經(jīng)過拆分的函數(shù)調(diào)用關(guān)系圖添加隱式調(diào)用邊,添加隱式調(diào)用邊可以將原本分散的節(jié)點(diǎn)根據(jù)Android內(nèi)部調(diào)用機(jī)制聯(lián)系起來,使得調(diào)用鏈更加完整。這個經(jīng)過拆分的函數(shù)調(diào)用關(guān)系圖中(3,4)、(2,4)、(6,7)、(15,16)滿足設(shè)定的(caller,callee)對。比如3號節(jié)點(diǎn)調(diào)用了startService()函數(shù),它啟動的Service的類名為Sgter,4號節(jié)點(diǎn)的類名為Sgter,方法名為onCreate(),4號節(jié)點(diǎn)是3號節(jié)點(diǎn)啟動的Service,滿足設(shè)定的(caller,callee)對匹配規(guī)則。為每一個(caller,callee)對添加由調(diào)用者指向被調(diào)用者的有向調(diào)用邊。
第五步,對添加隱式調(diào)用邊的函數(shù)調(diào)用關(guān)系圖進(jìn)行裁剪,裁剪過程在保存APK惡意行為的基礎(chǔ)上大幅度的縮小節(jié)點(diǎn)規(guī)模,刪除冗余信息,使得調(diào)用關(guān)系圖更加便于分析。裁剪前的節(jié)點(diǎn)數(shù)為:810,裁剪后節(jié)點(diǎn)數(shù)為:20,節(jié)點(diǎn)數(shù)目縮小到了原始的大概四十分之一;裁剪前的邊數(shù)為:1522,裁剪后邊數(shù)為:23,邊數(shù)縮小到了原始的大概六十六分之一。
第六步,為經(jīng)過裁剪的函數(shù)調(diào)用關(guān)系圖中的節(jié)點(diǎn)設(shè)置尺寸和顏色,設(shè)置尺寸和顏色后節(jié)點(diǎn)信息結(jié)構(gòu)如下:
(1)該節(jié)點(diǎn)的編號;
(2)該節(jié)點(diǎn)的類名;
(3)該節(jié)點(diǎn)的方法名;
(4)該節(jié)點(diǎn)的代碼段;
(5)該節(jié)點(diǎn)的分類;
(6)該節(jié)點(diǎn)的分類標(biāo)簽值。
(7)該節(jié)點(diǎn)的尺寸;
(8)該節(jié)點(diǎn)的顏色。
第七步,在可視化操作界面(如圖2所示)中調(diào)用可視化軟件打開PMCG文件,得到該APK的PMCG圖(如圖3所示)。圖2的左上部分顯示的是APK的PMCG圖(本例詳圖見圖3),右上部分顯示的是APK的基本信息,最下面顯示的每個節(jié)點(diǎn)的信息。圖3是本例的PMCG圖,圖中的圓圈表示節(jié)點(diǎn),圖中的單向箭頭表示調(diào)用關(guān)系,多屬性節(jié)點(diǎn)與其拆分得到的節(jié)點(diǎn)之間是雙向邊,圓圈下邊的字符串是該節(jié)點(diǎn)的編號以及標(biāo)簽值。接下來協(xié)助用戶根據(jù)PMCG圖中節(jié)點(diǎn)的分類、分類依據(jù)值以及調(diào)用關(guān)系分析該APK是否包含惡意行為。
提供以上實施例僅僅是為了描述本發(fā)明的目的,而并非要限制本發(fā)明的范圍。本發(fā)明的范圍由所附權(quán)利要求限定。不脫離本發(fā)明的精神和原理而做出的各種等同替換和修改,均應(yīng)涵蓋在本發(fā)明的范圍之內(nèi)。