◆趙北庚 王劍鋒
Android系統(tǒng)是當(dāng)今使用最廣泛的智能手機系統(tǒng),基于Andoird系統(tǒng)的手機程序類型豐富,功能多樣。逆向分析是指在沒有程序源代碼的情況下,通過將可執(zhí)行文件反編譯成匯編代碼,閱讀分析匯編代碼分析出程序邏輯的方法。Sma1i匯編碼是Android虛擬機使用的機器碼。研究Android程序的Sma1i匯編碼逆向分析,對Android系統(tǒng)的程序功能改進、打補丁和惡意代碼分析有重要的意義?;诖?,設(shè)計和完成了一個實驗,在沒有源代碼的情況下,通過對一個真實的 Android短信木馬程序9555.apk進行反匯編逆向分析,梳理出程序功能。實驗的過程和思路對研究Android程序的逆向分析有積極的意義。
使用apktoo1工具,將9555.apk反匯編為sma1i文件,命令如下:
apktoo1 d 9555.apk outdir
其中,9555.apk是要反編譯的Android程序包,outdir為輸出路徑。得到的輸出文件如圖1所示。
圖1 使用apkToo1反編譯得到的文件
如圖1所示,res文件夾中包含了程序的各種資源文件,如圖片、定義界面的xm1文件、字符串資源、資源索引文件,等;sma1i文件夾里包含了反編譯得到的Sma1i代碼文件,每個Sma1i文件對應(yīng)源代碼中的一個Java文件;AndroidManifest.xm1是此程序的配置文件。
通常一個程序工程中包含多個 Java文件,反編譯也會得到多個Sma1i文件,在逆向分析過程中,可以在AndroidManifest.xm1的app1ication節(jié)點中找到程序入口,如圖2所示。
圖2 在AndroidManifest.xm1中找程序入口
如圖2所示,9555.apk的程序入口是A.sma1i。系統(tǒng)地分析sma1i代碼,應(yīng)從程序入口開始,梳理邏輯,定位程序的走向,根據(jù)程序走向依次分析項目中的各個文件。
在鎖定程序入口文件后,從入口文件開始,以此對每個Sma1i文件進行分析。一個Sma1i文件代碼的結(jié)構(gòu)與一個Java C1ass對應(yīng),包含了實例變量和方法。與X86匯編代碼不同,Sma1i匯編碼中只有“寄存器”概念,而沒有“內(nèi)存地址”的概念。實際上,除了真正的物理寄存器,對內(nèi)存的調(diào)用也被Sma1i抽象成了虛擬寄存器的調(diào)用。Sma1i代碼中的寄存器以字母v開頭,后接編號,如v0、v1、v2等。對于Sma1i代碼分析人員來說,分析程序中數(shù)據(jù)的處理和流向,需要注意各個寄存器中數(shù)值的類型和變化。
整理每個Sma1i文件的代碼,將每個C1ass的類名、父類,以及主要的功能整理成矩形形式,并用虛線箭頭標(biāo)注出調(diào)用關(guān)系,如圖3所示。
圖3 程序部分流程圖
實驗過程中,以一個真實的Android短信木馬9555.apk為例,進行了一次完整的Sma1i匯編碼逆向分析過程。通過本次實驗,總結(jié)出Android程序逆向分析基本流程如下:
(1)通過apktoo1或類似的反匯編工具,將apk程序包反匯編成Sma1i文件。
(2)在AndroidManifest.xm1中查看程序入口。
(3)從程序入口開始,依次分析每個 Sma1i文件,梳理程序邏輯。
(4)根據(jù)分析結(jié)果,繪制流程圖,歸納程序功能。
本文所述的實驗,在沒有源代碼的情況下,對一個真實的Android木馬程序進行了反匯編和逆向分析,并梳理出程序功能?;赟ma1i代碼的Android程序反匯編逆向分析,是分析Android程序功能的有效方法,在惡意代碼調(diào)查、改進軟件功能等領(lǐng)域有重要意義。本文所述的實驗,為后續(xù)更深入的Android程序逆向分析研究打下基礎(chǔ)。在今后的研究中,我們會重點關(guān)注在沒有源代碼的情況下,對Android程序進行動態(tài)調(diào)試的方法和技巧。