谷杰銘,孫博文,吳鵬,李祺,郭燕慧
?
基于API調用的抗混淆Android應用相似性檢測方法
谷杰銘1,2,孫博文1,2,吳鵬3,李祺1,2,郭燕慧1,2
(1. 北京郵電大學網絡空間安全學院,北京 100876; 2. 天地互聯與融合北京市重點實驗室,北京 100876; 3. 四川大學計算機學院,四川 成都 610015)
傳統的移動應用相似性檢測方法存在特征提取復雜、檢測效率較低等問題。針對上述問題,提出基于API調用的抗混淆Android應用相似性檢測方法,首先從DEX文件中提取引用API序列,應用反編譯后對引用API進行頻數統計;然后構建應用的特征向量,以此計算應用之間的相似度。實驗結果證明,該方法具有較高的準確率。
應用相似性;Android;逆向工程;抗混淆
Android系統自2007年發布后迅速占據了移動終端平臺的主導地位。數據顯示,截至2016年第3季度,Android操作系統的市場份額達到86.8%[1],Android應用的數量隨著操作系統的普及而快速增長,越來越多的開發者加入Android應用的開發隊伍中,Google Play的Android應用數量在2017年1月增長到270萬,并且在2016年的下載量突破640億次[2]。
Android操作系統的開放性給開發商提供了寬松自由的環境,開發者可以自主開發Android應用并將應用提交到應用市場,用戶通過應用市場下載應用。Google Play采用多種安全機制對提交的應用進行安全檢測,并不斷完善安全審核機制以提高檢測準確性與全面性,但是依然無法避免仿冒應用和惡意應用的存在。應用市場的應用審核機制不嚴格,安全保障機制不夠完善,導致市場內仿冒應用和惡意應用的比例居高不下[3]。
由于Android應用反編譯后的源代碼容易閱讀,部分開發者為了牟取私利,對市場上的知名應用進行逆向工程,對應用稍作修改,在嵌入廣告或惡意代碼后重新打包,作為自己的產品上傳到應用市場[4]。這種行為嚴重擾亂應用市場環境,影響相關產業的健康發展,損壞開發者的合法權益。
應用市場的運營方應該負擔起上架應用的審核和管理工作,避免仿冒應用在應用市場上出現。多數應用市場以書面申請為主、人工測評為輔的方式審核應用版權及內容,這種審核方式工作量大、人工參與度高、效率較低。因此,需要一種應用相似性檢測工具來提高應用市場的審核工作效率。
現有的Android應用相似性檢測方法[5]主要包括行為相似性檢測方法和文件相似性檢測方法。在行為相似性檢測方面,Hanna等[6]提出一種根據行為相似性檢測Android應用代碼重用的方法,該方法首先通過反編譯APK得到Android可執行字節碼,從中提取應用的行為序列,采用特征散列算法對行為序列進行處理,得到應用的行為特征,然后采用群落系數相似性度量方法計算行為特征相似性,該方法適用于檢測應用重打包、代碼抄襲。DroidMOSS[7]通過反編譯APK得到Android可執行字節碼,從中提取應用的指令序列,然后對指令序列采用散列算法得到應用的行為特征,比較行為特征得到應用間的相似度,該方法可以定位到二次打包應用的代碼修改點。
在文件相似性檢測方面,Li[8]采用文件目錄結構對應用相似性進行評估,用樹結構表示應用的目錄結構,計算樹之間的編輯距離,由此得到應用之間的距離。該方法不受代碼混淆的影響,適用于檢測應用重打包、嵌入已知惡意代碼的應用。
上述研究存在以下問題。一是特征提取,行為相似性檢測首先需要逆向分析得到應用行為序列,但是逆向過程容易受到代碼混淆的影響[9],重打包人員只需重新配置混淆文件,把方法、字段、包等Java元素混淆成無意義的名稱,計算得到的散列結果相差較大,導致相似性檢測方法失效;文件相似性檢測得益于惡意開發者基本不改變文件目錄結構,該方法容易受垃圾文件的干擾,在重打包時被惡意插入大量垃圾文件后,文件目錄結構和文件數量發生變化,進而大幅度影響相似性檢測結果[10]。二是檢測效率,傳統檢測方法將應用反編譯到Java源代碼進行分析[11],然而反編譯得到的源代碼不完全符合Java原生代碼的語法結構,同時在反編譯過程中會不可避免地丟失部分信息。分析源代碼耗費大量的時間和空間,同時信息丟失情況較嚴重,造成檢測效率低且檢測結果與實際情況有較大偏差。
應用相似性檢測不但要用精確的應用特征描述樣本應用,而且需要提高檢測效率[12]。針對目前研究成果存在的不足,本文提出基于API調用的抗混淆Android應用相似性檢測方法,通過選取合適的抗混淆應用特征,可以有效地解決混淆環境下的應用相似性檢測問題。首先分析DEX文件結構,提取應用API序列,根據方法的定義性質,篩選出引用API序列,引用API序列由系統方法構成,系統方法不受代碼混淆的影響,同時具有普遍性、代表性,能夠表示應用行為特征,因此選用引用API序列作為應用的抗混淆特征。Smali[13]語言是Davlik的寄存器語言,Smali語言在語法上完整地實現了DEX可執行文件的所有功能[14]。與傳統反編譯DEX文件的源代碼相比,轉換為Smali語言效率更高。對Android應用反編譯后得到的Smali文件進行引用API的頻數統計,能夠避免信息丟失的情況出現,同時提高檢測效率。
構建應用特征向量,首先將API信息從DEX文件中抽取出來,所以需要對DEX文件結構[15]進行分析,從DEX文件的相關結構信息中抽取相關API信息。DEX文件結構如表1所示。

表1 DEX文件結構
標識符列表中索引DEX文件中的字符串、類型、方法原型、字段以及方法信息,其結構體的開始位置和項數均來自文件頭中的記錄。
根據DEX文件結構,下面對標識符列表中結構體的含義進行說明。
首先,針對method_id_ item進行信息描述。method_id_item描述方法的相關信息,包括方法的所屬類、方法原型和方法列表,如表2所示。
然后,本文分析重點proto_id_item的信息描述。proto_id_item描述方法原型的相關信息,包括方法返回值類型、方法參數信息和方法描述,如表3所示。

表2 method_id_item描述

表3 proto_id_item描述

表4 class_def_item描述
最后,對class_def_item的信息描述。class_ def_item描述具體的class類型,如表4所示。
Android應用相似性檢測方法的整體流程如圖1所示。通過分析DEX文件頭定位到方法標識符列表,根據標識符列表中的地址偏移提取應用API序列,根據方法所屬類是否在class_defs區域,篩選出引用API序列。得到引用API序列后,使用APKTool反編譯應用得到smali文件夾,然后統計每個引用API的總調用頻數并得到引用API序列的頻數序列,共同構建應用的特征向量,最后計算應用之間的相似度。本文方法過濾自定義類方法和第三方庫函數,不受代碼混淆的影響,同時避免特征在使用上的不足,保留應用特征的整體性和代表性。
方法檢測流程主要分為6個關鍵步驟,分別是提取API序列、篩選引用API序列、應用反編譯、頻數統計、構建特征向量、相似性計算。
1) 提取API序列
通過實際應用(MD5:CAF89261805E 496528490F337A49861A)展示應用API序列的提取過程。根據DEX文件頭中的地址偏移,定位到方法標識符列表(method_ids)和方法原型標識符列表(proto_ids),從中讀取應用的方法信息[16]。
根據DEX文件頭中記錄的大小和偏移地址定位到方法標識符列表(method_ids)。方法標識符列表(method_ids)是一個結構體數組,該數組的元素為method_id_item結構體。遍歷結構體數組,利用獲得的class_idx和name_idx分別從類型標識符列表(type_ids)、字符串列表(string_ids)中得到方法所屬類和方法名稱。

圖1 Android應用相似性檢測方法流程
根據DEX文件頭中記錄的大小和偏移地址定位到方法原型標識符列表(proto _ids)。方法原型標識符列表(proto _ids)是一個結構體數組,該數組的元素為proto _id_item結構體。遍歷結構體數組,利用獲得的shorty_idx從字符串列表(string_ids)中得到方法返回。
類型和參數列表,利用獲得的parameters_off從data數據區得到方法參數信息。
提取結果顯示應用的API序列共有10 975項。
2) 篩選引用API序列
引用API序列由系統方法構成,系統方法不受代碼混淆的影響,同時具有普遍性、代表性,能夠表示應用行為特征,因此選用引用API序列作為應用的抗混淆特征。提取的API序列中包含應用自定義類方法和第三方庫函數,需要過濾兩者避免代碼混淆的影響。DEX文件結構中,class_defs區域內存放class definitions,包含應用中所有定義的類信息。根據方法所屬的class類型是否在class_defs區域,判定方法是本地方法還是引用方法,從而篩選出引用API序列。
篩選結果顯示應用(MD5:CAF89261805E 496528490F337A49861A)的引用API序列共有2 272項。引用API序列過濾自定義類方法和第三方庫函數,只保留應用中的系統方法。
3) 應用反編譯
應用反編譯是檢測工作的基礎,針對Android應用的反編譯,主要是反編譯應用中的DEX文件和對解碼資源文件[17],檢測方法需要用到的smali文件包含在DEX文件中,所以本文選取APKTool[18]反編譯APK,得到smali文件。

圖2 頻數統計流程
4) 頻數統計
頻數統計流程如圖2所示,首先調用APKTool對應用進行反編譯處理,得到Smali文件夾。Smali語言在語法上完整地實現了DEX文件的所有功能,包括程序代碼、注釋等大量信息[13],因此對得到的smali文件進行頻數統計,可以避免信息丟失的情況出現。這里的頻數統計指的是統計引用API在文件中出現的總調用頻數,最后得到引用API序列的頻數序列,跟引用API序列一起構建應用的特征向量。
5) 構建特征向量
6) 相似性計算
余弦值的范圍在[?1,1],值越趨近于1,代表2個向量的方向越接近;越趨近于?1,它們的方向越相反[19]。得到樣本應用和可疑應用的特征向量后,計算2個向量的余弦值,就可以知道2個應用的相似性情況。

實驗選取的樣本應用來自國內知名Android應用市場,涵蓋10種不同類型,包括社交類、游戲類、影音類、攝影類、工具類、金融類、閱讀類、旅游類、生活類、教育類。每種類型選取功能相近300個應用進行相似性檢測。
圖3為10類樣本應用的相似度統計結果,使用Android相似性檢測工具Androguard[20]進行檢測,發現社交類應用的相似度最高,教育類應用的相似度相對較低。結合應用下載量分析發現,使用頻率越高的應用類型,應用的相似概率越高。
使用本文提出的基于API調用的抗混淆Android應用相似性檢測方法進行檢測,對比實驗結果,本文提出的方法在相同樣本的情況下,檢出率更高,具有更好的區分能力。實驗結果表明,本文方法在簡化特征提取的同時具有較高的準確率。

圖3 樣本相似度
本文提出一種基于API調用的抗混淆Android應用相似性檢測方法,從DEX文件中提取引用API序列,應用反編譯后對引用API進行頻數統計,然后構建應用的特征向量,以此計算應用之間的相似度。特征向量過濾應用自定義類和第三方庫,具有很好的抗混淆性。實驗結果證明,本文提出的應用相似性檢測方法具有較高的準確率。
方法依賴靜態檢測技術,如果應用采用加固技術進行安全保護,影響API序列提取和頻數統計,導致結果失真。后期工作將結合動態脫殼技術對加固應用進行預處理。
[1] Smartphone OS Market Share, 2016 Q3[EB/OL]. http://www.idc.com/ promo/smartphone-market-share/os.
[2] Analysis: how much difference does Google play and App store differ?[EB/OL].http://www.chinaz.com/manage/2017/0223/662587. shtml.
[3] NetQin. Global mobile report of first half of 2012[EB/OL]. http://cn.nq.com/neirong/2012shang.pdf.
[4] SHEKHAR S, DIETZ M, WALLACH D S. AdSplit: separating smartphone advertising from applications[J]. Dissertations & Theses-Gradworks, 2012, 54(1):99.
[5] ZHOU Y, JIANG X. Dissecting android malware: characterization and evolution[C]//2012 IEEE Symposium on Security and Privacy. 2012: 95–109.
[6] HANNA S, HUANG L, WU E, et al. Juxtapp: a scalable system for detecting code reuse among android applications[C]//The International Conference on Detection of Intrusions and Malware, and Vulnerability Assessment. 2012:62-81.
[7] ZHOU W, ZHOU Y, JIANG X, et al. Detecting repackaged smartphone applications in third-party android marketplaces[C]//ACM Conference on Data and Application Security and Privacy. 2012:317-326.
[8] LI S. Juxtapp and DStruct: detection of similarity among Android applications[EB/OL]. https://www2.eecs.berkeley.edu/Pubs/TechRpts/ 2012/EECS-2012-111.html.
[9] HUANG H, ZHU S, LIU P, et al. A framework for evaluating mobile App repackaging detection algorithms[C]//The International Conference on Trust and Trustworthy Computing. 2013:169-186.
[10] CHEN K, LIU P, ZHANG Y. Achieving accuracy and scalability simultaneously in detecting application clones on android markets[C]//The 36th International Conference on Software Engineering. 2014:175-186.
[11] 路程, 張淼, 徐國愛. 基于源代碼靜態分析技術的Android應用惡意行為檢測模型[J]. 2011. LU C, ZHANG M, XU G A. Android application malicious behavior detection model based on source static analysis technology[J]. 2011.
[12] SOH C, TAN H B K, ARNATOVICH Y L, et al. Detecting clones in Android applications through analyzing user interfaces[C]//IEEE International Conference on Program Comprehension. 2015: 163-173.
[13] JesusFreke. smali/baksmali: an assembler/disassembler for Android's dex format[EB/OL]. http://code.google.com/p/smali/.
[14] 劉方圓, 孟憲佳, 湯戰勇, 等. 基于smali代碼混淆的Android應用保護方法[J]. 山東大學學報(理學版), 2017(3): 44-50. LIU F Y, MENG X J, TANG Z Y, et al. Android application protection method based on smali code confusion[J]. Journal of Shandong University(Nature Science), 2017(3): 44-50.
[15] Dedexer: dedexer is a disassembler tool for DEX files [EB/OL]. http://dedexer.sourceforge.net/.
[16] LINARES-VASQUEZ M, HOLTZHAUER A, POSHYVANYK D. On auto-matically detecting similar android apps[C]//The 24th International Conference on Program Comprehension (ICPC). 2016: 1-10.
[17] ZHOU W, ZHOU Y, GRACE M, et al. Fast, scalable detection of piggybacked mobile applications[C]//The 3rd ACM conference on data and application security and privacy. 2013: 185-196.
[18] Apktool. A tool for reverse engineering android apk files[EB/OL]. https://ibotpeaches.github.io/Apktool/.
[19] ZHANG Z Y, WANG J, CHENG H M. An approach for spatial index of text information based on cosine similarity[J]. Computer Science, 2005.
[20] DESNOS A, GUEGUEN G. Android: from reversing to decompilation[J]. Proc of Black Hat Abu Dhabi, 2011.
Anti-obfuscation Android application similarity detection method based on API call
GU Jieming1,2, SUN Bowen1,2, WU Peng3, LI Qi1,2, GUO Yanhui1,2
1. School of Cyberspace Security,Beijing University of Post and Telecommunications, Beijing 100876, China;2. Beijing Key Laboratory of integration with the world Internet, Beijing 100876, China; 3. School of Computer Science, Sichuan University, Chengdu 610015, China
The traditional Android application similarity detection methods have the problem of complex feature extraction and low detecting efficiency. Regarding the issue above, an anti-obfuscation Android application similarity detection method based on API call was proposed. Firstly, it extracts referenced API sequence from the dex file. Counting the number of referenced API after decompiling the application to build feature vector. Finally, calculate the application similarity through feature vector. The experimental results show that the method has high accuracy.
application similarity, Android, reverse engineering, anti-obfuscation
TP399
A
10.11959/j.issn.2096-109x.2018001
谷杰銘(1993-),男,河北邢臺人,北京郵電大學碩士生,主要研究方向為移動安全、惡意軟件檢測。

孫博文(1994-),男,遼寧沈陽人,北京郵電大學碩士生,主要研究方向為網絡安全、惡意軟件檢測。
吳鵬(1982-),男,四川廣元人,四川大學博士生,主要研究方向為惡意軟件檢測、軟件抄襲、軟件安全加固。

李祺(1981-),女,北京人,博士,北京郵電大學副教授,主要研究方向為網絡安全、機器學習、物聯網安全。
郭燕慧(1974-),女,河北唐山人,博士,北京郵電大學副教授,主要研究方向為網絡安全、機器學習、信息安全管理。

2017-10-17;
2017-12-05
谷杰銘,gujiemin35@163.com
國家自然科學基金資助項目(No.61401038)
The National Natural Science Foundation of China (No.61401038)