樓赟程, 施勇, 薛質(zhì)
(上海交通大學(xué) 信息安全工程學(xué)院,上海,200240)
基于逆向工程的Android惡意行為檢測(cè)方法*
樓赟程, 施勇, 薛質(zhì)
(上海交通大學(xué) 信息安全工程學(xué)院,上海,200240)
由于Android系統(tǒng)應(yīng)用市場(chǎng)的特性導(dǎo)致惡意軟件傳播迅速,對(duì)用戶的手機(jī)乃至個(gè)人隱私造成了十分巨大的危害。本文首先介紹了Android應(yīng)用的逆向技術(shù),然后分析了惡意代碼采用的多種Android代碼隱藏技術(shù)及隱私獲取的代碼特征。針對(duì)這些情況,本文基于Android的逆向工程提出了一種靜態(tài)檢測(cè)和動(dòng)態(tài)檢測(cè)相結(jié)合的惡意行為檢測(cè)方法,可以更加有效的檢測(cè)代碼中的惡意行為。最后通過對(duì)Android樣本應(yīng)用的分析表明此方法的可行性與有效性。
Android;惡意代碼;代碼隱藏;行為檢測(cè)
近年來,智能手機(jī)一直在高速發(fā)展,普及率越來越高。一直以來,Android系統(tǒng)因?yàn)槠溟_源的特性一直在安全層面上被人們所詬病,其惡意軟件的數(shù)量及其惡意行為的嚴(yán)重性也遠(yuǎn)遠(yuǎn)超過了蘋果的IOS系統(tǒng)。隱私竊取、惡意扣費(fèi)、系統(tǒng)破壞、遠(yuǎn)程控制等行為已經(jīng)成為惡意軟件和病毒的主要破壞手段。所以如何對(duì)Android應(yīng)用進(jìn)行惡意行為檢測(cè)室一個(gè)十分重要的工作。
2010年由William Enck等人提出的TaintDroid動(dòng)態(tài)污點(diǎn)跟蹤系統(tǒng)可以說是近年來實(shí)用性和擴(kuò)展性都比較高的惡意行為檢測(cè)系統(tǒng)之一[1]。無論國(guó)外和國(guó)內(nèi)都有許多研究人員對(duì)其進(jìn)行了擴(kuò)展和修補(bǔ)[2-3],故Android上的動(dòng)態(tài)污點(diǎn)跟蹤系統(tǒng)已經(jīng)十分完善了,但其本質(zhì)是不變的。用動(dòng)態(tài)污點(diǎn)跟蹤的方法必須要修改操作系統(tǒng)原始的數(shù)據(jù)保存結(jié)構(gòu),在正常數(shù)據(jù)后添加污點(diǎn)數(shù)據(jù)。所以必須在Dalvik虛擬機(jī)層及framework層進(jìn)行系統(tǒng)源碼級(jí)的修改,并編譯成新的Android系統(tǒng)img文件在某一設(shè)備上進(jìn)行安裝,最后才能對(duì)目標(biāo)Android應(yīng)用進(jìn)行檢測(cè)。這樣的過程是十分繁瑣的,且導(dǎo)致系統(tǒng)本身修改需要重新編譯和安裝,消耗大量的時(shí)間和精力。
國(guó)外曾有學(xué)者對(duì)1260個(gè)惡意軟件進(jìn)行了分析,其中有86%是重打包(Repackaging)程序[4],由此可見重打包是近幾年惡意軟件傳播的主要途徑。針對(duì)此種現(xiàn)象,本文提出了基于逆向工程的應(yīng)用行為檢測(cè)方法,這是一種針對(duì)單個(gè)目標(biāo)應(yīng)用程序進(jìn)行的靜態(tài)和動(dòng)態(tài)相結(jié)合的檢測(cè)方法。其實(shí)無論是靜態(tài)的代碼分析還是動(dòng)態(tài)的行為分析都無法單獨(dú)地、明確地把一個(gè)應(yīng)用定性為惡意軟件[5],但兩者的結(jié)合可以大大增加判斷的準(zhǔn)確程度。
逆向工程是產(chǎn)品設(shè)計(jì)和實(shí)現(xiàn)的再現(xiàn)工程,通過逆向工程可以分析出產(chǎn)品的處理流程、組織結(jié)構(gòu)、功能特性等等內(nèi)在要素。而在軟件的逆向工程領(lǐng)域,主要是把可執(zhí)行文件或安裝文件進(jìn)行反編譯得到類似源碼的可讀代碼并進(jìn)行分析、破解、學(xué)習(xí)。而在Android逆向工程領(lǐng)域,我們主要針對(duì)Android應(yīng)用程序的APK文件進(jìn)行拆分、反編譯、代碼分析、代碼植入、組裝、簽名等工作。
2.1 APK文件結(jié)構(gòu)
Android的應(yīng)用程序的APK文件,其本質(zhì)就是ZIP壓縮文件,修改其后綴名解壓后得到的文件一般情況下有[6]:
1)META-INF文件夾:其中主要存放簽名信息,保證APK的完整性和安全性;
2)res文件夾:其中存放了圖片之類的資源文件;
3)AndroidManifest.xml配置文件:其中寫著權(quán)限(permission)聲明、接收器(receiver)靜態(tài)聲明、服務(wù)(service)聲明,活動(dòng)(activity)聲明等。通過閱讀此XML配置文件可以快速地了解應(yīng)用的總體結(jié);
4)classes.dex文件:此文件為java源碼編譯后生成的dalvik字節(jié)碼文件。由于Android使用的dalvik虛擬機(jī)與標(biāo)準(zhǔn)的java虛擬機(jī)是不兼容的,dex文件與class文件相比,不論是文件結(jié)構(gòu)還是opcode都不一樣。普通的java反編譯工具是無法處理dex文件的,一般使用dex2jar進(jìn)行處理;
5)resources.arsc:編譯后的二進(jìn)制資源文件。
2.2 Android逆向方法
Android逆向流程從反編譯后的生成代碼可分為兩種方法。
方法一是把classes.dex文件反編譯為java代碼,使用的工具是上文提到的dex2jar,反編譯成功后的代碼可以通過jd-gui來進(jìn)行閱讀。這種方法的優(yōu)點(diǎn)是轉(zhuǎn)化后的java代碼清晰易懂,但無法重新組裝生成APK,只能作為一種輔助的代碼閱讀手段。并且這種逆向方法很容易被混淆,從而導(dǎo)致生成的代碼十分混亂,甚至?xí)胁豢勺x代碼存在。
方法二則是把classes.dex文件反編譯為smali代碼。Smali代碼是一種面向?qū)ο蟮膮R編代碼,其可讀性較強(qiáng),修改后的smali代碼還可以重新打包和簽名生成新的APK文件。而在本文提出的行為檢測(cè)方法也將采用此種逆向方法。反編譯成smali代碼常用的工具是apktool,此工具集合了解壓縮、XML文件解析、smali正反編譯,組裝等各個(gè)功能。
3.1 Android系統(tǒng)安全機(jī)制
Android系統(tǒng)是基于Linux系統(tǒng)進(jìn)行開發(fā)的手機(jī)操作系統(tǒng),所以其安全機(jī)制很大程度依賴了Linux的特性。在Linux系統(tǒng)中,一個(gè)用戶ID(user id)識(shí)別一個(gè)給定用戶,而在Android系統(tǒng)中,一個(gè)用戶ID識(shí)別一個(gè)應(yīng)用程序。應(yīng)用程序在安裝時(shí)就被分配了一個(gè)用戶ID,這個(gè)用戶ID是保持不變的,這就是沙箱的概念[7]。通過此方法Android系統(tǒng)分離了應(yīng)用程序間的權(quán)限和資源,從而保護(hù)了程序的獨(dú)立性。
而對(duì)于單個(gè)Android應(yīng)用程序,Android則采用了權(quán)限聲明機(jī)制來限制應(yīng)用程序。權(quán)限根據(jù)風(fēng)險(xiǎn)級(jí)別可以分為4類[8]:
表1 Android系統(tǒng)安全級(jí)別
3.2 Android惡意代碼
Android惡意代碼泛濫的主要原因正是Android權(quán)限機(jī)制所造成的。雖然用戶在安裝應(yīng)用程序時(shí)能夠完整查閱應(yīng)用本身需要的所有權(quán)限,但由于如今應(yīng)用程序功能多元化,所以幾乎所有應(yīng)用程序都會(huì)申請(qǐng)包括通訊錄、聯(lián)系人、地理位置等涉及隱私信息的權(quán)限。而用戶若要使用這些應(yīng)用程序,則必須選擇確定。久而久之,安裝應(yīng)用程序時(shí)給出的權(quán)限提示形同虛設(shè),這就給很多重打包程序有了可乘之機(jī)。
例如類似Flappy Bird這樣的著名游戲,本身的運(yùn)行并不需要多少權(quán)限,但許多攻擊者會(huì)把它作為目標(biāo),植入惡意代碼后,上傳到第三方應(yīng)用市場(chǎng)。當(dāng)用戶下載后,就會(huì)竊取用戶敏感信息或在后臺(tái)發(fā)送短信、撥打電話,從而導(dǎo)致用戶遭受經(jīng)濟(jì)損失或者隱私權(quán)上的侵犯[9]。
3.3 Android代碼隱藏方法
Android代碼在其被反編譯成smali代碼后,仍舊具有相當(dāng)高的可讀性,所以許多惡意代碼會(huì)對(duì)自身進(jìn)行加密和隱藏,保護(hù)自身不被殺毒軟件或者檢測(cè)軟件發(fā)現(xiàn)。Android的代碼隱藏方法主要有如下幾種方法:
(1)反射調(diào)用
反射(Reflection)是Java語言的特性之一,在Java中使用反射技術(shù)可以直接操作程序的內(nèi)部屬性,并可以更加靈活地控制程序的運(yùn)行。而在Android中如果惡意代碼使用反射技術(shù)動(dòng)態(tài)調(diào)用其惡意方法則可以大大增加檢測(cè)者靜態(tài)調(diào)試的難度。
以發(fā)送短信這個(gè)功能為例,正常的Android代碼如下所示:
SmsManager smsManager=SmsManager.getDefault();
smsManager.sendTextMessage("5554",null,"content",null,null);
使用反射調(diào)用后代碼變?yōu)?
SmsManager smsManager=SmsManager.getDefault();
Class>clazz=Class.forName("android.telephony.Sms-Manager");
Method m1=clazz.getMethod("sendTextMessage",java.lang.String.class,java.lang.String.class,java.lang.String.class,android. app.PendingIntent.class,android.app.PendingIntent.class);
m1.invoke(smsManager,"5554",null,"content",null,null);
最重要的是對(duì)這兩段代碼進(jìn)行逆向得到的smali代碼也會(huì)完全不同,另外由于原來的方法名現(xiàn)在成為了method變量,原來的類名直接變成了string變量,所以這些變量甚至可以通過網(wǎng)絡(luò)進(jìn)行傳遞,更好的保障了代碼的隱蔽性。
(2)動(dòng)態(tài)加載
Android系統(tǒng)本身提供了DexClassLoader這一個(gè)方法來支持應(yīng)用程序在運(yùn)行過程中動(dòng)態(tài)加載包含classes.dex文件的jar包或者apk文件,再結(jié)合Java的反射調(diào)用技術(shù),就可以執(zhí)行非應(yīng)用程序部分的代碼,其基本的構(gòu)造函數(shù)如下:
public DexClassLoader(String dexPath,String optimizedDirectory,String libraryPath,ClassLoader parent)
有了這種方法后,惡意代碼甚至可以把核心執(zhí)行代碼放在網(wǎng)絡(luò)端,在需要運(yùn)行的時(shí)候下載下來后,再使用動(dòng)態(tài)加載的方法調(diào)用它。這同樣使得惡意代碼被逆向的難度增加。
(3)代碼混淆
代碼混淆的方法有許多種,第一種是類名處理,即把原先有意義比較規(guī)整的類名和包名用abcd等簡(jiǎn)單字母所代替,減少代碼可讀性和邏輯性。
第二種是字符串處理,在Android逆向分析的過程中,利用字符串鎖定目標(biāo)代碼是一種比較常見的做法,所以許多代碼為了保護(hù)自身,都會(huì)單獨(dú)用Native Code寫一個(gè)加密解密類,然后在Java代碼中都使用加密后的字符串,避免被鎖定。
第三種是代碼亂序,這里的亂序是指對(duì)逆向后的代碼在保證其運(yùn)行正確性的前提下進(jìn)行亂序,隨后重新打包成正常的應(yīng)用程序。這樣的方法主要針對(duì)使用dex2 jar進(jìn)行逆向的分析者。這樣生成的應(yīng)用程序如果被dex2 jar逆向所得到的java代碼,其代碼長(zhǎng)度會(huì)大大增長(zhǎng),且邏輯性較差,甚至?xí)a(chǎn)生一些逆向上的錯(cuò)誤。
4.1 檢測(cè)流程
圖1 行為檢測(cè)流程
檢測(cè)流程如上圖所示,主要流程為:
1)對(duì)被檢測(cè)應(yīng)用程序進(jìn)行反編譯,得到smali代碼;
2)對(duì)smali代碼進(jìn)行靜態(tài)分析,主要方法是針對(duì)敏感權(quán)限的特定函數(shù)進(jìn)行檢查,從而得到靜態(tài)分析結(jié)果;
3)針對(duì)在步驟2中找到的特定函數(shù),植入代碼;
4)重打包成為新的可用APK應(yīng)用程序;
5)將新生成的應(yīng)用程序運(yùn)行于Android操作系統(tǒng)上;
6)人工的或自動(dòng)化的動(dòng)態(tài)檢測(cè)其行為是否具有惡意性,從而得到動(dòng)態(tài)分析結(jié)果;
7)綜合靜態(tài)和動(dòng)態(tài)的分析結(jié)果得到最終結(jié)果。
4.2 靜態(tài)檢測(cè)
在Android應(yīng)用程序中,惡意行為通常與權(quán)限有較大的相關(guān)性,而權(quán)限又與關(guān)鍵函數(shù)有直接聯(lián)系,其一般聯(lián)系如下表所示[10]:
表2 Android行為權(quán)限函數(shù)對(duì)應(yīng)關(guān)系
其中獲取短信、獲取通訊錄和獲取通話記錄,這三種行為都是從系統(tǒng)數(shù)據(jù)庫(kù)中獲得相應(yīng)的隱私信息,其代碼結(jié)構(gòu)十分雷同,主要區(qū)別在于query請(qǐng)求的URI。而獲取位置信息的官方API是通過getlastknownlocation函數(shù)進(jìn)行獲取的,但如今第三方地圖服務(wù)比較多,所以第三方地圖類庫(kù)的繼承也需要關(guān)注。短信攔截則需要注冊(cè)BroadcastReceiver,分為靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)兩種方法。
所以對(duì)反編譯后生成的smali代碼,主要采用的就是模式匹配的方法,而模式匹配的對(duì)象則是函數(shù)名稱。當(dāng)然如果應(yīng)用程序擁有這些函數(shù),也無法說明它是惡意程序。這樣的靜態(tài)檢測(cè)目的是為被檢測(cè)程序列出可疑點(diǎn),是否有惡意行為應(yīng)根據(jù)在動(dòng)態(tài)檢測(cè)中的表現(xiàn),兩者相結(jié)合一起進(jìn)行判斷。
4.3 代碼植入
在經(jīng)過靜態(tài)檢測(cè)獲取應(yīng)用程序的惡意行為可疑點(diǎn)后,可以針對(duì)其函數(shù)進(jìn)行代碼植入或代碼替換,這里的代碼植入主要是為了幫助后續(xù)的動(dòng)態(tài)分析步驟。
以發(fā)送短信函數(shù)為例,在java環(huán)境下,函數(shù)的形式和變量如下:
public void sendTextMessage(String destinationAddress,String scAddress,String text,PendingIntent sentIntent,PendingIntent deliveryIntent)
而在反編譯后得到的smali語句則如下:
invoke-virtual/range{v2..v7},Landroid/telephony/Sms-Manager;->sendTextMessage(Ljava/lang/String;Ljava/lang/ String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/ app/PendingIntent;)V
我們可以對(duì)此函數(shù)進(jìn)行替換,使用我們重新封裝過的sendMessage函數(shù)。在新的封裝函數(shù)中,我們并不需要同樣發(fā)送短信,只需要保持新的函數(shù)與原函數(shù)輸入、輸出一致就可以保證重打包后的應(yīng)用程序能夠正常運(yùn)行。而在函數(shù)主體中,我們可以加入log語句或者本地log文件輸出,這樣就可以在隨后的動(dòng)態(tài)檢測(cè)過程中,在不運(yùn)行真正的隱私獲取函數(shù)的情況下,同時(shí)輸出原函數(shù)調(diào)用的變量。
以上文的sendTextMessage函數(shù)為例,其中的v3變量就是目標(biāo)的電話號(hào)碼,v5變量就是所要發(fā)送的內(nèi)容。我們?cè)诤瘮?shù)主體就可以把這兩個(gè)變量輸出來查看函數(shù)調(diào)用狀況。
4.4 動(dòng)態(tài)檢測(cè)
動(dòng)態(tài)檢測(cè)則是把經(jīng)過代碼植入后形成的新APK文件裝入運(yùn)行環(huán)境(可以是虛擬機(jī)環(huán)境,可以是真實(shí)手機(jī)環(huán)境)進(jìn)行運(yùn)行。由于代碼植入過程中植入log輸出,通過這些log輸出可以清晰的查看到此APK運(yùn)行過程中敏感函數(shù)調(diào)用的參數(shù)究竟是什么樣的,是否真的存在惡意行為。
4.5 實(shí)驗(yàn)樣例
現(xiàn)針對(duì)一樣本程序進(jìn)行分析,可以得到如下分析結(jié)果:
圖2 樣本分析結(jié)果
通過靜態(tài)檢測(cè)得知共有4個(gè)敏感權(quán)限,其中分別對(duì)應(yīng)了2個(gè)函數(shù)及一個(gè)第三方類。在程序主體調(diào)用過程中,共有1個(gè)sendT-extMessage函數(shù),6個(gè)BDLocationListener的使用。而有關(guān)INTERNET權(quán)限的openConnection函數(shù)則存在于10個(gè)文件,共出現(xiàn)了19次。
使用openConnection函數(shù)進(jìn)行連接后,主要通過GET方法進(jìn)行網(wǎng)絡(luò)溝通,所以我們對(duì)此方法添加log信息,輸出HTTP交互中得到的信息。而BDLocationListener不是函數(shù),其關(guān)鍵是找到真正的經(jīng)緯度變量。在代碼中我們可以找到last_longitude以及l(fā)ast _latitude變量,這兩個(gè)string變量都在某一文件中調(diào)用并存入SharedPreferences中去。所以與這兩個(gè)string相對(duì)應(yīng)的鍵值對(duì)即為獲得的經(jīng)緯度。
靜態(tài)分析完成后,進(jìn)行代碼植入和到動(dòng)態(tài)分析,通過運(yùn)行日志可以發(fā)現(xiàn)此程序的網(wǎng)絡(luò)連接主要返回信息為商家廣告推送,其中采用了經(jīng)緯度作為請(qǐng)求變量,在某種意義上濫用了用戶的位置信息。而經(jīng)緯度的獲取則在程序開啟后就立刻進(jìn)行了。最后發(fā)送短信的函數(shù)則是對(duì)號(hào)碼106901605571發(fā)送了手機(jī)的IMEI碼。
最后可以得到結(jié)論:此應(yīng)用的權(quán)限有所超標(biāo),特別在位置信息獲取及廣告信息的推送上侵犯了用戶的隱私。但由于沒有更多的敏感權(quán)限,隱私泄漏程度一般。
本文提出了一種基于逆向工程的靜態(tài)和動(dòng)態(tài)相結(jié)合的Android應(yīng)用程序檢測(cè)方法。相對(duì)純粹基于權(quán)限或基于代碼的靜態(tài)檢測(cè)方法,此方法可以更系統(tǒng)、更具體、更準(zhǔn)確的觀察被檢測(cè)程序的行為模式和完整運(yùn)行流程,定位到惡意行為的準(zhǔn)確位置,并最終給出一個(gè)比較公正的評(píng)價(jià)和判斷。與傳統(tǒng)檢測(cè)方法相比,這種方法的優(yōu)點(diǎn)在于在應(yīng)用層面上進(jìn)行檢測(cè),獨(dú)立于dalvik虛擬機(jī)層,檢測(cè)對(duì)象是應(yīng)用的代碼特征、應(yīng)用行為以及相關(guān)行為函數(shù)傳遞的參數(shù),檢測(cè)環(huán)境與應(yīng)用的真實(shí)運(yùn)行環(huán)境一致,且靜態(tài)與動(dòng)態(tài)相結(jié)合,避免誤報(bào)。此檢測(cè)方法可以在惡意代碼檢測(cè)、病毒檢測(cè)、應(yīng)用程序防篡改檢測(cè)等方面得到廣泛的應(yīng)用,并能給出比較詳盡的分析結(jié)果。同時(shí)在后續(xù)研究中,可以在靜態(tài)與動(dòng)態(tài)分析的過程中擴(kuò)展代碼特征庫(kù)或行為特征庫(kù),實(shí)現(xiàn)自動(dòng)化的檢測(cè)流程。
[1] ENCKW,GILBERT P,CHUN BG,etal.TaintDroid:An Information-Flow Tracking System for Realtime Privacy Monitoring on Smartphones[C].//the 9th USENIX Conference on Operating Systems Design and Implementation.Berkeley:USENIX Association.2010:1—6.
[2] 秦中元,徐毓青,梁彪等.一種Android平臺(tái)惡意軟件靜態(tài)檢測(cè)方法[J].東南大學(xué)學(xué)報(bào)(自然科學(xué)版),2013,(6):1162-1167.
[3] BERESOFRD A R,RICE A,SKEHIN N,et a1.MockDroid: Trading Privacy for Application Functionality on Smartphones [C]//Proc.of the 12th Workshop on Mobile Computing Systems and Applications.Phoenix,USA,2011.
[4] ZHOU YAJIN,JIANG XUXIAN.Dissecting Android Malware: Characterization and Evolution[C]//2012 IEEE Symposium on Security and Privacy.2012:95-109.
[5] JACOBG,DEBAR H,F(xiàn)ILIOL E.Behavioral detection ofmalware:from a survey towards an established taxonomy[J]. Journal in computer Virology,2008,4(3):251-266.
[6] 賈菲,劉威.基于Android平臺(tái)惡意代碼逆向分析技術(shù)的研究[J].信息網(wǎng)絡(luò)安全,2012(4):61-63,84.
[7] 楊廣亮,龔曉銳,姚剛等.一個(gè)面向Android的隱私泄露檢測(cè)系統(tǒng)[J].計(jì)算機(jī)工程,2012,38(23):1-6.
[8] MICHAELGRACE,WU ZHOU,XUXIAN JIANG and AHMAD-REZE SADEGHI:Unsafe Exposure Analysis of Mobile In-App Advertisements[C]//the 5th ACM Conference on Security and Privacy in W ireless and Mobile Networks.2012.
[9] 馮博,戴航,慕德俊等.Android惡意軟件檢測(cè)方法研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014(2):149-152.
[10] Android.Manifest.permission[EB/OL].http://developer.android.com/reference/android/Manifest.permission.html.
Android M alicious Behavior Detection based on Reverse Engineering
LOU Yun-cheng,SHIYong,XUE Zhi
(School of Information Security,Shanghai Jiao Tong University,Shanghai200240,China)
The characteristics of application market for Android system would usually lead to the rapid spread of themalwares,thus cause tremendous harm to the user′smobile phone and personal privacy.Firstly,the reverse technology of Android application is described,and then the code-behind technology used by Android malwares and the code characteristics of privacy access are analyzed. In light of this,amalicious behavior detectionmethod based on the reverse engineering of Android and in combination with static detection and dynamic detection is proposed,and thismethod could detectmalicious behaviormore effectively.Finally,the analysis of Android sample application indicates the feasiblility and effectiveness of thismethod.
Android;malicious code;code-behind;behavior detection
TN929
A
1009-8054(2015)04-0083-05
樓赟程(1989—),男,碩士,主要研究方向?yàn)锳ndroid手機(jī)安全;
2014-11-19
中國(guó)信息安全測(cè)評(píng)中心科研項(xiàng)目資助(No.CNITSECKY-2013-009/2)
施 勇(1979—),男,博士,講師,主要研究方向?yàn)榫W(wǎng)絡(luò)與信息安全;
薛 質(zhì)(1971—),男,博士,教授,主要研究方向?yàn)榫W(wǎng)絡(luò)與信息安全?!?/p>