一種Android應(yīng)用程序的描述和匹配方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明主要涉及Android惡意APK檢測(cè)和歸屬領(lǐng)域,具體是一種Android應(yīng)用程 序(Android application package, APK)的描述和匹配方法。 技術(shù)背景
[0002] 移動(dòng)互聯(lián)網(wǎng)的發(fā)展和移動(dòng)智能設(shè)備的普及,帶動(dòng)了移動(dòng)應(yīng)用程序的火爆,也同時(shí) 滋生了大量移動(dòng)惡意應(yīng)用程序和應(yīng)用攻擊方法,損害了移動(dòng)互聯(lián)網(wǎng)的資源和效率,侵犯 了移動(dòng)用戶的數(shù)據(jù)安全和隱私。目前Android惡意代碼的檢測(cè)方法,根據(jù)檢測(cè)流程和特 征描述方法不同,大致可分為靜態(tài)特征檢測(cè)和動(dòng)態(tài)行為檢測(cè)兩種。常用的APK靜態(tài)特征 包括權(quán)限聲明、代碼哈希、數(shù)據(jù)依賴關(guān)系、調(diào)用關(guān)系、程序組件等,檢測(cè)效率比較高的是對(duì) 數(shù)據(jù)依賴關(guān)系和調(diào)用關(guān)系的分析。Android應(yīng)用程序?qū)τ诿舾袛?shù)據(jù)、系統(tǒng)資源、設(shè)備狀態(tài) 的使用和修改,都是通過(guò)調(diào)用相應(yīng)的系統(tǒng)應(yīng)用程序編程接口(Application Programming Interface,API) API來(lái)實(shí)現(xiàn)的。不同代碼范圍和層次的API使用情況,反映了相應(yīng)模塊的代 碼功能,更能夠大致推斷出該模塊在運(yùn)行過(guò)程中的可能行為屬性和表現(xiàn)形式。
[0003] 雖然基于系統(tǒng)API的調(diào)用情況已經(jīng)被不同的研宄者所嘗試和采用,但現(xiàn)存方法只 是針對(duì)單個(gè)API的簡(jiǎn)單調(diào)用過(guò)程和調(diào)用序列,沒(méi)有結(jié)合程序自身的組織結(jié)構(gòu)和代碼模塊之 間的隸屬關(guān)系,缺乏從程序結(jié)構(gòu)的層面、從程序功能實(shí)現(xiàn)的角度來(lái)分析系統(tǒng)API調(diào)用情況, 將API的調(diào)用情況結(jié)合代碼層級(jí)結(jié)構(gòu)進(jìn)行分析,有助于對(duì)應(yīng)用程序大致的功能進(jìn)行推斷, 而應(yīng)用程序同樣的功能實(shí)現(xiàn)可能會(huì)使用不同的API調(diào)用,這樣在API層面的細(xì)粒度比較方 法出現(xiàn)的誤差會(huì)比較大。
【發(fā)明內(nèi)容】
[0004] 本發(fā)明的目的是提出一種Android應(yīng)用程序的描述和匹配方法,從而幫助實(shí)現(xiàn)對(duì) Andro i d應(yīng)用程序的惡意性檢測(cè)和歸屬分類(lèi)。
[0005] 實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案為:解析APK源碼分析其權(quán)限聲明和使用情況及其和 各函數(shù)之間的需求關(guān)系以及各類(lèi)及函數(shù)的隸屬關(guān)系,這其中要借用PScout將應(yīng)用程序調(diào) 用的API映射到其對(duì)應(yīng)的權(quán)限。基于此想法,以權(quán)限為依托,將應(yīng)用程序構(gòu)造成一顆"應(yīng) 用-類(lèi)-函數(shù)"的三層描述樹(shù),并逐層對(duì)權(quán)限的使用情況進(jìn)行統(tǒng)計(jì)、分析和比較,最后計(jì)算出 整個(gè)APK的匹配程度,并以此來(lái)達(dá)到APK的歸屬分類(lèi)目標(biāo)。其特征步驟如下:
[0006] 1)對(duì)Android應(yīng)用程序APK進(jìn)行解壓縮;
[0007] 使用普通解壓縮軟件解壓ZIP格式的APK文件,得到應(yīng)用程序的核心二進(jìn)制文件 classes, dex 和全局配置文件 AndroidManifest. xml。
[0008] 2)提取AndroidManifest. xml文件中的權(quán)限聲明列表,完成根節(jié)點(diǎn)的構(gòu)造;
[0009] 3)分析classes, dex文件,提取應(yīng)用程序的程序結(jié)構(gòu),得到APK中各函數(shù)和類(lèi)的信 息及其相關(guān)調(diào)用關(guān)系;
[0010] 根據(jù)Dalvik虛擬機(jī)上運(yùn)行文件的字節(jié)碼格式和文件結(jié)構(gòu)解析得到應(yīng)用程序的程 序結(jié)構(gòu),即根據(jù)Dalvik虛擬機(jī)上執(zhí)行文件的格式特征,分析classes, dex文件并提取出核 心源碼中的關(guān)鍵信息,包括包名、類(lèi)名、方法名、程序的簽名、系統(tǒng)調(diào)用的API名稱、用戶調(diào) 用的API、API映射到的系統(tǒng)權(quán)限名稱以及"類(lèi)-函數(shù)-API"的隸屬和調(diào)用關(guān)系。生成的文 檔包含的數(shù)據(jù)及各數(shù)據(jù)說(shuō)明如下:
[0011]
【主權(quán)項(xiàng)】
1. 一種Android應(yīng)用程序的描述和匹配方法,其特征在于包括以下步驟: 1) 對(duì)Android應(yīng)用程序APK進(jìn)行解壓縮得到AndroidManifest. xml文件和classes, dex文件; 2) 從AndroidManifest. xml文件中獲取應(yīng)用程序的權(quán)限聲明列表; 3) 反編譯classes, dex文件提取應(yīng)用程序的程序結(jié)構(gòu),分析得到APK中各函數(shù)和類(lèi)的 信息及其相關(guān)調(diào)用關(guān)系; 4) 用PScout將相關(guān)調(diào)用關(guān)系中的應(yīng)用程序編程接口 API調(diào)用映射到對(duì)應(yīng)的權(quán)限中,并 以權(quán)限被需求的使用次數(shù)來(lái)設(shè)定此權(quán)限的權(quán)重; 5) 忽略步驟(2)中有聲明的卻并未出現(xiàn)在步驟(4)的分析結(jié)果中的權(quán)限,忽略步驟 (4)中有的卻并未出現(xiàn)在步驟(2)的權(quán)限聲明中的API調(diào)用; 6) 根據(jù)步驟(3)中提取出的應(yīng)用程序的程序結(jié)構(gòu),構(gòu)造"應(yīng)用-類(lèi)-函數(shù)"的三層實(shí)例 描述樹(shù),用以描述各類(lèi)和函數(shù)的權(quán)限需求關(guān)系; 7) 根據(jù)APK的三層實(shí)例描述樹(shù),計(jì)算APK的相似度,并以此達(dá)到APK的歸屬分類(lèi)目的。
2. 如權(quán)利要求1所述的Android應(yīng)用程序的描述和匹配方法,其特征在于:所述步驟 (3)中,讀取APK在Dalvik虛擬機(jī)上運(yùn)行的文件字節(jié)碼,即classes, dex文件,按照字節(jié)碼 結(jié)構(gòu)反編譯classes, dex文件生成8個(gè)txt文檔用以描述應(yīng)用程序的詳細(xì)信息,文檔包括 該APK包含的所有對(duì)象類(lèi)、函數(shù)、權(quán)限以及它們之間的各種隸屬和需要關(guān)系,生成的Sftxt 文檔所含內(nèi)容如下: meta. txt :包含當(dāng)前所寫(xiě)反編譯程序的版本號(hào)、當(dāng)前反編譯的APK的簽名; cstrs. txt :包含類(lèi)的編號(hào)classID、在此類(lèi)中定義的字符串; funcMd5s. txt :包含函數(shù)的編號(hào)classID、此函數(shù)調(diào)用的API個(gè)數(shù)、此函數(shù)的MD5值; classes, txt :包括類(lèi)的編號(hào) classID、父類(lèi)名 superclass、類(lèi)名 className、調(diào)用的 API 個(gè)數(shù)、此類(lèi)中調(diào)用API的函數(shù)的個(gè)數(shù)、函數(shù)中調(diào)用的API個(gè)數(shù)的最大值; classFuncs. txt :包括類(lèi)的編號(hào)classID、函數(shù)的編號(hào)funcID ; funcs. txt :包括函數(shù)編號(hào)funcID、函數(shù)名稱funcName、參數(shù)個(gè)數(shù)及類(lèi)型parameter、返 回值類(lèi)型returnType ; allcalls, txt :包括函數(shù)編號(hào)funcID、調(diào)用的API編號(hào); apis, txt :包括API的編號(hào)apilD、API的名字apiNAme、調(diào)用此API的方法的參數(shù) parameter、其返回值類(lèi)型returnType以及對(duì)應(yīng)的所需的權(quán)限名稱。
3. 如權(quán)利要求1中所述的Android應(yīng)用程序的描述和匹配方法,其特征在于:所述步 驟(5)中,對(duì)于從AndroidManifest. xml中提取的任意一個(gè)權(quán)限聲明,如果應(yīng)用程序中沒(méi)有 API映射到此權(quán)限,則將此權(quán)限忽略;如果應(yīng)用程序中調(diào)用的某API映射到的權(quán)限沒(méi)有在此 文件中出現(xiàn),則將此API忽略。
4. 如權(quán)利要求1所述的Android應(yīng)用程序的描述和匹配方法,其特征在于:所述步驟 (6)構(gòu)造三層實(shí)例描述樹(shù)中,為每個(gè)APK構(gòu)造一顆"應(yīng)用-類(lèi)-函數(shù)"三層實(shí)例描述樹(shù);其中 "應(yīng)用"節(jié)點(diǎn)由AndroidManifest. xml文件中聲明的所有權(quán)限組成,"類(lèi)"節(jié)點(diǎn)由類(lèi)中調(diào)用過(guò) 的所有API以及類(lèi)名、父類(lèi)名、類(lèi)的參數(shù)個(gè)數(shù)以及類(lèi)的返回值類(lèi)型組成,"函數(shù)"節(jié)點(diǎn)由函數(shù) 中調(diào)用過(guò)的所有API以及函數(shù)名、調(diào)用此函數(shù)的類(lèi)名、函數(shù)參數(shù)個(gè)數(shù)以及函數(shù)的返回值類(lèi) 型組成。
5.如權(quán)利要求1或4所述的Android應(yīng)用程序的描述和匹配方法,其特征在于:所述 步驟(7)中,逐層比較權(quán)限的匹配度,從描述樹(shù)的底層"函數(shù)"層匹配度開(kāi)始計(jì)算,其上一層 "類(lèi)"層的匹配度結(jié)果為其子節(jié)點(diǎn)"函數(shù)"節(jié)點(diǎn)匹配度的最大值,根節(jié)點(diǎn)的匹配度則是兩個(gè)根 節(jié)點(diǎn)的權(quán)限匹配度;用權(quán)重向量表示函數(shù)、類(lèi)和應(yīng)用節(jié)點(diǎn)中的各權(quán)限使用情況,具體實(shí)現(xiàn)方 法如下: 使用的權(quán)限向量:P =也,P2, P3,…,PJ,其中PiQ彡i彡η)表示Android系統(tǒng)中的某 個(gè)權(quán)限,此向量包含Android系統(tǒng)中的所有權(quán)限; 使用權(quán)限的權(quán)重向量:PVector = (W1, w2, W3,…,wn},其中Wi (1彡i彡η)表示權(quán)限向量 中權(quán)限Pi所對(duì)應(yīng)的權(quán)重,此權(quán)重由映射到此權(quán)限的API次數(shù)表示,表明這個(gè)權(quán)限在這個(gè)程 序中需要使用的次數(shù),如果此APK中未使用此權(quán)限或是未聲明此權(quán)限,則它的權(quán)重為0 ; 采用jaccard similarity算法計(jì)算函數(shù)節(jié)點(diǎn)的匹配度:
其中(PpWi)表示權(quán)限PjP它對(duì)應(yīng)的權(quán)重W Pmin(PpWi)表 示兩個(gè)要比較的向量中相同權(quán)限的小的權(quán)重?cái)?shù),max(Pj, Wj)表示兩個(gè)要比較的向量中相同 權(quán)限的大的權(quán)重?cái)?shù); 函數(shù)層的兀配度即函數(shù)層所有節(jié)點(diǎn)兀配度最大倌的平均值:
類(lèi)節(jié)點(diǎn)的匹配度:ClassMatch1,2= {max (FuncMatch ) I e F1,2},其中: F1= RiIAPK1中的函數(shù)節(jié)點(diǎn)} F2= {fj IAPK2中的函數(shù)節(jié)點(diǎn)} Fli2= KGfj) If# F2,f^f2的返回值相同,包含參數(shù)個(gè)數(shù)及類(lèi)型相同} 類(lèi)層的匹配度
f個(gè)類(lèi)節(jié)點(diǎn)匹配度的平均值; 應(yīng)用層的匹配度:
Per1= {Per ^APK1應(yīng)用層節(jié)點(diǎn)中的權(quán)限} Per2= {Per』IAPK2應(yīng)用層節(jié)點(diǎn)中的權(quán)限} 〇
【專利摘要】本發(fā)明公開(kāi)了一種Android應(yīng)用程序的描述和匹配方法,該方法包括對(duì)Android應(yīng)用程序的靜態(tài)描述方法和基于此描述方法的應(yīng)用程序匹配度比較方法,主要應(yīng)用于Android應(yīng)用程序的惡意代碼靜態(tài)檢測(cè)?;贏ndroid平臺(tái)的應(yīng)用程序核心文件classes.dex是由Class文件編譯而來(lái),基于此可以反編譯分析出核心文件的代碼層級(jí)結(jié)構(gòu),再通過(guò)這個(gè)結(jié)構(gòu)中代碼的相似度對(duì)比實(shí)現(xiàn)對(duì)應(yīng)用程序的惡意性判斷。本方法以應(yīng)用程序功能實(shí)現(xiàn)所必需的權(quán)限為依托,反編譯核心文件分析各函數(shù)中權(quán)限的使用情況并基于此構(gòu)造樹(shù)形結(jié)構(gòu)來(lái)描述應(yīng)用程序代碼的層級(jí)結(jié)構(gòu),實(shí)現(xiàn)的細(xì)粒度比較方法有助于提高Android應(yīng)用程序靜態(tài)惡意性檢測(cè)的準(zhǔn)確率。
【IPC分類(lèi)】G06F21-56
【公開(kāi)號(hào)】CN104636665
【申請(qǐng)?zhí)枴緾N201510056041
【發(fā)明人】魏松杰, 楊鈴, 吳高翔, 周紫陽(yáng)
【申請(qǐng)人】南京理工大學(xué)
【公開(kāi)日】2015年5月20日
【申請(qǐng)日】2015年2月3日