Android應(yīng)用程序分析主要有靜態(tài)分析和動(dòng)態(tài)分析兩種,常見的靜態(tài)分析工具是Apktool、dex2jar以及jdgui。今天突然主要到Google code上有個(gè)叫做androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析處理功能。很值得學(xué)習(xí)和分析。
androguard項(xiàng)目主頁:http://code.google.com/p/androguard/
androguard是基于python的,將Apk文件中的dex文件,類,方法等都映射為python的對(duì)象,項(xiàng)目主頁介紹了androgurad的特性,簡單來說,androguard提供了apk文件的反向工程,惡意軟件檢測和威脅評(píng)估,還有程序行為可視化。功能相當(dāng)豐富,是分析apk的好幫手。
androguard的部署配置
androguard是基于python的,所以無論windows,linux還是mac os,只要能運(yùn)行python的都可以運(yùn)行androguard。
我的軟件環(huán)境是Ubuntu12.04 64位、java 1.6、 python 2.7.
androguard的安裝可以參考Wiki,我基本按照這個(gè)步驟進(jìn)行,有些地方是需要注意的。
1. 獲得androguard。 我是從Downdload里直接下載的zip包,并沒有采用hg工具clone,也沒有使用pre-installed Virtual Machine。將zip包放到工作目錄下,解壓縮。
2. 安裝所需的python模塊。 為了能夠使用所有的功能,需要安裝很多的python模塊,例如androdd.py需要pydot來生成圖片,androrisk.py需要pyfuzzy,akpiewer.py需要networkx。這些模塊有的可以直接apt-get install安裝,有些找不到,可以直接百度搜索,然后下載zip包解壓縮后執(zhí)行python setup.py install來安裝。具體需要的模塊請(qǐng)參考Wiki,安裝不全的也可以在運(yùn)行時(shí)根據(jù)錯(cuò)誤提示再進(jìn)行安裝。
3.in elsim/elsign/formula/Makefile: add the appropriate include directory where to find muParser.h. For example:
CFLAGS += -I/usr/include/muParser
in elsim/elsign/libelsign/Makefile, add the appropriate include directory for muParser.h and python. Example:
CFLAGS += -I/usr/include/muParser -I/usr/include/python2.7
4. 進(jìn)入androguard目錄,執(zhí)行make。
至此,androguard的安裝工作完成,androguard目錄下的所有py文件都是一個(gè)工具,用-h查看幫助,例如:
androguard的使用
上圖中所有綠色的py文件都是可用的工具,下面我介紹說明常用到的幾個(gè)。
androcsign.py:
androcsign.py用于添加apk文件的簽名信息到一個(gè)數(shù)據(jù)庫文件中。Androguard工具目錄下的signatures/dbandroguard文件為收集的惡意軟件信息數(shù)據(jù)庫。在開始使用androcsign.py前需要為apk文件編寫一個(gè)sign文件,這個(gè)文件采用json格式保存。前文提到次工具可以檢測惡意程序,是因?yàn)橛袗阂獬绦虻暮灻麕欤莝ignatures目錄下的dbandroguard文件,此目錄中的.sign文件為提供了json簽名文件的范例,我看這個(gè)文件只能是手動(dòng)去寫了。
json范例:
[ { "SAMPLE":"apks/5aff5198c2fe5798bd7f1519dab0cd4ee737d5d2.apk" }, { "BASE":"AndroidOS", "NAME":"Plankton", "SIGNATURE":[ { "TYPE":"METHSIM", "CN":"Lcn/plankton/device/android/service/AndroidMDKService$SNChecker;", "MN":"isRegistered", "D":"()Z" } ], "BF":"0" } ]
SAMPLE指定需要添加信息的apk文件。BASE指定文件運(yùn)行的系統(tǒng),目前固定為AndroidOS。NAME是該簽名的名字。SIGNATURE為具體的簽名規(guī)則,其中TYPE用來指定簽名的類型,METHSIM表示的是方法的簽名,此外還有CLASSSIM表示為類簽名;CN用來指定方法所在的類;MN指定了方法名;D指定了方法的簽名信息。BF用來指定簽名的檢測規(guī)則,可以同時(shí)滿足1條或多條,例如,使用SIGNATURE定義了3條簽名規(guī)則,當(dāng)軟件的代碼同時(shí)滿足規(guī)則1或規(guī)則2且滿足規(guī)則3時(shí)說明樣本符合檢測條件,那么BF可定義為“"BF" : "(0 or 1) and 2"”。
在Androguard目錄下新建一個(gè)apks目錄,將apk復(fù)制進(jìn)去,然后將plankton.test.sign文件復(fù)制到Androguard的signatures目錄下,在終端提示符下執(zhí)行下面的命令:
./androcsign.py -i signatures/plank.test.sign -o signatures/dbandroguard
即可將簽名信息添加進(jìn)數(shù)據(jù)庫。
-l選項(xiàng)可以將數(shù)據(jù)庫中的信息展示出來
androgexf.py
androdd.py用來生成apk文件中每個(gè)類的方法的調(diào)用流程圖?梢赃x擇生成.dot格式的,另外還可以在PNG和JPG中的一種,其中DOT是一種圖形描述語言,使用次方法要注意的一點(diǎn)是Wiki上提示的選擇圖形格式時(shí)“-f PNG”使用的大寫字母,實(shí)際運(yùn)行時(shí)發(fā)現(xiàn)會(huì)報(bào)錯(cuò)。如下圖:
可見選擇png還是jpg會(huì)和write拼成一個(gè)函數(shù),而這個(gè)函數(shù)是小寫的,所以必須用下寫的參數(shù)才行。
這個(gè)功能可以在-o指定的目錄下生成控制流圖,從目錄結(jié)構(gòu)可以看出對(duì)每個(gè)類的每個(gè)方法會(huì)創(chuàng)建一張圖,圖樣如下所示:
androgexf.py
androgexf.py用來生成APK的GEXF格式的圖形文件。該文件可以使用Gephi查看。Gephi軟件可以改變圖形的布局,顯示和隱藏Label,調(diào)節(jié)圖形線條粗細(xì)和字體大小,也可以選擇只查看數(shù)據(jù),更多功能留給讀者自行發(fā)現(xiàn)。
androxgmml.py
androxgmml.py用來生成apk/jar/class/dex文件的控制流程及功能調(diào)用圖,輸出格式為xgmml。此格式的圖可以使用Cytoscape軟件打開查看。
androapkinfo.py
androapkinfo.py用來查看apk文件的信息。該工具會(huì)輸入apk文件的包、資源、權(quán)限、組件、方法等信息,輸出的內(nèi)容比較詳細(xì)。
androdiff.py
androdiff.py用來比較兩個(gè)apk文件的差異。-i選項(xiàng)后接兩個(gè)文件作為參數(shù)。
前幾天參加的第十二屆軟件與應(yīng)用學(xué)術(shù)會(huì)議上,北大的一篇檢測Repackage應(yīng)用的文章分為兩個(gè)步驟,首先檢測應(yīng)用和官方應(yīng)用是否相似,然后看簽名是否相同,他們檢測相似性是用兩個(gè)應(yīng)用的變量和每個(gè)變量出現(xiàn)次數(shù)的矩陣來比較的,我想這個(gè)diff工具也可以提供一些參考,還有androsim.py,這個(gè)就是計(jì)算兩個(gè)APK的相似度。
androrisk.py
檢測應(yīng)用程序的風(fēng)險(xiǎn),使用比較簡單,輸出如下:
root@shuai-Inspiron-One-2320:~/DevTools/androguard-1.9# ./androrisk.py -d ../ApkForTest/ ../ApkForTest/8f7bf37face686ac456c21dc1dad132f077ce626.apk RedFlags DEX {'NATIVE': 1, 'DYNAMIC': 0, 'CRYPTO': 0, 'REFLECTION': 0} APK {'DEX': 0, 'EXECUTABLE': 0, 'ZIP': 0, 'SHELL_SCRIPT': 0, 'APK': 0, 'SHARED LIBRARIES': 0} PERM {'PRIVACY': 6, 'NORMAL': 2, 'MONEY': 0, 'INTERNET': 2, 'SMS': 0, 'DANGEROUS': 10, 'SIGNATUREORSYSTEM': 0, 'CALL': 0, 'SIGNATURE': 0, 'GPS': 0} FuzzyRisk VALUE 50.0 ../ApkForTest/5aff5198c2fe5798bd7f1519dab0cd4ee737d5d2.apk RedFlags DEX {'NATIVE': 0, 'DYNAMIC': 1, 'CRYPTO': 0, 'REFLECTION': 1} APK {'DEX': 0, 'EXECUTABLE': 0, 'ZIP': 0, 'SHELL_SCRIPT': 0, 'APK': 0, 'SHARED LIBRARIES': 0} PERM {'PRIVACY': 3, 'NORMAL': 1, 'MONEY': 0, 'INTERNET': 1, 'SMS': 0, 'DANGEROUS': 8, 'SIGNATUREORSYSTEM': 0, 'CALL': 0, 'SIGNATURE': 0, 'GPS': 0} FuzzyRisk VALUE 86.6666666667
androlyze.py
androlyze.py與其它的py文件不同,它不是單一功能的腳本,而是一個(gè)強(qiáng)大的靜態(tài)分析工具,它提供的一個(gè)獨(dú)立的Shell環(huán)境來輔助分析人員執(zhí)行分析工作。
在終端提示符下執(zhí)行“./androlyze.py -s”會(huì)進(jìn)入androlyze 的Shell交互環(huán)境,分析人員可以在其中執(zhí)行不同的命令,來滿足不同情況下的分析需求。androlyze.py通過訪問對(duì)象的字段與方法的方式來提供反饋結(jié)果,分析過程中可能會(huì)用到3個(gè)對(duì)象:apk文件對(duì)象、dex文件對(duì)象、分析結(jié)果對(duì)象。這3個(gè)對(duì)象是通過androlyze.py的Shell環(huán)境(以下簡稱Shell環(huán)境)來獲取的。在Shell環(huán)境下執(zhí)行以下命令:
也可以用一條命令:
a, d, dx = AnalyzeAPK("./crackme0502.apk", decompiler="dad")
其他的幾個(gè)命令就不再一一說明了,嘗試幾次就都會(huì)了。
androguard實(shí)現(xiàn)原理分析
靜態(tài)分析的目標(biāo)無非是如下幾點(diǎn),APK文件列表,Manifest文件,dex文件,二進(jìn)制文件,資源文件,權(quán)限,四大組件,敏感API,尤其是LoadLibrary,dexClassLoader,Reflection等。
androguard第一步是對(duì)APK,dex以及class等類型的文件反向工程。實(shí)際上我沒有找到到底是哪里調(diào)用的,還在挖掘中..
整個(gè)androguard項(xiàng)目結(jié)構(gòu)中看,第一曾目錄下的所有py文件都是可以直接使用的工具,這些工具所調(diào)用的基礎(chǔ)功能實(shí)現(xiàn)在androguard目錄下,主要在core下,其他目錄主要是測試、示例和支持的功能。
考慮APK的結(jié)構(gòu),可以看作一種層級(jí)結(jié)構(gòu),APK中含有各種文件,dex文件中包含多個(gè)類,每個(gè)類有包含多個(gè)方法,這樣從上往下是一種樹狀結(jié)構(gòu),每一層都可以用一個(gè)類來表示。
其中androgen.py中的Androguard是頂層的對(duì)象,在analysis.py中進(jìn)行大量的處理,最終可以方便的從一個(gè)APK對(duì)象找到其下的類,再找到所有的方法,通過方法也可以找到它所屬的類,使得一個(gè)APK文件和一個(gè)相關(guān)聯(lián)系的類系統(tǒng)對(duì)應(yīng)起來。
有了APK文件所有可以讀取到的信息,剩下的工作就相對(duì)容易一些。
要獲得程序的權(quán)限,只需要調(diào)用接口將已經(jīng)保存好的權(quán)限信息輸出。想檢測APK是否有調(diào)用本地方法,動(dòng)態(tài)加載和反射的動(dòng)作,只需要檢查方法里是否有LoadLibrary,dexClassLoader,Reflection這些。
生成調(diào)用的圖的部分還沒完全看懂,初步的瀏覽代碼看到掃描反編譯后方法里的語句,如果有調(diào)用其他方法,則被調(diào)用的方法就看作原方法的孩子,就會(huì)有一條邊相連,其中androdd.py、androgexf.py和androxgmml.py生成的圖也不盡相同,主要是結(jié)點(diǎn)選擇和邊選擇的層次粒度不想通,例如androdd.py將方法作為一個(gè)單元,考慮其中語句的控制流,比如invoke和if之類的語句對(duì)程序流程造成的影響,而androgexf.py將APK看作一個(gè)整體,將方法之間的調(diào)用關(guān)系看作邊,androxgmml.py沒有太多關(guān)注,好像粒度細(xì)到每條dalvik指令,因此結(jié)點(diǎn)數(shù)也相當(dāng)?shù)亩唷?/p>
風(fēng)險(xiǎn)評(píng)估的功能從輸出就可以看出些端倪,風(fēng)險(xiǎn)值的計(jì)算在risk.py文件中,評(píng)估的依據(jù)是權(quán)限、API和文件,為權(quán)限本身的dangerous, signatureOrSystem, signature和normal四種類型分配不同的威脅值,同時(shí)將權(quán)限映射為資費(fèi),聯(lián)網(wǎng),短信,電話,隱私相關(guān)的幾種類型,分配不同的威脅值,對(duì)部分API以及二進(jìn)制文件,共享庫文件等做類似處理,最后整合計(jì)算出威脅值。我認(rèn)為這種方法是靜態(tài)檢測中的常用方法,但實(shí)際效果上看有靜態(tài)檢測本身的局限性,會(huì)有比較大的誤差。
總結(jié):
總得來說,我覺得androguard是一款不錯(cuò)的靜態(tài)分析工具,幾乎覆蓋了所有靜態(tài)分析的基礎(chǔ)工作,可以方便的獲取靜態(tài)分析需要的信息,這受益于將APK文件轉(zhuǎn)換為python的設(shè)計(jì)思想。另外將反向工程的部分信息可視化也對(duì)應(yīng)用分析帶來很大的幫助,惡意程序檢測和風(fēng)險(xiǎn)分析也是錦上添花的一筆。此工具中,保存惡意方法的簽名信息是一個(gè)很好的思路,很多時(shí)候一段惡意代碼重打包添加進(jìn)不同的應(yīng)用程序中,此時(shí)如果保存方法的簽名信息并據(jù)此檢測目標(biāo)程序,會(huì)將所有包含了這段方法的代碼檢測出來,還能檢測出未來出現(xiàn)的添加此段代碼的惡意程序,如果用程序簽名的話就必須保存所有被添加惡意代碼的程序,而且對(duì)未來出現(xiàn)的程序沒有抵抗力,這點(diǎn)給了我啟發(fā)。
androguard還不夠完善的地方是安裝過程有些復(fù)雜,花費(fèi)時(shí)間略長,這也和我不太熟悉python有關(guān),另外程序有些地方還有bug。但是瑕不掩瑜,如果能熟練運(yùn)用,可以在APK分析中更得心應(yīng)手。