王李松,方勇
(四川大學電子信息學院,成都 610065)
基于Dalvik 虛擬機的Android Application 脫殼技術
王李松,方勇
(四川大學電子信息學院,成都 610065)
隨著移動應用的飛速發展,移動端頻頻爆發的惡意代碼日益嚴重地困擾著每一個用戶的隱私和財產安全。同時大量的惡意程序采用加殼保護,躲避殺毒引擎的掃描。無論是分析木馬病毒,還是尋找正常程序的漏洞,首先都要從加殼的程序中得到原始的可執行文件。基于對Android平臺加固技術以及Dalvik虛擬機的機制進行研究,提出并實現一種通用的脫殼方案DexUnpack。
Dalvik;Android;加殼;脫殼
目前Android已經成為最流行的移動操作系統,巨大的市場占有率帶來了極大的利潤,大量的攻擊者也將目光投到了Android平臺。阿里移動安全2016年第二季度的報告顯示,該季度感染惡意代碼的Android設備總量高達2877萬,比上一季度增長96.2%。與此同時,原本用來防止應用程序被逆向分析、破解修改、重打包的加殼技術也被惡意程序利用。攻擊者利用加殼技術隱藏木馬病毒程序的真正代碼來躲避安全軟件殺毒引擎的掃描與移動安全研究人員的分析。Android平臺常用的加殼技術主要包括:虛擬機檢測,代碼動態加載,代碼動態修改,反調試。無論是安全人員分析應用還是各種殺毒引擎掃描查殺惡意程序,首先都必須獲得原始的可執行文件(Dex)。
由于脫殼技術對于Android應用安全的重要作用,百度移動安全的研究人員提出并實現了基于Xp osed框架的脫殼工具ZjDroid,安全研究員瘦蛟舞基于Cydia Substrate框架實現了Dex Memory Dump Tools。其中的基本思想就是Android應用運行的內存空間中存在完整的Dex文件,直接將對應區域的內存讀出即可。但是由于加殼技術的發展,當加殼過后的程序檢測到在上述脫殼環境中運行時,可以通過直接退出,大量形成虛假的Dex內存空間,Dex動態修改等對抗手段讓其失效,使得我們要么不能得到Dex,要么得到錯誤或不完整的Dex。基于對Android應用的加殼技術以及Dalvik虛擬機中可執行文件的加載過程的深入分析,通過修改Android系統源碼,編譯自定義的系統實現了一種通用的脫殼方案DexUnpack。
1.1 環境檢測
為了防止應用程序在危險環境運行被分析破解,加殼程序都具有運行環境檢查功能,一旦檢測到自己的運行環境不是安全環境,就會觸發本身的安全機制,不會進行真實Dex文件的加載。常用的檢測技術包括檢查Android模擬器以及脫殼環境檢測。Android模擬器檢測可以通過檢查設備的IMEI,DeviceID,PhoneNumber,Fingerprints,Props,特征文件(/dev/socket/qemud,/dev/qemu_pipe)等。脫殼環境檢測包括Root檢測,Xposed框架檢測,Cydia Substrate框架檢測等。
1.2 代碼動態加載
Dalvik虛擬機允許程序在運行時動態加載代碼執行。加殼的應用程序往往會將原始的可執行文件進行加密保存,在運行時對加密的代碼進行解密,將解密后的內容直接通過匿名內存映射的方式直接映射到一塊匿名的內存空間然后使用libdvm.so中的相關函數進行Dex文件的內存加載。這樣整個文件系統中就不會出現Dex文件,大大增強了隱蔽性與安全性。
1.3 代碼動態修改
當可執行代碼被Dalvik虛擬機加載進內存后可以通過JNI接口調用native code更改可執行代碼,當該代碼需要真正運行時再將其修改還原。這樣即使在內存中也不存在完整的可執行代碼,這就從一定程度上增加了逆向分析的難度。讓傳統的基于內存搜索和內存Dump的方法都失效。
1.4 反動態調試
動態調試技術是分析應用程序的重要手段,加殼程序為了阻止自身被動態分析,采用的手段通常有:限制調試器連接,Android使用android:debuggable標簽標識應用程序是否可調試,通過將android:debuggable設置為false便可限制調試器連接;搶占ptrace,搶占ptrace的概念繼承至Linux系統的ptrace系統調用,ptrace系統調用為開發者提供一種使用一個進程監視、控制另一個進程的執行或檢查、改變另一個進程內存和寄存器的方法,ptrace經常被用來實現反調試功能,因為一個進程只能被ptrace一次,如果應用程序使用ptrace進行自我監控和跟蹤,就可以阻止動態調試;檢查/proc/pid目錄下的文件,Linux系統將進程在內核中的進程信息通過內存映射的方式映射到/proc/pid目錄中的文件中,當程序被調試時,相關信息會發生變化,例如status文件中的TracerPid就會從0變為調試該進程的進程pid,通過檢測TracerPid是否為0就可檢測程序是否正在被動態調試。
2.1 DexUnpack實現的基本思想
Android應用程序的可執行文件即Dex文件在運行時由Dalvik虛擬機加載并執行,它的文件格式如圖一所示。只要我們能夠正確地重建此文件結構,就能得到脫殼后的Dex文件。為了重建該文件結構,我們必須得到每一個Class的全部信息。因為每個Class在使用前都必須被Dalvik虛擬機正確加載,所以只要我們深入到Dalvik虛擬機對Dex文件處理加載Class的過程中,修改Dalvik虛擬機的處理過程即可得到Class的全部信息。

圖1 Dex文件結構
2.2 Dex文件處理
對Dex文件進行處理的過程如圖2所示:

圖2 Dex文件處理流程
(1)對Dex文件驗證和優化,驗證的目的是對Dex文件中的類數據進行安全性合法性檢驗,為虛擬機的安全穩定運行提供保證;優化的目的則是根據當前設備平臺增加輔助信息,使得Dex文件更加高效的被執行。
(2)對Dex文件進行解析,其目標就是通過在內存中創建專用的數據結構描述該文件,為隨后實際加載某一指定類做好數據準備。
(3)對指定類進行實際加載,其功能是實時根據Dalvik虛擬機執行需要從已被解析的Dex文件中提取二進制Dalvik字節碼并將其封裝進運行時數據結構,以供解釋器解釋執行。該運行時數據結構實際上是一個ClassObject結構體對象,也稱為類對象,該數據結構用于封裝程序類的所有運行時數據信息。當虛擬機執行一個類方法時,解釋器將引用并執行類對象中封裝的方法操作碼,進而達到完成程序要求的執行目標。因此,ClassObject對象在程序運行過程中承擔著不可替代的重要作用。
ClassObject加載機制的根本任務是根據程序運行需要在已被虛擬機解析的Dex文件中查找并加載指定類。類加載機制最終會輸出一個ClassObject數據結構的實例對象。Dalvik虛擬機主要通過調用類加載機制的本地方法接口函數Dalvik_dalvik_System_DexFile_ defineClass對運行時所需的類進行定義,完成對類的加載工作。當類加載完成我們就得到了重建是需要的全部Class信息。
通過對Dalvik虛擬機源碼的分析,我們知道了ClassObject的完整的加載過程。通過對Dalvik虛擬機的源碼進行修改,增加反模擬器檢測的內核模塊,實現了DexUnpack。
3.1 DexUnpack的框架結構
DexUnpack主要由一個自定義的Android系統完成主要功能,如圖3所示。當加殼APP應用在我們的工具上運行,通過反模擬器檢測模塊,Dex文件內存重建模塊,脫殼應用重建模塊的作用,我們將得到一個脫殼后的應用。后續的安全人員安全分析和殺毒軟件的掃描即可在真正的可執行程序上進行。
3.2 反模擬器檢測
因為加殼代碼一開始就會檢測運行環境,如果發現自身運行在模擬器上就會觸發本身的安全機制,不會進行Dex文件的加載。根據加殼代碼進行模擬器檢測的方法,通過自定義的模塊進行對抗。DexUnpack中實現反模擬器檢測的方法有以下兩種:

圖3 Dexunpack處理加殼應用
(1)隱藏系統API返回的模擬器特征值:系統提供一些API獲得Android設備的電話號碼,IMEI,MAC地址等,在模擬器上這些值都是預定義不變的,通過這些特征很容易判斷運行環境為模擬器。通過加載自定義的HOOK模塊,更改這些返回值即可隱藏真實的運行環境。一部分更改值如表1所示。

表1
(2)隱藏關鍵文件:/dev/socket/qemud和/dev/qemu_ pipe文件是模擬器中的關鍵驅動文件,隱藏這些文件可以隱藏真實的運行環境。隱藏方式同意通過修改File.exits(),當發現有應用在檢測這些路徑時直接返回為空,代表這些文件并不存在。
3.3 Dex文件內存重建
通過上面對于ClassObject對象的加載我們獲得了ClassData的原型數據,但是前面提到加殼程序的動態修改技術使得當前ClassData的原型數據并不是正確的。對于每一個新加載的類,它的初始化函數
當我們得到了正確的ClassData的原型數據,下面需要按照結構體DexClassData重建ClassData。結構體DexClassData的結構如下:


當遍歷重建完全部的ClassData,Dex文件中最關鍵的各個Class的數據我們就重建完成了。下面只需要按照DexFile數據結構和ClassObject數據結構的對應關系重建Dex文件。重建過程如圖4所示:

圖4 數據結構對應關系
4.1 加殼廠商識別
加殼廠商在給應用加殼時會引入明顯的特征,通過加固后的應用的文件信息我們可以容易的判斷加殼的廠商。
娜迦:libchaosvmp.so,libddog.solibfdog.so
愛加密:libexec.so,libexecmain.so
梆梆:libsecexe.so,libsecmain.so,libDexHelper.so
360 :libprotectClass.so,libjiagu.so
通付盾:libegis.so
網秦:libnqshield.so
百度:libbaiduprotect.so
4.2 實驗數據
根據上文提出的方法實現DexUnpack并進行測試。為了測試DexUnpack的通用性與有效性我們選取不同廠商加殼的應用進行測試。測試的結果如下:

表2
從上面的實驗結果可以得出,本方案在對抗虛擬機檢測和脫殼成功率方面具有較好的效果,所以通過修改系統源碼實現自動化脫殼分析是十分可行的方案。
[1]Patrick Schulz.Code Protection in Android(2012)
[2]Chen,K.,Liu,P.,Zhang,Y.:Achieving Accuracy and Scalability Simultaneously in Detecting Application Clones on Android Markets. In:Proceedings of the ACMICSE(2014).
[3]Strazzere,T.:Android-Unpacker(2014).https://github.com/strazzere/androidunpacker.
[4]譚艷華.Android Dalvik即時編譯系統評估與優化.福建:東南大學,2015.
[5]Sabanal,P.:State of the art:Exploring the New Android Kitkat Runtime(2014).
[6]Qian,C.,Luo,X.,Yu,L.,Gu,G.:Vulhunter:Towards Discovering Vulnerabilities in Android Applications.IEEE Micro 35(1),44-53 (2015)
[7]Doha,Qatar.DroidNative:Real-Time Detection of Android Native Code Malware(2015)
[8]Yueqian Zhang,Xiapu Luo,Haoyang Yin.DexHunter:Toward Extracting Hidden Code from Packed Android Applications(2015).
[9]Gartner Inc.:Debunking Six Myths of App Wrapping(2015).http://gtnr.it/1aGJizc.
[10]ZjDroid.https://github.com/halfkiss/ZjDroid.
[11]吳艷霞,張國印.Dalvik虛擬機各模塊機制分析[D].北京:清華大學出版社,2014.
Code Extraction Technology of Packed Android Application Based on Dalvik Virtual Machine
WANG Li-song,FANG Yong
(College of Electronic Information,Sichuan University,Chengdu610065)
With the rapid development of mobile applications,the mobile device of the frequent outbreak of malicious code increasingly plaguing every user's privacy and property security.At the same time a large number of malicious programs use packed protection,avoid antivirus engine scan.Whether the analysis malicious program,or to find the normal program of the loopholes,first of all from the packed program to get the original executable file.Based on the research on the packed technology of Android platform and the mechanism of Dalvik virtual machine,puts forward and realizes a general de-wrapping program DexUnpack.
Dalvik;Android;Packed;Unpacked
1007-1423(2017)07-0045-05
10.3969/j.issn.1007-1423.2017.07.012
王李松(1991-),男,湖北松滋人,碩士,研究方向為Android安全
2016-12-22
2017-02-20
方勇,博士,教授,研究方向為信息安全、網絡信息對抗