Android APK 反編譯工具介紹

本篇博客主要針對(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 文件
安裝
  1. 將下載好的 apktool 文件與 apktool.jar 文件準(zhǔn)備好
  2. 將 apktool.jar 與 apktool 移動(dòng)到 /usr/local/bin 目錄下(可以通過(guò)在終端中輸出命令 open /usr/local/bin 來(lái)打開(kāi)這個(gè)目錄)
  3. 為上述兩個(gè)文件增加可執(zhí)行權(quán)限,即在終端中輸入并執(zhí)行:
1. chmod +x apktool.jar
2. chmod +x apktool
  1. 在終端輸入 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 為例:

解析出來(lái)的文件目錄結(jié)構(gòu)如下:

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ì)中文更友好
安裝

直接解壓即可。

使用
  1. 先將 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 是包含的。)
  2. 從上圖中可以看到,直接解壓后有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
  1. 通過(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 界面上即可,然后就可以愉快地查看源碼了。

還可以將反編譯后的文件保存,然后再用 Android Studio 打開(kāi)。


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)

另外,可以直接用 jadx-gui 打開(kāi)apk 文件進(jìn)行反編譯。


總結(jié)

  • 如果只是想得到 .xml 文件和圖片資源等,則直接使用 ApkTool 來(lái)反編譯 apk 。
  • 如果想查看項(xiàng)目源代碼,則有以下兩種方式:
  1. 可以先將 apk 直接解壓,再利用 dex2jar 將文件由 .dex 轉(zhuǎn)換為 .jar,然后使用 JD-GUI 或 jadx 打開(kāi) .jar 文件即可看到源碼,可選擇保存再用其他 IDE 打開(kāi)。
  2. 直接用 jadx 反編譯 apk 。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 早在4年前我曾發(fā)表過(guò)一篇關(guān)于《Android開(kāi)發(fā)之反編譯與防止反編譯》的文章,在該文章中我對(duì)如何在Windows平...
    CrazyCodeBoy閱讀 4,990評(píng)論 3 10
  • 前言 處理反編譯,首先先要了解apk文件的結(jié)構(gòu),然后是編譯過(guò)程,最后是反編譯。反編譯Apk的目的就是Apk拆成我們...
    yzzCool閱讀 5,885評(píng)論 0 8
  • apk是安卓工程打包的最終形式,將apk安裝到手機(jī)或者模擬器上就可以使用APP。反編譯apk則是將該安卓工程的源碼...
    隋胖胖LoveFat閱讀 67,198評(píng)論 6 56
  • 上次在義烏受到同學(xué)s誠(chéng)心的接待,不說(shuō)吃的有多好,關(guān)鍵她有那份心,讓我們幾個(gè)感動(dòng)滿滿,內(nèi)心也是十足的溫暖。 平時(shí)我和...
    紅豬豬閱讀 576評(píng)論 0 1
  • 到了春天 我就給你寫(xiě)信 頭頂上空常有深邃純凈的湛藍(lán) 掠過(guò)高原的風(fēng)依舊冰冷 黑頸鶴在天暖后將翩然離別 馬路兩邊的樹(shù)干...
    三喵喵閱讀 276評(píng)論 0 0

友情鏈接更多精彩內(nèi)容