早在4年前我曾發(fā)表過(guò)一篇關(guān)于《Android開(kāi)發(fā)之反編譯與防止反編譯》的文章,在該文章中我對(duì)如何在Windows平臺(tái)反編譯APK做了講解,如今用Mac系統(tǒng)的同學(xué)越來(lái)越多,也有很多朋友問(wèn)我能否出一篇關(guān)于如何在Mac平臺(tái)上反編譯APK的文章,今天呢我就抽時(shí)間來(lái)寫一下在Mac平臺(tái)上如何反編譯APK,希望對(duì)感興趣的同學(xué)能有學(xué)幫助。
在開(kāi)始講解反編譯之前呢,我們先來(lái)掃個(gè)盲:
什么是APK?
APK的全程是Android application package,是Android的應(yīng)用程序包,平時(shí)我們安裝Android應(yīng)用的時(shí)候需要將APK文件下載到本地然后安裝,Android系統(tǒng)會(huì)將其識(shí)別為Android應(yīng)用包。另外,需要指出的是APK 其實(shí)是一個(gè)基于 ZIP 文件格式的文件,所以支持你用解壓軟件將其解壓,當(dāng)你將APK文件解壓之后你會(huì)看到如下文件:

- .dex代碼文件:它是classes文件通過(guò)DEX編譯后的文件格式,用于在Dalvik虛擬機(jī)上運(yùn)行的主要代碼部分;
- resources 資源文件:以resources以及res目錄為代表的Android程序中所需要的一些資源,如圖片資源,顏色資源,字符串,布局等;
- assets文件:assets目錄下存放的是原生資源文件,比如在里面存放字體,鈴聲等;
- manifest清單文件:以AndroidManifest.xml為代表的Android清單文件,清單文件向 Android 系統(tǒng)提供應(yīng)用的必要信息,系統(tǒng)必須具有這些信息方可運(yùn)行應(yīng)用的任何代碼。
了解過(guò),APK的之后,接下來(lái)就給大家介紹反編譯一個(gè)APK所需要那些工具:
反編譯一個(gè)APK需要那些工具?
無(wú)論是在Windows平臺(tái)還是在Mac平臺(tái),反編譯APK都離不了ApkTool、dex2jar、JD-GUI 這三種工具,那么這三種工具都是做什么用的呢?
- ApkTool:是一款應(yīng)用在Apk上的逆向工程的工具,它有編譯、反編譯、簽名等功能,在這篇文章中會(huì)講解如何利用ApkTool查看apk的xml文件、AndroidManifest.xml和圖片等。
- dex2jar:顧名思義,這款工具的作用主要是將dex文件轉(zhuǎn)換成jar文件,轉(zhuǎn)換成jar后我們才好借助JD-GUI來(lái)查看反編譯dex后的代碼;
- JD-GUI:一款Java反編譯器GUI,通過(guò)它我們能查看到反編譯后的dex的代碼,通常需要配合dex2jar使用;
準(zhǔn)備工作(安裝ApkTool、dex2jar、JD-GUI的具體流程)
介紹過(guò)ApkTool、dex2jar、JD-GUI 的作用后,接下來(lái)我們做一些反編譯前的準(zhǔn)備工作,首先呢我們需要安裝ApkTool。
ApkTool
下載ApkTool
大家可以從https://ibotpeaches.github.io/Apktool/install/上下載ApkTool,也可以下載我為大家準(zhǔn)備好的ApkTool、dex2jar、JD-GUI。
安裝ApkTool
- 將下載好的
apktool文件與apktool_2.3.1.jar文件準(zhǔn)備好,并將apktool_2.3.1.jar更名為apktool.jar; - 將
apktool.jar與apktool移動(dòng)到/usr/local/bin目錄下(可以通過(guò)在終端中輸出命令open /usr/local/bin來(lái)打開(kāi)這個(gè)目錄); - 為上述兩個(gè)文件增加可執(zhí)行權(quán)限,即在終端中輸入并執(zhí)行:
chmod +x apktool.jar chmod +x apktool - 在終端輸入
apktool看是否可以運(yùn)行,如果不可以需要在系統(tǒng)偏好設(shè)置中打開(kāi)安全與隱私中點(diǎn)擊仍要運(yùn)行apktool.jar;
至此ApkTool的安裝便完成了,在終端運(yùn)行apktool命令會(huì)看到如下輸出:

dex2jar
下載dex2jar
大家可以從https://sourceforge.net/projects/dex2jar/files/上下載dex2jar,也可以下載我為大家準(zhǔn)備好的ApkTool、dex2jar、JD-GUI。
下載后直接解壓即可。
JD-GUI
下載JD-GUI
大家可以從http://jd.benow.ca/上下載JD-GUI,也可以下載我為大家準(zhǔn)備好的ApkTool、dex2jar、JD-GUI。
使用ApkTool反編譯APK得到xml文件、AndroidManifest.xml和圖片
cd /你存放apk的目錄或在下面命令中使用xxx.apk文件的絕對(duì)路徑
apktool d xxx.apk //該命令執(zhí)行后會(huì)在同級(jí)目錄下生成一個(gè)與你編譯的apk同名的目錄
通過(guò)上述命令就可以反編譯apk了。

然后在反編譯后生成的目錄中你會(huì)看到相關(guān)的資源文件:

由于APkTool只能將資源文件提取處理,對(duì)于.dex類型的文件是無(wú)法查看的,這里就需要用到dex2jar了。
dex2jar將dex反編譯成jar
第一步,解壓apk獲得dex文件
使用解壓軟件將apk進(jìn)行解壓:

也可將apk文件的后綴改為.rar然后雙擊進(jìn)行快速解壓。
使用解壓軟件打開(kāi)apk 和使用apktool反編譯出的apk不同
- 直接解壓apk和使用apktool反編譯apk都能獲得AndroidManifest.xml,但直接解壓獲得的AndroidManifest.xml是亂碼的,無(wú)法直接查看;
- 直接解壓apk獲得res資源文件是不包含resources.arsc部分的,而使用apktool反編譯出來(lái)的res是包含的;

從上圖中可以看到有2個(gè)classes.dex文件(這是因?yàn)閼?yīng)用了MultiDex所致)這就是項(xiàng)目的源碼 將這個(gè)兩個(gè)文件拷貝到下載解壓的dex2jar目錄下:

然后執(zhí)行如下代碼進(jìn)行反編譯:
cd /你的dex2jar解壓目錄 也就是上面圖中存放class.dex文件的目錄
sh d2j-dex2jar.sh classes.dex
sh d2j-dex2jar.sh classes2.dex
通過(guò)上述命令會(huì)得到兩個(gè).jar文件:

使用JD-GUI查看反編譯后的程序源碼
將dex轉(zhuǎn)換成jar之后接下來(lái)我們就可以使用JD-GUI來(lái)查看反編譯后的程序源碼了:
操作步驟很簡(jiǎn)單,只需雙擊運(yùn)行jd-gui-1.4.0.jar,然后將classes-dex2jar.jar拖拽到JD-GUI界面上即可:

FAQ
Permission denied d2j_invoke.sh
為d2j_invoke.sh增加權(quán)限:
sudo chmod +x d2j_invoke.sh //sudo chmod +取消權(quán)限
Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
Apktool的bug使用其他版本的Apktool,我在使用apktool_2.3.3.jar中遇到了這個(gè)問(wèn)題,使用如apktool_2.3.1.jar是好的,如果你也遇到了這個(gè)問(wèn)題不妨換個(gè)Apktool版本試一下。