[Mac] 使用 jadx 將 Android APK 檔案快速反編譯成 Java 原始碼

[Mac] 使用 jadx 將 Android APK 檔案快速反編譯成 Java 原始碼

之前寫過一篇 將 Android APK 檔案反編譯成 Java 原始碼

裡面主要是用 dex2jar 和 JD-GUI 來反編譯 APK,

後來也遇到了 JD-GUI 無法在 macOS Big Sur 上執行,因為缺少 Java 1.8 的問題。

 

不過最近用它來反編譯一個 APK 時,結果沒有很好,

裡面蠻常會看到有一堆 byte code 無法解譯的狀況:

 

上網再搜尋了一番,有人建議 jadx 這個工具。

試用了一下感覺不錯,來看一下吧~

 

1. 安裝 jadx

在 Mac 上用 Homebrew 就可以安裝 jadx:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew install jadx
brew install jadx
brew install jadx

 

2. 執行 jadx

在終端機裡可以對 APK 檔案直接執行  

jadx
jadx ,

不用先取出 .dex 檔案,也不用轉成 .jar 檔,這點是比較方便:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ jadx test.apk
INFO - loading ...
INFO - processing ...
ERROR - finished with errors, count: 15
$ jadx test.apk INFO - loading ... INFO - processing ... ERROR - finished with errors, count: 15
$ jadx test.apk

INFO  - loading ...
INFO  - processing ...
ERROR - finished with errors, count: 15

 

這會產生一個目錄 (像 test.apk 就會產生一個 test 目錄),

裡面會有各種資源,像是 resources 下面可能會有相關的圖檔 / XML,

而在 sources 目錄下會有反編譯後的 Java 檔:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
test
├── resources
│ ├── AndroidManifest.xml
│ ├── META-INF
│ │ ├── androidx.cardview_cardview.version
......
│ ├── assets
│ │ ├── traffic.html
│ │ ├── images
│ │ │ ├── icon09.png
......
│ ├── res
│ │ ├── anim
│ │ │ ├── abc_fade_in.xml
......
└── sources
├── android
│ └── support
│ └── v4
│ ├── app
│ │ ├── INotificationSideChannel.java
│ │ └── RemoteActionCompatParcelizer.java
│ └── graphics
│ └── drawable
│ └── IconCompatParcelizer.java
├── androidx
│ ├── activity
│ │ ├── Cancellable.java
│ │ ├── ComponentActivity.java
......
test ├── resources │ ├── AndroidManifest.xml │ ├── META-INF │ │ ├── androidx.cardview_cardview.version ...... │ ├── assets │ │ ├── traffic.html │ │ ├── images │ │ │ ├── icon09.png ...... │ ├── res │ │ ├── anim │ │ │ ├── abc_fade_in.xml ...... └── sources ├── android │ └── support │ └── v4 │ ├── app │ │ ├── INotificationSideChannel.java │ │ └── RemoteActionCompatParcelizer.java │ └── graphics │ └── drawable │ └── IconCompatParcelizer.java ├── androidx │ ├── activity │ │ ├── Cancellable.java │ │ ├── ComponentActivity.java ......
test
├── resources
│   ├── AndroidManifest.xml
│   ├── META-INF
│   │   ├── androidx.cardview_cardview.version
......
│   ├── assets
│   │   ├── traffic.html
│   │       ├── images
│   │       │   ├── icon09.png
......
│   ├── res
│   │   ├── anim
│   │   │   ├── abc_fade_in.xml
......
└── sources
    ├── android
    │   └── support
    │       └── v4
    │           ├── app
    │           │   ├── INotificationSideChannel.java
    │           │   └── RemoteActionCompatParcelizer.java
    │           └── graphics
    │               └── drawable
    │                   └── IconCompatParcelizer.java
    ├── androidx
    │   ├── activity
    │   │   ├── Cancellable.java
    │   │   ├── ComponentActivity.java
......

 

另一種方式是執行  

jadx-gui
jadx-gui ,

這會開啟一個 GUI 程式,可以載入 APK 檔案,

在視窗裡就可以直接檢視反編譯後的 Java 內容:

 

以上面的例子來說,jadx 解出來的結果是比 JD-GUI 要好,

像  

b()
b() 這個函式在 JD-GUI 裡是解不出來的,

在 jadx 裡就可以成功解出~

 

不過這也不代表 jadx 一定就比 JD-GUI 好,

給定不同的 APK,可能結果會完全不同。

還是要多方嘗試不同種的工具,再來挑選較好的結果囉~

 

參考資料:android – decompiling DEX into Java sourcecode – Stack Overflow

(本頁面已被瀏覽過 1,124 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料