針對Android面臨的安全風險,一些防止逆向的方法應運而生。代碼混淆在X86架構上曾經被廣泛研究,他被用於保護軟件的只是產權,但是惡意軟件也常常使用他來對抗殺毒軟件或者對抗逆向分析者,代碼混淆可以給逆向分析帶來巨大工作量,比如,可以是反編譯工具失效或者增加很多無用邏輯。下面我們就介紹幾種Android相關的代碼混淆工具和相關的反編譯工具。
代碼保護:
下面的這幾個工具可以用來混淆代碼對抗逆向分析。
Proguard
Proguard是一個開源項目,官網http://proguard.sourceforge.NET/,同時也被集成到了Android SDK中,它的使用非常簡單方便,Proguard是使用Java編寫專門用來對Android程序進行混淆的工具。他的功能集包括混淆包,類,方法和域,除了這些保護機制外,也能識別或者標記一些無用代碼,因此用戶可以對其手動去除,未使用的類Proguard可以自動去除。Proguard的混淆方法就是對其中的類名和方法名去除其對應的意思,因為,逆向工作者可以根據類名和方法名猜出函數的意思,可以大大降低逆向難度,但是Proguard並沒有對指令進行改變,所以使用Proguard進行混淆的強度比較低。
Allatori
Allatori是一個Smardec公司開發的用於商業的代碼混淆工具,官網是http://www.allatori.com/doc.html,除了同Proguard的混淆技術外,Allatori還提供了一些方法來修改程序代碼,被Allatori混淆的循環結構不能直接被反編譯器識別,還有就是破壞算法的可讀性,使本來緊湊的代碼變得很長,而且,Allatori還會對字符串(一般是人類可讀的字符串)進行混淆,在運行時解碼。Allatori是在Proguard基礎上更加強大的混淆工具,但是也無法完全杜絕逆向分析的行為。
逆向工具
一般逆向分析人員都會配合使用各種不同的逆向工具達到目的,這里只介紹一些靜態分析工具,主要是一些可以反編譯Dalvik指令集的工具。
Dexdump
Dexdump是AndroidSDK自帶的一個工具,利用它可以直接對Dalvik字節碼進行反編譯,原理是利用線性掃描對整個dex文件進行線性反編譯,也就是說,dexdump會認為每一個指令是有效的,進而依次對其反編譯,如果加入一些垃圾指令,dexdump也同樣會對其進行反編譯從而影響到正常指令的解析。最后,dexdump會輸出一些類、方法和一些類的結構等信息。
Smali
Smali官網是http://code.google.com/p/smali/,程序是一個匯編器,和上面所述的反匯編器相反,他對應的反匯編工具叫“baksmali”,利用這兩個工具可以對一個Android應用程序進行解包,修改,重新打包。一般逆向分析者感興趣的是baksmali代碼,baksmali工具類似dexdump工具,只不過它的原理是遞歸掃描,所以它在反編譯的時候會遞歸查看指令是否被調用,如果指令不被調用則認為是垃圾指令,彌補了線性掃描的不足,所以baksmali工具被當成基本的反編譯器。
Androguard
Androguard是一個強大的逆向分析工具,他不僅包括反編譯功能,而且還有一些可以分析程序信息的功能。Androguard給分析人員提供一個分析界面並可以給出程序的調用關系圖,Androguard的原理和baksmali類似,也是使用的遞歸掃描。由於Androguard提供巨大的代碼庫和分析方法,目前已經成為了最流行的分析工具之一。另外,他還用來作為其他工具的后端組件,比如apkinspector,官網是http://code.google.com/p/apkinspector/。
IDA Pro
IDA Pro是一個非常流行的反編譯工具,曾經風靡於x86平台,同時,他也支持許多其他體系結構,他也可以反編譯Dalvik字節碼,IDAPro提供了一個圖形界面,並支持插件為其擴展功能,除了使用了遞歸反編譯原理外,IDAPro允許用戶分析任意他想要分析的文件指令點,這在程序丟失了一些指令的情況下非常有用。另外,IDAPro的一個非常有用的特點是它提供圖形化界面,分析者可以根據這個圖形化界面非常容易地分析控制流。
APKTOOL
Apktool,官網是https://code.google.com/p/android-apktool/,工具來自Google,集成了aapt,smali,baksmali,AXML編碼解碼等工具,可以完成反編譯和編譯的功能。目前這個工具已經成為非常常用的逆向工具。