本篇博客主要針對(duì) MacOs,介紹幾種常用的反編譯工具。
1. ApkTool
APKTool 是 Google 提供的 APK 編譯工具,能夠反編譯及回編譯 apk,我們一般用來(lái)反編譯資源文件,代碼反編譯之后都是 smali 文件。需要 java 支持。
功能
- 還原 Apk 中所包含的 resources.arsc、classes.dex、9.png 和 xml 等資源文件
- 對(duì) Apk 進(jìn)行重新(二次)打包
- 反編譯依賴于 Framework 的 apk 文件
- 運(yùn)行調(diào)試 Smali 文件
安裝
- 將下載好的 apktool 文件與 apktool.jar 文件準(zhǔn)備好
- 將 apktool.jar 與 apktool 移動(dòng)到 /usr/local/bin 目錄下(可以通過(guò)在終端中輸出命令 open /usr/local/bin 來(lái)打開(kāi)這個(gè)目錄)
- 為上述兩個(gè)文件增加可執(zhí)行權(quán)限,即在終端中輸入并執(zhí)行:
1. chmod +x apktool.jar
2. chmod +x apktool
-
在終端輸入 apktool 看是否可以運(yùn)行,如果可以運(yùn)行,輸出結(jié)果如下圖。(如果不可以,則需要在系統(tǒng)偏好設(shè)置中打開(kāi)安全與隱私中點(diǎn)擊仍要運(yùn)行apktool.jar)
使用
我們可以利用 ApkTool 反編譯 apk 獲得 AndroidManifest.xml、xml文件和圖片資源。
在終端執(zhí)行以下操作:
1. cd /你存放apk的目錄或在下面命令中使用xxx.apk文件的絕對(duì)路徑
2. apktool d xxx.apk //該命令執(zhí)行后會(huì)在同級(jí)目錄下生成一個(gè)與你編譯的apk同名的目錄
以某版本的 docs.apk 為例:

APkTool 只能提取資源文件,對(duì)于 .dex 類型的文件是無(wú)法查看的,這時(shí)候需要用到 dex2jar 了。
2. dex2jar
dex2jar 是一個(gè)能操作 Android 的 dalvik(.dex) 文件格式和 Java 的 (.class) 的工具集合。
功能
- dex-reader/writer : 用于讀寫(xiě) Dalvik Executable (.dex) 文件格式. 包含一個(gè)簡(jiǎn)單的API (與ASM相似)
- d2j-dex2jar : 執(zhí)行 .dex 到 .class 的文件格式轉(zhuǎn)換
- smali/baksmali : 與 smali 工具功能一致,但是對(duì)中文更友好
安裝
直接解壓即可。
使用
-
先將 apk 文件進(jìn)行解壓,可使用解壓軟件,也可將文件后綴改為 .rar 然后再通過(guò)終端 unzip xxx.rar 命令行解壓。(注意:直接解壓 apk 和使用 ApkTool 反編譯 apk 都能獲得AndroidManifest.xml,但直接解壓獲得的 AndroidManifest.xml 是亂碼的,無(wú)法直接查看;同時(shí),直接解壓 apk 獲得 res 資源文件是不包含 resources.arsc 部分的,而使用 ApkTool 反編譯出來(lái)的 res 是包含的。)
- 從上圖中可以看到,直接解壓后有3個(gè) classes.dex 文件(應(yīng)用了 MultiDex 所致),這就是項(xiàng)目的源碼。將這幾個(gè) classes.dex 文件拷貝到解壓的 dex2jar 目錄下,然后執(zhí)行在終端如下命令進(jìn)行反編譯:
1. cd /你的dex2jar解壓目錄
2. sh d2j-dex2jar.sh classes.dex
3. sh d2j-dex2jar.sh classes2.dex
4. sh d2j-dex2jar.sh classes3.dex


PS:如果出現(xiàn) permission denied d2j_invoke.sh 的提示,則需要在終端里執(zhí)行:
sudo chmod +x d2j_invoke.sh // chmod +x 命令為取消權(quán)限
然后再重新執(zhí)行:
sh d2j-dex2jar.sh classes.dex
- 通過(guò)上面的步驟,我們已經(jīng)將 .dex 轉(zhuǎn)換成 .jar,接下來(lái)就可以使用 JD-GUI 或 jadx 來(lái)查看反編譯后的程序源碼了。
3. JD-GUI
一款免費(fèi)的 Java 反編譯工具,使用 C++ 開(kāi)發(fā)
功能
- 該工具可以反編譯單個(gè)、多個(gè) jar 包
- 擁有獨(dú)立圖形界面,只要把文件拖到軟件的那個(gè)框框里面,就可以看到源碼了
使用
不需要安裝,直接雙擊運(yùn)行 jd-gui-1.4.0.jar 打開(kāi)軟件,然后將 classes-dex2jar.jar 文件拖拽到 JD-GUI 界面上即可,然后就可以愉快地查看源碼了。

4. jadx
一款跨平臺(tái)的有 GUI 界面的反編譯工具
功能
- 可以直接將 apk 文件進(jìn)行反編譯
- 反編譯輸出 Java 代碼
- 圖形化的界面,拖拽式的操作,強(qiáng)大的搜索功能
- 導(dǎo)出 Gradle 工程
安裝
方式一:下載并解壓后點(diǎn)擊 bin 目錄下的 jadx-gui 即可打開(kāi)。
方式二:由于 jadx 本身是 github 上的一個(gè)開(kāi)源項(xiàng)目,所以可以直接 clone 源代碼,打開(kāi)終端執(zhí)行以下命令,進(jìn)行編譯安裝。
1. git clone https://github.com/skylot/jadx.git
2. cd jadx
3. ./gradlew dist
然后將 build/jadx/bin 加入到環(huán)境變量即可。
使用
雙擊 bin 目錄下的 jadx-gui 即可打開(kāi),使用方式同 JD_GUI 一致,也同樣可以通過(guò) File->Save All 來(lái)保存反編譯后的文件再用 Android Studio 打開(kāi)。
除此之外,jadx 也支持直接用命令行來(lái)反編譯文件:
1. jadx -d out classes.dex #直接輸出.java文件到out目錄
2. #or
3. jadx-gui classes.dex #使用gui打開(kāi)



總結(jié)
- 如果只是想得到 .xml 文件和圖片資源等,則直接使用 ApkTool 來(lái)反編譯 apk 。
- 如果想查看項(xiàng)目源代碼,則有以下兩種方式:
- 可以先將 apk 直接解壓,再利用 dex2jar 將文件由 .dex 轉(zhuǎn)換為 .jar,然后使用 JD-GUI 或 jadx 打開(kāi) .jar 文件即可看到源碼,可選擇保存再用其他 IDE 打開(kāi)。
- 直接用 jadx 反編譯 apk 。

