原創文章,轉載請註明出處,謝謝。java
Android應用程序分析主要有靜態分析和動態分析兩種,常見的靜態分析工具是Apktool、dex2jar以及jdgui。今天忽然主要到Google code上有個叫作androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析處理功能。很值得學習和分析。python
androguard項目主頁:http://code.google.com/p/androguard/linux
androguard是基於python的,將Apk文件中的dex文件,類,方法等都映射爲python的對象,項目主頁介紹了androgurad的特性,簡單來講,androguard提供了apk文件的反向工程,惡意軟件檢測和威脅評估,還有程序行爲可視化。功能至關豐富,是分析apk的好幫手。android
androguard的部署配置數據庫
androguard是基於python的,因此不管windows,linux仍是mac os,只要能運行python的均可以運行androguard。json
個人軟件環境是Ubuntu12.04 64位、java 1.六、 python 2.7.windows
androguard的安裝能夠參考Wiki,我基本按照這個步驟進行,有些地方是須要注意的。app
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包解壓縮後執行python setup.py install來安裝。具體須要的模塊請參考Wiki,安裝不全的也能夠在運行時根據錯誤提示再進行安裝。工具
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. 進入androguard目錄,執行make。
至此,androguard的安裝工做完成,androguard目錄下的全部py文件都是一個工具,用-h查看幫助,例如:
androguard的使用
上圖中全部綠色的py文件都是可用的工具,下面我介紹說明經常使用到的幾個。
androcsign.py:
androcsign.py用於添加apk文件的簽名信息到一個數據庫文件中。Androguard工具目錄下的signatures/dbandroguard文件爲收集的惡意軟件信息數據庫。在開始使用androcsign.py前須要爲apk文件編寫一個sign文件,這個文件採用json格式保存。前文提到次工具能夠檢測惡意程序,是由於有惡意程序的簽名庫,是signatures目錄下的dbandroguard文件,此目錄中的.sign文件爲提供了json簽名文件的範例,我看這個文件只能是手動去寫了。
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指定文件運行的系統,目前固定爲AndroidOS。NAME是該簽名的名字。SIGNATURE爲具體的簽名規則,其中TYPE用來指定簽名的類型,METHSIM表示的是方法的簽名,此外還有CLASSSIM表示爲類簽名;CN用來指定方法所在的類;MN指定了方法名;D指定了方法的簽名信息。BF用來指定簽名的檢測規則,能夠同時知足1條或多條,例如,使用SIGNATURE定義了3條簽名規則,當軟件的代碼同時知足規則1或規則2且知足規則3時說明樣本符合檢測條件,那麼BF可定義爲「"BF" : "(0 or 1) and 2"」。
在Androguard目錄下新建一個apks目錄,將apk複製進去,而後將plankton.test.sign文件複製到Androguard的signatures目錄下,在終端提示符下執行下面的命令:
./androcsign.py -i signatures/plank.test.sign -o signatures/dbandroguard
便可將簽名信息添加進數據庫。
-l選項能夠將數據庫中的信息展現出來
androgexf.py
androdd.py用來生成apk文件中每一個類的方法的調用流程圖。能夠選擇生成.dot格式的,另外還能夠在PNG和JPG中的一種,其中DOT是一種圖形描述語言,使用次方法要注意的一點是Wiki上提示的選擇圖形格式時「-f PNG」使用的大寫字母,實際運行時發現會報錯。以下圖:
可見選擇png仍是jpg會和write拼成一個函數,而這個函數是小寫的,因此必須用下寫的參數才行。
這個功能能夠在-o指定的目錄下生成控制流圖,從目錄結構能夠看出對每一個類的每一個方法會建立一張圖,圖樣以下所示:
androgexf.py
androgexf.py用來生成APK的GEXF格式的圖形文件。該文件可使用Gephi查看。Gephi軟件能夠改變圖形的佈局,顯示和隱藏Label,調節圖形線條粗細和字體大小,也能夠選擇只查看數據,更多功能留給讀者自行發現。
androxgmml.py
androxgmml.py用來生成apk/jar/class/dex文件的控制流程及功能調用圖,輸出格式爲xgmml。此格式的圖可使用Cytoscape軟件打開查看。
androapkinfo.py
androapkinfo.py用來查看apk文件的信息。該工具會輸入apk文件的包、資源、權限、組件、方法等信息,輸出的內容比較詳細。
androdiff.py
androdiff.py用來比較兩個apk文件的差別。-i選項後接兩個文件做爲參數。
前幾天參加的第十二屆軟件與應用學術會議上,北大的一篇檢測Repackage應用的文章分爲兩個步驟,首先檢測應用和官方應用是否類似,而後看簽名是否相同,他們檢測類似性是用兩個應用的變量和每一個變量出現次數的矩陣來比較的,我想這個diff工具也能夠提供一些參考,還有androsim.py,這個就是計算兩個APK的類似度。
androrisk.py
檢測應用程序的風險,使用比較簡單,輸出以下:
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文件不一樣,它不是單一功能的腳本,而是一個強大的靜態分析工具,它提供的一個獨立的Shell環境來輔助分析人員執行分析工做。
在終端提示符下執行「./androlyze.py -s」會進入androlyze 的Shell交互環境,分析人員能夠在其中執行不一樣的命令,來知足不一樣狀況下的分析需求。androlyze.py經過訪問對象的字段與方法的方式來提供反饋結果,分析過程當中可能會用到3個對象:apk文件對象、dex文件對象、分析結果對象。這3個對象是經過androlyze.py的Shell環境(如下簡稱Shell環境)來獲取的。在Shell環境下執行如下命令:
也能夠用一條命令:
a, d, dx = AnalyzeAPK("./crackme0502.apk", decompiler="dad")
其餘的幾個命令就再也不一一說明了,嘗試幾回就都會了。
另外要提一下androlyze的-x參數能夠查看應用申請的權限都在哪裏使用了,就像x參數的說明同樣:show paths of permissions
androguard實現原理分析
靜態分析的目標無非是以下幾點,APK文件列表,Manifest文件,dex文件,二進制文件,資源文件,權限,四大組件,敏感API,尤爲是LoadLibrary,dexClassLoader,Reflection等。
androguard第一步是對APK,dex以及class等類型的文件反向工程。實際上我沒有找到究竟是哪裏調用的,還在挖掘中..
整個androguard項目結構中看,第一曾目錄下的全部py文件都是能夠直接使用的工具,這些工具所調用的基礎功能實如今androguard目錄下,主要在core下,其餘目錄主要是測試、示例和支持的功能。
考慮APK的結構,能夠看做一種層級結構,APK中含有各類文件,dex文件中包含多個類,每一個類有包含多個方法,這樣從上往下是一種樹狀結構,每一層均可以用一個類來表示。
其中androgen.py中的Androguard是頂層的對象,在analysis.py中進行大量的處理,最終能夠方便的從一個APK對象找到其下的類,再找到全部的方法,經過方法也能夠找到它所屬的類,使得一個APK文件和一個相關聯繫的類系統對應起來。
有了APK文件全部能夠讀取到的信息,剩下的工做就相對容易一些。
要得到程序的權限,只須要調用接口將已經保存好的權限信息輸出。想檢測APK是否有調用本地方法,動態加載和反射的動做,只須要檢查方法裏是否有LoadLibrary,dexClassLoader,Reflection這些。
生成調用的圖的部分還沒徹底看懂,初步的瀏覽代碼看到掃描反編譯後方法裏的語句,若是有調用其餘方法,則被調用的方法就看做原方法的孩子,就會有一條邊相連,其中androdd.py、androgexf.py和androxgmml.py生成的圖也不盡相同,主要是結點選擇和邊選擇的層次粒度不想通,例如androdd.py將方法做爲一個單元,考慮其中語句的控制流,好比invoke和if之類的語句對程序流程形成的影響,而androgexf.py將APK看做一個總體,將方法之間的調用關係看做邊,androxgmml.py沒有太多關注,好像粒度細到每條dalvik指令,所以結點數也至關的多。
風險評估的功能從輸出就能夠看出些端倪,風險值的計算在risk.py文件中,評估的依據是權限、API和文件,爲權限自己的dangerous, signatureOrSystem, signature和normal四種類型分配不一樣的威脅值,同時將權限映射爲資費,聯網,短信,電話,隱私相關的幾種類型,分配不一樣的威脅值,對部分API以及二進制文件,共享庫文件等作相似處理,最後整合計算出威脅值。我認爲這種方法是靜態檢測中的經常使用方法,但實際效果上看有靜態檢測自己的侷限性,會有比較大的偏差。
總結:
總得來講,我以爲androguard是一款不錯的靜態分析工具,幾乎覆蓋了全部靜態分析的基礎工做,能夠方便的獲取靜態分析須要的信息,這受益於將APK文件轉換爲python的設計思想。另外將反向工程的部分信息可視化也對應用分析帶來很大的幫助,惡意程序檢測和風險分析也是錦上添花的一筆。此工具中,保存惡意方法的簽名信息是一個很好的思路,不少時候一段惡意代碼重打包添加進不一樣的應用程序中,此時若是保存方法的簽名信息並據此檢測目標程序,會將全部包含了這段方法的代碼檢測出來,還能檢測出將來出現的添加此段代碼的惡意程序,若是用程序簽名的話就必須保存全部被添加惡意代碼的程序,並且對將來出現的程序沒有抵抗力,這點給了我啓發。
androguard還不夠完善的地方是安裝過程有些複雜,花費時間略長,這也和我不太熟悉python有關,另外程序有些地方還有bug。可是瑕不掩瑜,若是能熟練運用,能夠在APK分析中更駕輕就熟。