Android APK反編譯詳解

爲了學習新知識,或者在做安全測試過程中,我們經常都需要對Android apk進行反編譯來學習其源代碼或者瞭解其邏輯結構。

在對Android apk進行反編譯之前,我們必須瞭解apk的結構,apk文件其實是一個壓縮包,我們可以直接對其解壓縮,如下圖所示:


其中的classes.dex就是我們所需要的進行一系列編譯加密處理後的源代碼文件,而Androidmanifest.xml是加密後的安卓配置文件。另外幾個文件夾則包含了此app

的一些資源文件,比如圖片、音樂等。

我們知道,Android是用java開發的,我們使用到的反編譯工具,也都需要jdk環境,所以,在反編譯之前,請先配置好jdk。

classes.dex我們可以直接解壓縮apk獲取到,那麼怎麼拿到java源代碼呢?這時候我們需要用到幾個工具:

1. dex2jar    https://jaist.dl.sourceforge.net/project/dex2jar/dex2jar-2.0.zip

使用此工具可直接將dex文件轉換成jar包。使用方法很簡單,只需要一條命令。

將dex文件放到dex2jar目錄下(或者自己在使用命令時輸入詳細地址),輸入d2j-dex2jar classes.dex即可。


如圖所示,出現的classes-dex2jar.jar即爲源代碼jar包。要查看這個jar包,我們需要用到下面另外一個工具。

2. jd-gui     https://github.com/java-decompiler/jd-gui/releases/download/v1.4.0/jd-gui-1.4.0.jar

將前面轉換後的jar包直接使用jd-gui打開,即可看到此apk的java源代碼。


這兩個工具只能看到java源代碼,我們可以發現解壓縮apk後出現的Androidmanifest.xml打開是亂碼,包括其他資源文件也是亂七八糟的。我們需要得到原文件,就需要藉助另外一個工具:

3. apktool     https://ibotpeaches.github.io/Apktool/

apktool是一款非常強大的工具,只需要一條命令,即可逆向出apk的所有資源文件和Androidmanifest.xml,而且還能得到apk的smali文件,smali在安全測試中是經常需要用到的,可以直接查看應用運行邏輯。

使用方法: java -jar apktool.jar d *.apk

其中 「*.apk」指所需要反編譯的文件名。



如上圖所示,完成後,會在當前路徑生成一個文件夾,包含我們所需要的各種資源原文件,而且Androidmanifest.xml也變成了明文,到此,apk反編譯完成。