李天輝,王艷青
(沈陽師范大學軟件學院,遼寧沈陽110036)
Android惡意代碼的逆向分析
李天輝,王艷青
(沈陽師范大學軟件學院,遼寧沈陽110036)
本文主要研究基于逆向工程的Android應用程序中惡意代碼的分析方法。首先,通過逆向工程得到Android應用程序的Java源代碼和資源文件,然后根據源代碼分析程序的功能、結構;根據manifest資源文件分析程序組件的各種權限,再結合惡意代碼的行為特征判斷是否存在惡意代碼及其危害。也可以據此方法研究Android系統受攻擊的原因及防御辦法并進一步發現惡意代碼的特征。
逆向工程;android;惡意代碼;APK
移動互聯網發展越來越快,Android手機應用程序也越來越豐富。但由于Android系統的開放性,應用程序分發越來越容易,為惡意軟件提供了良好的傳播環境,這樣就導致了Android系統安全問題日益突出。手機吸費、木馬和病毒等惡意軟件的迅速滋生及利用Android惡意軟件進行網絡犯罪活動的日益增多,Android手機用戶正面臨前所未有的安全風險。2010年,Android惡意軟件的定義剛出現在Dr.Web病毒數據庫中,但截止2014年底,Dr.Web病毒數據庫中的有關Android惡意軟件總定義數量達到5 681個,增加了2 867種新成員,包括各種不必要的、惡意的、以及含有潛在風險的應用程序。這一數字比2013年增長了102%,比2010年增長了189倍(或18,837%)。這些數據表明惡意軟件的檢測與防范工作面臨了嚴峻的挑戰。
目前,對基于Android系統的惡意軟件的分析方法還在處于探索階段。很多針對惡意軟件的分析技術,一般只關注結果,缺乏對攻擊方法、攻擊過程、惡意軟件類型特征等更詳細信息的分析與取證。為解決此類問題,本文主要研究Android惡意代碼的逆向分析方法。此方法基于對Android應用程序進行逆向工程,然后再分析Android應用程序的設計結構、功能及各種組件的訪問權限等,再對比程序原來的基本功能與惡意代碼的行為特征,進一步判斷出是否有惡意代碼存在及其危害。
Android是由Google公司研發的基于Linux平臺的移動設備操作系統,它由Linux內核層、系統庫與運行環境層、應用框架層、應用層4個層次組成的操作系統。
Linux內核是硬件和軟件之間的抽象層,主要包括核心和驅動兩部分,核心包括內存管理、進程管理、網絡協議棧、安全性和驅動模型等。驅動包含顯示驅動(DisplayDriver)、音頻驅動(AudioDrive-r)、無線局域網驅動(WifiDriver)等。
由于內核層的進程往往以較高的權限運行,所以在系統安全方面,一旦出現漏洞[1]可能導致高級權限泄露。內核層的研究集中于將SELinux引入內核層以增強系統的安全性能[2]。
系統庫是Android程序運行所需的一些C/C++庫。運行環境包含一個核心庫,提供了Java編程語言核心庫的大多數功能。每個應用程序都在它自己的進程中運行,都各自擁有一個獨立的Dalvik虛擬機實例,如圖1所示。Dalvik是基于寄存器的Java虛擬機,而不是基于棧的虛擬機,并且還優化了內存資源的使用及同時支持多個虛擬機的特點。

圖1 Dalvik虛擬機實例
此部分為Android應用程序提供系統的API,在框架安全性限制的前提下,開發者可以任意訪問核心應用程序所使用的API框架,重新調用各種組件和服務,包括應用程序開發所需要的界面管理、數據訪問、應用包的管理、應用層的消息傳遞、定位管理、電話管理以及Google Talk服務等功能。
應用程序框架層和系統庫層的安全威脅同樣來自于自身的漏洞,但由于Android系統的權限機制、簽名機制和沙盒機制[3]的良好設計,實現了鑒別開發者、限制應用程序行為和保障應用程序獨立運行的功能,所以暴漏出的安全漏洞較少。
Android最上層提供了移動互聯設備所需要的各種應用程序,如SMS短消息程序、Email客戶端、日歷、瀏覽器、聯系人管理、地圖程序等。
Android程序是用Java語言進行開發的,傳統的Java程序運行是通過JVM虛擬機將源文件編譯成Java字節碼運行。在Android程序編碼完成后,首先將Java源代碼轉換為字節碼,再用DX工具將字節碼文件轉換成.dex格式的文件,最后.dex格式的文件在Dalvik虛擬機上運行。Dalvik虛擬機要依賴Linux內核一些功能才能運行,例如:線程機制、底層內存管理機制等操作系統管理機制。
APK即Android程序包文件,是Android系統應用程序默認安裝文件格式。APK英文全稱為“application package file”。任何一個Android程序想要在Android設備上運行,首先要進行編譯,然后再被打包成APK文件。APK文件基于zip文件格式,與jar文件的構造方式相似,可通過應用程序項目文件在 Eclipse開發環境中的目錄進行結構分析。
逆向工程也稱為反向工程(Reverse Engineering)[4],其含義是根據存在的結果來分析推導出具體的原因。對一個已經發布的應用程序,可以通過逆向工程得到其源代碼,然后根據項目文件及源代碼分析其程序結構和設計方案。當然也能用逆向分析方法來分析程序中否存在安全隱患及惡意代碼[5]。不過,也有部分必有用心的開發者用逆向分析的方法在源程序中故意添加一些惡意代碼。
APK是將Java源程序編譯后的.class文件打包成.jar文件后再打包成classes.dex的文件包,dex格式文件可以直接在Android系統中的Dalvik虛擬機上運行。這是一個逐步優化的編譯過程。Dex格式文件的指令碼屬于Dalvik虛擬機專有的指令集,專門為移動操作系統優化過,與標準Java的.class文件相比,它體積小,運行效率高。最后被打包成.apk文件進行發布。明晰了Android應用程序的封裝過程,再把APK文件反向解析出Java源程序就是Android應用程序的逆向工程。
Android 應用程序逆向工程需用到 Winrar、dex2jar、JD-GUI、apktool等工具,過程分4步。工程流程圖如圖2所示,下面分別進行詳細說明。

圖2 Android逆向工程流程圖
1)用解壓工具解壓縮APK文件
可以直接把APK文件的擴展名修改成.zip,然后解壓,獲取classes.dex文件,這個就是打包后的class文件。
2)使用dex2jar將classes.dex反編譯為jar文件
將classes.dex文件復制到dex2jar路徑下,使用 Windows的命令提示符切換到dex2jar所在目錄,執行命令如下:
dex2jar.batclasses.dex
命令執行后會生成classes.dex.dex2jar.jar文件。
3)使用JD-GUI查看反編譯后的jar文件
JD-GUI界面是Windows窗口模式,直接選擇路徑打開classes.dex.dex2jar.jar文件即可查看原Java源代碼。
4)獲取資源文件、xml配置文件等
由于Android應用程序的圖片等資源文件都做了二進制壓縮,直接解壓的xml文件以及圖片文件都是亂碼。所以需要用到apktool工具獲取原來的資源文件。apktool工具有三個文件,并放在同一個目錄下,分別為apktool.jar、apktool.bat、aapt.exe。然后把要反編譯的APK文件復制到apktool目錄下,然后打開命令提示符,輸入命令即可自動進行反編譯。命令如下:
apktool d MusicPlayer.apk MusicPlayer
apktool是命令,d是反編譯,MusicPlayer.apk和 MusicPlayer分別為要反編譯的文件名和反編譯后資源文件存放的文件夾名,前者要和實際文件名一致,后者可任意命名。
在得到的資源文件夾中,其中res文件是資源文件,xml文件是對應的xml配置文件[6]。
對Android應用程序逆向工程后,就可以得到應用項目的Java源代碼及xml配置等文件,然后再對這些文件進行分析。逆向工程后得到的程序源代碼行數以萬計,盲目分析效率很低,需要找到程序的關鍵點進行分析。對Android應用程序惡意代碼的分析主要有2個方法。下面以常見的惡意代碼特征[7]進行分析和說明。
1)Android系統中的惡意代碼通常會偷偷地發送付費短信,來實現惡意扣費的目的,如下java代碼可以實現此功能。

如果在逆向工程中發現有類似代碼并且原應用程序并沒有此項功能,則說明此段代碼極可能是惡意代碼。
2)啟動后臺服務
惡意代碼通常能偷偷地在系統后臺啟動一些Service組件程序來實現其非法操作,要啟動Service通常先繼承BroadcastReceiver類,再通過startActivity()函數實現自啟動。Broadcast Receiver組件可以接收一種或多種Intent組件作為觸發事件,當一個BroadcastReceiver組件被觸發后,系統就會通知相應程序來啟動Service組件。由于Service具有靜默運行的特點,用戶很難發現,惡意代碼一般以android.content.Context.startServiee()函數來啟動后臺Service組件。

如果在逆向工程中發現有類似后臺啟動的服務代碼,且與原應用程序功能不符,則很可能為惡意代碼。
3)插入瀏覽器書簽
在android系統瀏覽器中插入瀏覽器書簽也是惡意代碼慣用的推廣手法,下面的java代碼就可以實現在瀏覽器中插入書簽。

如果在逆向工程中發現有類似代碼,則說明該程序至少有惡意推廣的意圖。
Androidmanifest.xml文件記錄著應用程序的一些基本信息,包括應用程序的包名、系統發行版本及各種組件的注冊權限等。根據對APK文件中的androidmanifest.xml的權限列表進行分析,例如注冊的Receiver列表及Service列表,如果該列表中的權限與原應用程序基本功能不符,極有可能是惡意代碼。分析配置文件權限時,還要對
前面提到惡意代碼自啟動功能要想實現,Receiver許可必須要完成配置,這樣才能允許接收系統啟動消息。該功能在AndroidManifest.xml中以如下代碼來實現。

書簽如果要成功實現,AndroidManifest.xml中也必須進行權限注冊,有關xml代碼示例如下。

實現任意惡意代碼的行為都需要配置權限許可,而Androidmenifest.xml是android應用程序配置權限許可的必用的文件,所以對Android程序逆向工程后首先對配置文件進行檢測也是一個可提高效率的辦法。
Android惡意代碼的逆向分析方法是基于對Android系統的應用程序進行逆向工程,即反向編譯APK程序包,獲取項目配置文件Anroidmanifest.xml和應用程序的Java源程序,然后再去分析程序的代碼結構、功能及各組件的運行權限等。據此研究惡意代碼的各種特征行為及系統受攻擊的原因和防御方法。
[1]CokerR.Porting nsa security enhanced linux to hand-held devices[C]//proc of Linux Symp.Ottawa:Linux Symp Inc.2003:117-127.
[2]Shabtai A,Fledel Y,Elovici Y.Securing Andorid powerred mobile devices using SELinux[J].Security & Privacy,2010,8(3):36-44.
[3]GoogleInc.Andorid security[EB/OL].[2013-06-26].https://source.android.com/tech/security/.
[4]Schmidt A-D,Bye R,Schmidt H-G,et al.Static analysis of executables for collaborative malware detection on Android[C] //2009 IEEE International Conference onCommunications.Dresden,Germany,2009:1-5.
[5]賈菲,劉威.基于Android平臺惡意代碼逆向分析技術的研究[J].技術研究,2012(04):61-63.
[6]關立勛.Android應用開發深入學習實錄[M].北京:電子工業出版社,2013.
[7]李俊.Android系統源代碼分析[M].北京:中國鐵道出版社,2015.
ReverseAnalysis of Android's Malicious Code
LI Tian-hui1,WANG Yan-qing2
(College of Software,Shenyang Normal University,Liaoning Shenyang 110036,China)
Analysis method of malicious code in Android application based on reverse engineering is principally studied.Firstly,java source code and resource files of Android application are acquired via reverse engineering.And then in accordance with the function and structure of java source code,and with the manifest resource file,various competences of program components are analyzed.Finally,in combination with the behavior of malicious code,whether exist the malicious code and its harm is determined.This method could also be applied to studying the being-attacked cause and defense of Android system and further finding the characteristics of malicious code.
Android; reverse engineering; malicious code; APK
TP393 [文獻標志碼]A [文章編號]1009-8054(2016)04-0095-04
2015-07-17
李天輝(1976—),男,碩士,講師,主要研究方向為計算機網絡,信息安全;
王艷青(1961—),男,碩士,副教授,主要研究方向為信息安全,計算機網絡。