APK反編譯工具的使用

前言

處理反編譯,首先先要了解apk文件的結構,然后是編譯過程,最后是反編譯。
反編譯Apk的目的就是Apk拆成我們可以閱讀的文件。通過反編譯,我們一般想要得到里面的AndroidManifest.xml文件、res文件和java代碼。

任務

了解apk文件的結構,怎樣編譯,最后要會簡單的反編譯一些Apk.

了解apk文件

首先來簡單的說明下Apk文件本質上其實是一個zip包。直接拿解壓工具解壓就可以看到其中包含了什么。
為了方便看apk的目錄,我們引入我們的第一個工具Android Studio,沒錯就是我們的官方編譯工具。

Android Studio 自帶的 APK Analyzer 可直接查看APK內的 圖片,xml內容,dex結構,文件尺寸等,還可以比較兩個apk的差異。
雖然不能導出資源有點可惜,但已經很強大方便了。
用法:將 apk 拖入 AndroidStudio 的窗口就好了。
參考:安卓官方文檔

下面是自己拖入的一個APK:

上圖很詳細的說明了各個文件的作用。

Android 打包流程(編譯過程)

在了解了 apk 文件的結構后,我們開始分析 Android 的打包流程。

通常有2種打包方式:

  • Android Studio圖形界面 點擊run按鈕
  • 命令行方式 gradlew assembleDebug, gradlew assembleRelease

方式1使用自動生成的debug keystore簽名;方式2如果是Release包使用release keystore簽名,如果是Debug包則使用debug keystore簽名。

下面展示最基本的打包流程:

上圖是Android官方提供的打包簡略流程圖。清晰地展示了一個Android Project經過編譯和打包后生成apk文件,然后再經過簽名,就可以安裝到設備上。

下面我們分析一下詳細流程,最好的還是看圖:

我們先分析新版本:
典型 Android 應用模塊的構建流程通常依循下列步驟:(下面是官方文檔)

  1. 編譯器將您的源代碼轉換成 DEX(Dalvik Executable) 文件(其中包括運行在 Android 設備上的字節碼),將所有其他內容轉換成已編譯資源。

  2. APK 打包器將 DEX 文件和已編譯資源合并成單個 APK。不過,必須先簽署 APK,才能將應用安裝并部署到 Android 設備上。

  3. APK 打包器使用調試或發布密鑰庫簽署您的 APK:

    a. 如果您構建的是調試版本的應用(即專用于測試和分析的應用),打包器會使用調試密鑰庫簽署您的應用。Android Studio 自動使用調試密鑰庫配置新項目。

    b. 如果您構建的是打算向外發布的發布版本應用,打包器會使用發布密鑰庫簽署您的應用。要創建發布密鑰庫,請閱讀在 Android Studio 中簽署您的應用。

  4. 在生成最終 APK 之前,打包器會使用 zipalign 工具對應用進行優化,減少其在設備上運行時的內存占用。

構建流程結束時,您將獲得可用來進行部署、測試的調試 APK,或者可用來發布給外部用戶的發布 APK。

下面是分塊的總結:::

  1. 資源
    Android 打包流程的第一步,是處理資源文件。
    在這個步驟中,起主要作用的是 aapt。
    剛剛提及的 AndroidManifest.xml, res 文件夾,resource.arsc 文件的生成都與其有關,簡單來說,aapt 解析項目代碼中的 AndroidManifest.xml,收集項目中 res 文件夾的資源文件及 xml 文件,對其做壓縮以及編譯的處理。在此過程中,分配了資源 id 并生成了 R.java 文件 以及 arsc 文件。
  2. 代碼
    上一步得到了 R.java 文件后,將其與項目代碼一起編譯得到 .class文件,然后打包為 jar 包。這個過程中,還會有混淆代碼這一步驟。之后,再通過 dx 工具,將生成的 jar 包與第三方庫的 jar 包一起編譯為 dex 文件。這個過程中,如果是 5.0 以前的系統且超過了 65535 方法數的限制,需要人為的分 dex,5.0 以后則由 dx 工具包辦。
    到這一步,實際上 apk 所需要的主要內容已經大致齊全了。只需要把上面生成的 AndroidManifest.xml,classes.dex,res文件夾,resource.arsc 打包進 apk,并且將項目工程中的 assets 以及 lib 目錄一并放入,就有了一個未經簽名的 Android 安裝包了。
  3. 簽名
    接下來還缺簡單但是卻關鍵的最后一步,那便是 apk 包的簽名,這一步在之前對 META-INF 的介紹中,實際已有提及。只需要按步驟生成 MANIFEST.MF, CERT.RSA,CERT.SF 并放入META-INF 文件夾即可。

在網上找到一個更詳細的流程圖:鏈接

APK反編譯工具

1.利用ApkTool,獲取AndroidManifest和res等資源文件

工具地址: https://ibotpeaches.github.io/Apktool/
進入官網有詳細的使用過程:https://ibotpeaches.github.io/Apktool/install/
具體如下圖:

我來寫一下我自己的詳細步驟:
1.在D盤新建一個文件夾命名為apktool,進入此文件夾。
2.新建一個空的apktool.bat文件,點擊上圖第一步的wrapper script跳轉到新的網頁,復制網頁的所有內容,打開apktool.bat文件,把剛才復制的內容粘貼到里面,保存。
3.點擊上圖第二步的find newest here下載最新的jar包,下載到本地后改名為apktool.jar,移動到D://ApkTool下面。
4.把要反編譯的文件比如no.apk放入到D://ApkTool目錄下,打開命令行,切換到D://ApkTool目錄下,運行java -jar apktool.jar d no.apk
5.執行完上面的文件就可以得到一個no文件夾。打開文件夾就能看到AndroidManifest和res等資源文件。

以上就是ApkTool的使用,最后的結果如下:

2.dex2jar反編譯dex文件,jd-gui 可視化反編譯配合使用

2.1 dex2jar反編譯dex文件,得到java源代碼

dex2jar 可將 .dex 轉換成 .jar
參考: https://github.com/pxb1988/dex2jar
下載:https://bitbucket.org/pxb1988/dex2jar/downloads/
詳細的使用步驟:
1.下載dex2jar-2.0.zip的壓縮包(寫這篇文章時名字是dex2jar-2.0),新建文件D://apkdex,然后把dex2jar-2.0.zip放入到apkdex文件中,解壓得到dex2jar-2.0文件夾.
2.把要反編譯的文件比如no.apk改名為no.zip,把里面的classes.dex取出來復制到dex2jar-2.0文件夾下面。
3.打開命令行,切換到D://apkdex//dex2jar-2.0目錄下,運行d2j-dex2jar classes.dex -o classes.jar.在文件夾下面就會形成classes.jar文件。
4.如果有多個.dex文件,就多次執行d2j-dex2jar xxx.dex -o xxx.jar得到相應的文件。

那么得到的jar文件怎樣看呢??就需要下面的步驟了。

2.2 jd-gui 可視化反編譯查看 .jar 文件

官網:http://jd.benow.ca/
下載:http://jd.benow.ca/#jd-gui-download
具體的使用:
下載完成后直接打開,把生成的classes-dex2jar.jar 文件直接拖到里面就可以觀看了.如下圖

3.jadx反編譯Akp,得到.java源代碼

工具地址 :
github: https://github.com/skylot/jadx/releases
sourceforge: http://sourceforge.net/projects/jadx/files/

兩個優點:

1.可以直接反編譯出.java文件
2.查看源碼時直接顯示資源名稱,而不是像jd-gui里顯示的資源ID

安裝: 下載完成后進行解壓到自己指定的目錄。
使用: 進入bin目錄下執行jadx-gui.bat,jadx也有GUI,進入后選中然將要反編譯的apk即可,運行效果如下。

4.android-classyshark全自動的反編譯工具

下載:https://github.com/google/android-classyshark/releases
使用:直接打開,拖拽apk進入就可以。運行效果如下:

上面應該夠用的了吧!!
如果有新的編譯工具,請在下面留言。。。謝謝。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容