原創文章,轉載請注明出處,謝謝。
Android應用程序分析主要有靜態分析和動態分析兩種,常見的靜態分析工具是Apktool、dex2jar以及jdgui。今天突然主要到Google code上有個叫做androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析處理功能。很值得學習和分析。
androguard項目主頁:http://code.google.com/p/androguard/
androguard是基於python的,將Apk文件中的dex文件,類,方法等都映射為python的對象,項目主頁介紹了androgurad的特性,簡單來說,androguard提供了apk文件的反向工程,惡意軟件檢測和威脅評估,還有程序行為可視化。功能相當豐富,是分析apk的好幫手。
androguard的部署配置
androguard是基於python的,所以無論windows,linux還是mac os,只要能運行python的都可以運行androguard。
我的軟件環境是Ubuntu12.04 64位、java 1.6、 python 2.7.
androguard的安裝可以參考Wiki,我基本按照這個步驟進行,有些地方是需要注意的。
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分析中更得心應手。