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

APkTool 只能提取資源文件,對于 .dex 類型的文件是無法查看的,這時候需要用到 dex2jar 了。
2. dex2jar
dex2jar 是一個能操作 Android 的 dalvik(.dex) 文件格式和 Java 的 (.class) 的工具集合。
功能
- dex-reader/writer : 用于讀寫 Dalvik Executable (.dex) 文件格式. 包含一個簡單的API (與ASM相似)
- d2j-dex2jar : 執(zhí)行 .dex 到 .class 的文件格式轉(zhuǎn)換
- smali/baksmali : 與 smali 工具功能一致,但是對中文更友好
安裝
直接解壓即可。
使用
-
先將 apk 文件進(jìn)行解壓,可使用解壓軟件,也可將文件后綴改為 .rar 然后再通過終端 unzip xxx.rar 命令行解壓。(注意:直接解壓 apk 和使用 ApkTool 反編譯 apk 都能獲得AndroidManifest.xml,但直接解壓獲得的 AndroidManifest.xml 是亂碼的,無法直接查看;同時,直接解壓 apk 獲得 res 資源文件是不包含 resources.arsc 部分的,而使用 ApkTool 反編譯出來的 res 是包含的。)
- 從上圖中可以看到,直接解壓后有3個 classes.dex 文件(應(yīng)用了 MultiDex 所致),這就是項目的源碼。將這幾個 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
- 通過上面的步驟,我們已經(jīng)將 .dex 轉(zhuǎn)換成 .jar,接下來就可以使用 JD-GUI 或 jadx 來查看反編譯后的程序源碼了。
3. JD-GUI
一款免費的 Java 反編譯工具,使用 C++ 開發(fā)
功能
- 該工具可以反編譯單個、多個 jar 包
- 擁有獨立圖形界面,只要把文件拖到軟件的那個框框里面,就可以看到源碼了
使用
不需要安裝,直接雙擊運行 jd-gui-1.4.0.jar 打開軟件,然后將 classes-dex2jar.jar 文件拖拽到 JD-GUI 界面上即可,然后就可以愉快地查看源碼了。

4. jadx
一款跨平臺的有 GUI 界面的反編譯工具
功能
- 可以直接將 apk 文件進(jìn)行反編譯
- 反編譯輸出 Java 代碼
- 圖形化的界面,拖拽式的操作,強大的搜索功能
- 導(dǎo)出 Gradle 工程
安裝
方式一:下載并解壓后點擊 bin 目錄下的 jadx-gui 即可打開。
方式二:由于 jadx 本身是 github 上的一個開源項目,所以可以直接 clone 源代碼,打開終端執(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 即可打開,使用方式同 JD_GUI 一致,也同樣可以通過 File->Save All 來保存反編譯后的文件再用 Android Studio 打開。
除此之外,jadx 也支持直接用命令行來反編譯文件:
1. jadx -d out classes.dex #直接輸出.java文件到out目錄
2. #or
3. jadx-gui classes.dex #使用gui打開



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

