一、Apk反編譯工具及其使用方法
1.原理
學習反編譯之前,建議先學習一下Apk打包的過程,明白打包完成后的Apk里面都有什么文件瀑罗,各種文件都是怎么生成的胸嘴。
這里有兩篇AndroidWeekly中推薦過的好文章:
Apk技術(shù)也有非常多的技術(shù)可以學習,主要都是圍繞著如何減小體積斩祭,如何提高打包速度展開劣像,這里先不多說了。下面是一張基本的Apk文件結(jié)構(gòu)圖摧玫。
Apk文件本質(zhì)上其實是一個zip包耳奕。直接拿解壓工具解壓就可以看到其中包含了什么。下面簡單介紹一下Apk文件的結(jié)構(gòu)诬像。
- AndroidManifest.xml:應用的全局配置文件
- assets文件夾:原始資源文件夾屋群,對應著Android工程的assets文件夾,一般用于存放原始的網(wǎng)頁坏挠、音頻等等芍躏,與res文件夾的區(qū)別這里不再贅述,可以參考上面介紹的兩篇文章降狠。
- classes.dex:源代碼編譯成class后对竣,轉(zhuǎn)成jar,再壓縮成dex文件榜配,dex是可以直接在Android虛擬機上運行的文件否纬。
- lib文件夾:引用的第三方sdk的so文件。
- META-INF文件夾:Apk簽名文件芥牌。
- res文件夾:資源文件,包括了布局聂使、圖片等等壁拉。
- resources.arsc:記錄資源文件和資源id的映射關系。
上面的截圖中每個文件都是一個最基本的Apk 文件應該包含在內(nèi)的柏靶。但是直接把Apk當做zip解壓后的這些文件是沒法直接閱讀的弃理,畢竟他們都是經(jīng)過了build-tools打包工具處理過的。我們直接用文本編輯器打開這里面的Manifest文件看看屎蜓。
反編譯Apk的目的就是Apk拆成我們可以閱讀的文件痘昌。通過反編譯,我們一般想要得到里面的AndroidManifest.xml文件炬转、res文件和java代碼辆苔。
2.Apk反編譯步驟
(1) ApkTool拆包,得到AndroidManifest和res等資源文件
工具下載地址:https://bitbucket.org/iBotPeaches/apktool/downloads
功能:拆解Apk文件扼劈,反編譯其中的資源文件驻啤,將它們反編譯為可閱讀的AndroidManifest.xml文件和res文件。前面講過荐吵,直接把Apk文件當做zip解壓骑冗,得到的xml資源文件赊瞬,都是無法直接用文本編輯器打開閱讀的,因為它們在打包時經(jīng)過了build-tools的處理贼涩。
用法:官網(wǎng)https://ibotpeaches.github.io/Apktool/documentation/有介紹巧涧,最新版本是2.2.0,運行環(huán)境需要jre1.7遥倦。
這里叹括,我演示一下用apktool來拆解Apk文件的基本方法惧眠,只需要在終端里面執(zhí)行下面的命令。
java -jar apktool.jar d yourApkFile.apk
// 注意`apktool.jar`是剛才下載后的jar的名稱,`d`參數(shù)表示decode
// 在這個命令后面還可以添加像`-o -s`之類的參數(shù)帕涌,例如
// java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s
// 幾個主要的參數(shù)設置方法及其含義:
-f 如果目標文件夾已存在,強制刪除現(xiàn)有文件夾
-o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
-s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
-r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)
下面我們看一下java -jar apktool.jar d yourApkFile.apk
拆解后的結(jié)果:
我們已經(jīng)得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件埂息、assets文件夾良蒸、res文件夾、smali文件夾等等粮呢。original文件夾是原始的AndroidManifest.xml文件婿失,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼啄寡。注意豪硅,smali文件夾下面,結(jié)構(gòu)和我們的源代碼的package一模一樣挺物,只不過換成了smali語言懒浮。它有點類似于匯編的語法,是Android虛擬機所使用的寄存器語言识藤。
這時砚著,我們已經(jīng)可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。這樣痴昧,我們就可以查看到這個Apk文件的package包名稽穆、Activity組件、程序所需要的權(quán)限赶撰、xml布局舌镶、圖標等等信息。其實我們把Apk上傳到應用市場時豪娜,應用市場也會通過類似的方式解析我們的apk餐胀。
note1:其實還有一種方法,可以省去每次解包時瘤载,都要輸入
java -jar apktool.jar xxx
這行命令骂澄,官網(wǎng)也有說明,就是將這個命令包裝成shell腳本惕虑,方法見:https://ibotpeaches.github.io/Apktool/install/
note2:如果你在編譯的時候坟冲,發(fā)現(xiàn)終端里面提示發(fā)生了brut.android.UndefinedResObject錯誤磨镶,說明你的apktool.jar版本太低了,需要去下載新版工具了健提。
note3:如果想要自己實現(xiàn)一個解析Apk文件琳猫,提取版本、權(quán)限信息的java服務時私痹,可以引用
apktool.jar
中的ApkDecoder
脐嫂,調(diào)用decode
方法來實現(xiàn)∥勺瘢可以看下圖中账千,apktool.jar里面有解析Apk文件的實現(xiàn)。
(2) dex2jar反編譯dex文件暗膜,得到java源代碼
上一步中匀奏,我們得到了反編譯后的資源文件,這一步我們還想看java源代碼学搜。這里要用的工具就是dex2jar娃善。
工具下載地址:https://sourceforge.net/projects/dex2jar/
功能:將dex格式的文件,轉(zhuǎn)換成jar文件瑞佩。dex文件時Android虛擬機上面可以執(zhí)行的文件聚磺,jar文件大家都是知道,其實就是java的class文件炬丸。在官網(wǎng)有詳細介紹瘫寝。
用法:打開下載的dex2jar-2.0文件夾,里面有shell和bat腳本稠炬,進入終端焕阿,就可以在命令行使用了。
d2j-dex2jar classes.dex
// 獲取classes.dex文件在最前面說過酸纲,只要把Apk當做zip解壓出來捣鲸,里面就有dex文件了
// 或者用apktool反編譯時帶上 `-s` 參數(shù)
運行后瑟匆,可以看到classes.dex已經(jīng)變成了classes-dex2jar.jar闽坡。
note1:第一次下載下來后,在mac里運行的時候可能會提示需要管理員的權(quán)限愁溜,這里我給這些sh腳本
chmod 777
后疾嗅,即可運行它。
note2:寫完這一節(jié)的時候冕象,我發(fā)現(xiàn)把dex轉(zhuǎn)換成jar已經(jīng)有了更好的工具enjarify代承,https://github.com/google/enjarify這個工具是谷歌官方開源的用于反編譯dex文件的。使用方法和dex2jar差不多渐扮,也是簡單的命令行操作论悴。這個工具的主頁中也提到dex2jar已經(jīng)是一個比較老的工具掖棉,在遇到混淆等等復雜的情況時,可能無法正常工作膀估。所以這里推薦大家使用enjarify這個工具幔亥。
(3) jd-gui查看java源代碼
工具下載地址:官網(wǎng)http://jd.benow.ca/上選擇自己所需要的版本。
功能:這個工具不用多說察纯,寫java的人都知道帕棉。有時候我們自己開發(fā)一個jar包給別人用,也會用它來查看class是不是都被正確的打入到了jar內(nèi)饼记,我以前介紹的gradle自定義打包jar的博客中也提到過它香伴。
用法:下載后雙擊既可以運行這個工具,直接把上一步得到的classes-dex2jar.jar拖到jd-gui程序的界面上即可打開了具则,效果如下圖所示即纲。
反編譯Apk步驟小結(jié)
反編譯一個Apk,查看它的資源文件和java代碼乡洼,我們需要用到3個工具崇裁。
- apktool:https://ibotpeaches.github.io/Apktool/
- dex2jar:https://github.com/pxb1988/dex2jar
- jd-gui:http://jd.benow.ca/
反編譯就是用這3個工具得到AndroidManifest.xml、res束昵、java代碼等拔稳。但是我們可以看到,如果你要對一個Apk做盡可能徹底的反編譯锹雏,把它扒得干干凈凈巴比,這一步一步的基本操作還是稍顯麻煩。另外加固過Apk的情況可能更復雜礁遵,需要我們勤動手嘗試轻绞。為了能提高效率,下面我把自己見過的一些集成工具介紹給大家佣耐,盡可能實現(xiàn)可以一鍵反編譯Apk政勃。
二、自動化工具匯總(一鍵反編譯Apk)
1.谷歌提供的工具:android-classyshark
下載地址:https://github.com/google/android-classyshark/releases兼砖,下載下來之后是一個可執(zhí)行的jar文件奸远,win下或者mac下都只要雙擊即可運行。
功能:帶有界面讽挟,一鍵反編譯Apk工具懒叛,直接打開Apk文件,就可以看到Apk中所有的文件結(jié)構(gòu)耽梅,甚至還集成了dex文件查看薛窥,java代碼查看,方法數(shù)分析眼姐、導入混淆mapping文件等一系列工具诅迷。谷歌推出這個工具的目的是為了讓我們開發(fā)者更清楚的了解自己的Apk中都有什么文件佩番、混淆前后有什么變化,并方便我們進一步優(yōu)化自己的Apk打包實現(xiàn)罢杉。下面帶上幾張截圖答捕,真是帥氣的一筆的好工具啊屑那!
即將到來的Android Studio 2.2中集成了一個叫做APK Analyzer的功能拱镐,這個功能不知道是不是和這個工具有關系呢,本人還沒有嘗試過2.2版本持际,有興趣的朋友可以體驗一下preview版本沃琅。
2.Python實現(xiàn)的工具:AndroidGuard
下載地址:https://github.com/androguard/androguard/releases
功能:集成了反編譯資源、代碼等各種文件的工具包蜘欲。需要安裝Python環(huán)境來運行這個工具益眉,這個工具按照不同的反編譯需求,分別寫成了不同的py功能模塊姥份,還有靜態(tài)分析的功能郭脂。所以如果想要用Python開發(fā)一個解析Apk文件并進行靜態(tài)掃描分析的服務,可以引用這個工具來實現(xiàn)澈歉。
用法:具體用法比較多展鸡,這里也不再展開了“D眩可以通過工具內(nèi)置的-h
幫助指令查看各個模塊的功能莹弊。
unclechendeiMac:androguard-2.0 unclechen$ python androaxml.py -h
Usage: androaxml.py [options]
Options:
-h, --help show this help message and exit
-i INPUT, --input=INPUT
filename input (APK or android's binary xml)
-o OUTPUT, --output=OUTPUT
filename output of the xml
-v, --version version of the API
// androaxml.py這個模塊是用來解析AndroidManifest文件的,`-i` 表示輸入的apk文件涡尘,`-o` 表示輸出xml文件忍弛。
3.Mac專屬工具:Android-Crack-Tool
功能:這是網(wǎng)上一位名為Jermic的大神開發(fā)的、在Mac環(huán)境下使用的App考抄,集成了Android開發(fā)中常見的一些編譯/反編譯工具细疚,方便用戶對Apk進行逆向分析,提供Apk信息查看功能川梅。工具的截圖如下所示疯兼,非常強大。
4.手機上的反編譯工具:ApkParser
功能:在電腦上已經(jīng)有了這么多的工具挑势,在手機上的也有很方便的工具镇防。APKParser是一款在查看手機上已經(jīng)安裝的Apk的信息的工具啦鸣,他可以查看軟件的AndroidManifest.xml文件潮饱、方法數(shù)、res資源文件诫给,并在手機上直接展示出來香拉。個人覺得這是一個非常實用的工具啦扬,作為開發(fā)者,手機里面必須要有它凫碌。
5.工具匯總
以上幾款工具都是我體驗過扑毡、感覺不錯的集成工具,推薦給大家盛险。臨近本文結(jié)束前瞄摊,又發(fā)現(xiàn)了這么一個福利網(wǎng)站-http://www.androiddevtools.cn/,其中有一章專門總結(jié)了各種Apk反編譯的工具苦掘。相信有了這么多的利器换帜,大家應該有100種方法將一個App扒得干干凈凈了。