前言
處理反編譯,首先先要了解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 應用模塊的構建流程通常依循下列步驟:(下面是官方文檔)
編譯器將您的源代碼轉換成 DEX(Dalvik Executable) 文件(其中包括運行在 Android 設備上的字節碼),將所有其他內容轉換成已編譯資源。
APK 打包器將 DEX 文件和已編譯資源合并成單個 APK。不過,必須先簽署 APK,才能將應用安裝并部署到 Android 設備上。
-
APK 打包器使用調試或發布密鑰庫簽署您的 APK:
a. 如果您構建的是調試版本的應用(即專用于測試和分析的應用),打包器會使用調試密鑰庫簽署您的應用。Android Studio 自動使用調試密鑰庫配置新項目。
b. 如果您構建的是打算向外發布的發布版本應用,打包器會使用發布密鑰庫簽署您的應用。要創建發布密鑰庫,請閱讀在 Android Studio 中簽署您的應用。
在生成最終 APK 之前,打包器會使用 zipalign 工具對應用進行優化,減少其在設備上運行時的內存占用。
構建流程結束時,您將獲得可用來進行部署、測試的調試 APK,或者可用來發布給外部用戶的發布 APK。
下面是分塊的總結:::
- 資源
Android 打包流程的第一步,是處理資源文件。
在這個步驟中,起主要作用的是 aapt。
剛剛提及的 AndroidManifest.xml, res 文件夾,resource.arsc 文件的生成都與其有關,簡單來說,aapt 解析項目代碼中的 AndroidManifest.xml,收集項目中 res 文件夾的資源文件及 xml 文件,對其做壓縮以及編譯的處理。在此過程中,分配了資源 id 并生成了 R.java 文件 以及 arsc 文件。 - 代碼
上一步得到了 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 安裝包了。 - 簽名
接下來還缺簡單但是卻關鍵的最后一步,那便是 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進入就可以。運行效果如下:
上面應該夠用的了吧!!
如果有新的編譯工具,請在下面留言。。。謝謝。。