本發(fā)明涉及Android惡意代碼相檢測分類技術領域,尤其是一種基于層次式simhash的Android惡意代碼檢測方法。
背景技術:
隨著移動互聯(lián)網(wǎng)的發(fā)展,移動智能終端越來越普及,移動應用的種類與數(shù)量都呈現(xiàn)高速增長,智能手機已經(jīng)成為網(wǎng)民最常用的上網(wǎng)工具。來自Gartner統(tǒng)計數(shù)據(jù)顯示,2015年第4季度全球智能手機的銷售量為4億多臺,其中Android系統(tǒng)占據(jù)了80.7%。截止2016年2月1日,僅Android官方應用市場Google Play上的應用數(shù)量就接近200萬。同時,移動惡意應用的種類與數(shù)量也呈現(xiàn)高速增長,根據(jù)阿里聚安全發(fā)布的2015移動安全病毒年報,18%的Android設備感染過病毒,95%的熱門移動應用存在仿冒應用,惡意應用類型越來越多。常見手機病毒的惡意行為包括惡意扣費、信息竊取、短信劫持等,可嚴重損害手機用戶的利益,危害不容忽視。
Android惡意代碼檢測方法主要有基于特征代碼和基于行為的檢測?;谛袨榈臋z測方法則通過程序的行為與已知惡意行為模式進行匹配,判斷目標文件是否包含惡意代碼。誤報率雖然并不理想,但可實現(xiàn)對未知惡意代碼或病毒的檢測,彌補基于特征代碼的檢測。基于行為的分析又可進一步分為動態(tài)和靜態(tài)兩種分析方法。動態(tài)分析方法是指利用“沙盒或虛擬機”來模擬運行程序,通過攔截或監(jiān)控的方式分析程序運行時的行為特征,一定程度上可繞過代碼混淆等代碼保護機制,但是計算資源和時間消耗較大,且代碼覆蓋率低。相對于重量級的動態(tài)分析,靜態(tài)分析則相對屬于輕量級的方法,通常是通過逆向工程抽取程序的特征,分析函數(shù)調用、程序指令等序列,具有快速高效、代碼覆蓋率高等特點。其主要缺陷是分析時間較長,同時誤報率并不穩(wěn)定。
基于特征代碼的檢測方法通過檢測文件是否擁有已知惡意軟件的特征代碼來判斷其是否為惡意軟件,具有快速、準確率高等特點。國外著名的Android惡意代碼檢測工具Androguard就是基于特征代碼實現(xiàn)的。
simhash算法是由GoogleMosesCharikar發(fā)表的一篇論文“detecting near-duplicates for web crawling”中提出的,專門用來解決億萬級別的網(wǎng)頁的去重任務。
simhash作為locality sensitive hash(局部敏感哈希)的一種:
其主要思想是降維,將高維的特征向量映射成低維的特征向量,通過兩個向量的Hamming Distance來確定文章是否重復或者高度近似。
其中,Hamming Distance,又稱漢明距離,在信息論中,兩個等長字符串之間的漢明距離是兩個字符串對應位置的不同字符的個數(shù)。也就是說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數(shù)。例如:1011101與1001001之間的漢明距離是2。至于我們常說的字符串編輯距離則是一般形式的漢明距離。
如此,通過比較多個文檔的simHash值的海明距離,可以獲取它們的相似度。simhash值的生成圖解如圖1所示。
算法過程大概如下:
1,將一個f維的向量V初始化為0;f位的二進制數(shù)S初始化為0;
2,對每一個特征:用傳統(tǒng)的hash算法對該特征產(chǎn)生一個f位的簽名b。對i=1到f:
如果b的第i位為1,則V的第i個元素加上該特征的權重;
否則,V的第i個元素減去該特征的權重。
3,如果V的第i個元素大于0,則S的第i位為1,否則為0;
4,輸出S作為簽名。
該算法首先將每一個特征映射為f維空間的一個向量,這個映射規(guī)則具體是怎樣并不重要,只要對很多不同的特征來說,它們對所對應的向量是均勻隨機分布的,并且對相同的特征來說對應的向量是唯一的就行。比如一個特征的4位hash簽名的二進制表示為1010,那么這個特征對應的4維向量就是(1,-1,1,-1)T,即hash簽名的某一位為1,映射到的向量的對應位就為1,否則為-1。然后,將一個文檔中所包含的各個特征對應的向量加權求和,加權的系數(shù)等于該特征的權重。得到的和向量即表征了這個文檔,我們可以用向量之間的夾角來衡量對應文檔之間的相似度。最后,為了得到一個f位的簽名,需要進一步將其壓縮,如果和向量的某一維大于0,則最終簽名的對應位為1,否則為0。這樣的壓縮相當于只留下了和向量所在的象限這個信息,而64位的簽名可以表示多達264個象限,因此只保存所在象限的信息也足夠表征一個文檔了。
但是,單一的使用simhash方法對Android惡意代碼的檢測和分類,在實際情況中有很大可能性出現(xiàn)誤報等情況,其中由于各種不穩(wěn)定因素,會導致檢測的結果出現(xiàn)誤差。
Voted Perceptron算法基于Rosenblatt and Frank在1957年提出的感知器算法,它充分利用了具有大分界面的線性可分數(shù)據(jù)。該算法具有實現(xiàn)簡單,比SVM更高效的特點,也被運用于使用核函數(shù)的高維空間問題中。有人[Manabu Sassano,IJCNLP]在自然語言處理實驗中比較了Voted Perceptron和SVM的分類效率,發(fā)現(xiàn)Voted Perceptron與SVM準確性相當,但學習時間和預測速度略勝一籌。
該方法簡介如下:
假設特征向量為X,|X|表示X的歐氏長度,X的標簽y的取值為{-1,1}。該算法初始一個0預測向量V,V用于以后預測新的特征向量X的標簽。即y'=sign(v.x)。如果預測值y'不同于真實值y,則更新預測向量v,即v=v+yx。如果y與y'相同,則v不變。這個過程反復進行。如果數(shù)據(jù)是線性可分,該算法已被證明為只會預測有限次錯誤。因此,如果反復訓練數(shù)據(jù),V將會收斂到一個能正確分類所有X的向量。預測錯誤的次數(shù)是O(|#y1-#y-1|)的,即錯誤的次數(shù)與y為1與y為-1的次數(shù)差有關。
在訓練過程中,可以存儲更多信息可以在測試集上產(chǎn)生更好的預測效果。在發(fā)現(xiàn)預測錯誤后,記錄此時的預測向量V。當下一個預測錯誤產(chǎn)生時,我們計算該V預測正確的次數(shù)。將預測正確的次數(shù)作為預測向量V的權重。當測試過程中預測一個向量的標簽時,計算每個預測向量的預測值-1或1,然后用權重組合這些預測值,得到一個最終的預測值。該方法基于這樣的直覺:既然某個預測向量能產(chǎn)生更多的正確預測值,那就應該有更大的權重。詳細算法圖如圖2。
技術實現(xiàn)要素:
為了克服已有惡意代碼檢測和分類方法的結果可行度較低的不足,本發(fā)明提供了一種結果可信度較高的基于層次式simhash的Android惡意代碼檢測和分類方法,該方法可以快速有效的檢測Android應用程序,并將其準確的進行分類,并能夠及時給出其惡意家族的類別信息。
本發(fā)明解決其技術問題所采用的技術方案是:
一種基于層次式simhash的Android惡意代碼檢測和分類方法,包括以下步驟:
步驟一,惡意代碼檢測和惡意家族的訓練集,過程如下:
對已知各個惡意家族中的惡意應用程序進行分層次提取,分別從xml文件、smali代碼、smali代碼指令集、java代碼、java代碼指令集這5個方面分析應用程序,從而對每一個應用程序建立5個特征,對每個惡意家族,建立由該家族中惡意應用程序組成的5個特征集,從而形成各個惡意家族的分類模型;
在形成設定量的惡意家族模型之后,使用投票算法計算每一層的可信度,經(jīng)過設定數(shù)量的訓練之后,得出每一層的可信度權重;
步驟二,惡意代碼檢測和惡意家族分類的測試,過程如下:
首先對待測Android應用程序進行分層提取,分別得到xml文件、smali代碼、smali代碼指令集、java代碼、java代碼指令集這5個方面的集合,然后進行惡意代碼檢測,若檢測出其為非惡意應用程序,得出檢測結果,若檢測出為惡意的應用程序,從分層得到的5個方面與步驟一得到的惡意家族模型進行simhash相似性對比,同時使用步驟一得到的各層的可信度,分別對每一層的對比結果做加權投票分析,綜合得出一個最終結果。
進一步,所述步驟一中,利用對Android惡意程序的逆向反編譯,分別提取出其中的xml文件、smali代碼集、smali代碼調用方法匯總、java代碼集、java函數(shù)與類集合一共5個投票器,分別使用simhash方法進行檢測,每一層的結果都是一個投票,最終的判定為投票選擇的結果。
再進一步,Android應用程序的逆向反編譯及內容提取的過程為:自己編寫python程序,實現(xiàn)對Android應用程序的自動化反編譯和信息提??;實現(xiàn)從apk文件中提取xml文件,將dex文件反編譯成smali代碼,自動提取其中的invoke調用函數(shù)名,將smali代碼再次反編譯為java代碼,從java代碼中提取函數(shù)和類名。
所述投票算法采用投票感知器算法如下:首先對每一層的算法賦予一個可信度初始值,在訓練的時候測試每一種方法的實際準確性,在每一次的訓練中,對每一層的訓練結果做可信度權值增加;若該次訓練該層檢測結果正確,則該層的可信度權值加1,反之,則將該層的可信度權值減1;在經(jīng)過足夠多的訓練結果之后,將對各層的可信程度有設定的結果;在測試時,則只需將每一層的測試結果與該層的可信度相乘,然后將5層的檢測結構做投票統(tǒng)計,即得到最終結果。
本發(fā)明申請?zhí)岢鲆环N基于層次式simhash的Android惡意代碼檢測和分類方法,采用多層次對Android惡意代碼的檢測,對每一層的檢測結果做統(tǒng)計,同時采用基于Voted Perceptron算法的投票算法,每一層得出的結果加上該層的可信度權值,來進行投票處理,根據(jù)投票結果來判斷Android惡意代碼的分類。這樣不僅從多角度分析Android應用程序的代碼,同時也對不同層分析的可信度做了加權處理,大大增強了結果的可信度。
本發(fā)明的有益效果主要表現(xiàn)在:快速有效的檢測Android應用程序,并將其準確的進行分類,并能夠及時給出其惡意家族的類別信息。
附圖說明
圖1是simhash值生成圖。
圖2是Voted Perceptron算法的示意圖。
圖3是Android惡意代碼訓練過程的流程圖。
圖4是Android惡意代碼檢測過程的流程圖。
具體實施方式
下面結合附圖對本發(fā)明作進一步描述。
參照圖3和圖4,一種基于層次式simhash的Android惡意代碼檢測和分類方法,包括以下步驟:
步驟一,惡意代碼檢測和惡意家族的訓練集,如圖3所示。過程為:對已知各個惡意家族中的惡意應用程序進行分層次提取,分別從xml文件、smali代碼、smali代碼指令集、java代碼、java代碼指令集這5個方面分析應用程序,從而對每一個應用程序建立5個特征,對每個惡意家族,建立由該家族中惡意應用程序組成的5個特征集,從而形成各個惡意家族的分類模型。在形成一定量的惡意家族模型之后,使用投票算法計算每一層的可信度,經(jīng)過足夠多的訓練之后,得出每一層的可信度權重。
步驟二,惡意代碼檢測和惡意家族分類的測試,如圖4所示。過程類似于第一部分:首先對待測Android應用程序進行分層提取,分別得到xml文件、smali代碼、smali代碼指令集、java代碼、java代碼指令集這5個方面的集合,然后進行惡意代碼檢測,若檢測出其為非惡意應用程序,得出檢測結果,若檢測出為惡意的應用程序,從分層得到的5個方面與步驟一得到的惡意家族模型進行simhash相似性對比,同時使用步驟一得到的各層的可信度,分別對每一層的對比結果做加權投票分析,綜合得出一個最終結果。
利用對Android惡意程序的逆向反編譯,分別提取出其中的xml文件、smali代碼集、smali代碼調用方法匯總、java代碼集、java函數(shù)與類集合一共5個投票器,分別使用simhash方法進行檢測,每一層的結果都是一個投票,最終的判定為投票選擇的結果。
改進投票算法舉例如下:
假設每一層標識為V1,V2,V3,V4,V5,其各自分別的權重為W1,W2,W3,W4,W5,且權重初始值為10。
L1:在訓練階段,對每一次的訓練結果做累加處理,如第一次訓練結果在各層的結果為:正確、錯誤、正確、正確、正確,則相應的每一層的權重作如下處理:
W1=W1+1=11;
W2=W2-1=9;
W3=W3+1=11;
W4=W4+1=11;
W5=W5+1=11;
在第二次訓練的結果為:正確、錯誤、正確、錯誤、正確,則各權重處理:
W1=W1+1=12;
W2=W2-1=8;
W3=W3+1=12;
W4=W4-1=10;
W5=W5+1=12;
......
假設這樣進行了1001次訓練過程(考慮到最后權重累加可能出現(xiàn)的結果不一致時可能出現(xiàn)的權重值對等的情況的出現(xiàn),因此選用奇數(shù)次訓練),得到最終各層的訓練結果為:W1=525,W2=313,W3=887,W4=355,W5=749。
L2:測試階段,對待測試的Android惡意程序進行各層分層的測試,并將各層的結果乘以權重之后相加,得出最后的結論。注意,這里的相加并不是數(shù)值上的相加,其規(guī)則為:若測試結果一致的,該結果的權重數(shù)值相加,否則不做變化。如某個Android惡意程序各層測試的結果為:S1=1,S2=3,S3=1,S4=2,S5=1,則先對該應用程序的一致的結果作權重累加處理,即結果為1的有S1,S3和S5,將其權重值相加,得到結果為1的權重為2161,另外沒有相同的結果,不作其他處理。因此對結果處理后得到該應用程序結論為:結果為1的可能性為2161,結果為2的可能性為355,結果為3的可能性為313。投票取大值,得出結論:該應用程序結果為1。
Android應用程序的逆向反編譯及內容提取的過程為:自己編寫python程序,實現(xiàn)對Android應用程序的自動化反編譯和信息提取。實現(xiàn)從apk文件中提取xml文件,將dex文件反編譯成smali代碼,自動提取其中的invoke調用函數(shù)名,將smali代碼再次反編譯為java代碼,從java代碼中提取函數(shù)和類名等。
采用投票感知器算法,并在其基礎上做簡化修改,修改后的算法如下:首先對每一層的算法賦予一個可信度初始值,在訓練的時候測試每一種方法的實際準確性,在每一次的訓練中,對每一層的訓練結果做可信度權值增加。若該次訓練該層檢測結果正確,則該層的可信度權值加1,反之,則將該層的可信度權值減1。在經(jīng)過足夠多的訓練結果之后,將對各層的可信程度有一定的結果。在測試時,則只需將每一層的測試結果與該層的可信度相乘,然后將5層的檢測結構做投票統(tǒng)計,即可得到最終結果。