前言
處理反編譯魄揉,首先先要了解apk文件的結(jié)構(gòu)棉饶,然后是編譯過程,最后是反編譯放前。
反編譯Apk的目的就是Apk拆成我們可以閱讀的文件干奢。通過反編譯痊焊,我們一般想要得到里面的AndroidManifest.xml文件、res文件和java代碼忿峻。
任務
了解apk文件的結(jié)構(gòu)薄啥,怎樣編譯,最后要會簡單的反編譯一些Apk.
了解apk文件
首先來簡單的說明下Apk文件本質(zhì)上其實是一個zip包逛尚。直接拿解壓工具解壓就可以看到其中包含了什么垄惧。
為了方便看apk的目錄,我們引入我們的第一個工具Android Studio
,沒錯就是我們的官方編譯工具绰寞。
Android Studio 自帶的 APK Analyzer 可直接查看APK內(nèi)的 圖片到逊,xml內(nèi)容,dex結(jié)構(gòu)滤钱,文件尺寸等觉壶,還可以比較兩個apk的差異。
雖然不能導出資源有點可惜件缸,但已經(jīng)很強大方便了铜靶。
用法:將 apk 拖入 AndroidStudio 的窗口就好了。
參考:安卓官方文檔
下面是自己拖入的一個APK:
上圖很詳細的說明了各個文件的作用他炊。
Android 打包流程(編譯過程)
在了解了 apk 文件的結(jié)構(gòu)后争剿,我們開始分析 Android 的打包流程。
通常有2種打包方式:
- Android Studio圖形界面 點擊run按鈕
- 命令行方式 gradlew assembleDebug, gradlew assembleRelease
方式1使用自動生成的debug keystore簽名痊末;方式2如果是Release包使用release keystore簽名蚕苇,如果是Debug包則使用debug keystore簽名。
下面展示最基本的打包流程:
上圖是Android官方提供的打包簡略流程圖凿叠。清晰地展示了一個Android Project經(jīng)過編譯和打包后生成apk文件涩笤,然后再經(jīng)過簽名,就可以安裝到設備上。
下面我們分析一下詳細流程辆它,最好的還是看圖:
我們先分析新版本:
典型 Android 應用模塊的構(gòu)建流程通常依循下列步驟:(下面是官方文檔)
編譯器將您的源代碼轉(zhuǎn)換成 DEX(Dalvik Executable) 文件(其中包括運行在 Android 設備上的字節(jié)碼),將所有其他內(nèi)容轉(zhuǎn)換成已編譯資源履恩。
APK 打包器將 DEX 文件和已編譯資源合并成單個 APK锰茉。不過,必須先簽署 APK切心,才能將應用安裝并部署到 Android 設備上飒筑。
-
APK 打包器使用調(diào)試或發(fā)布密鑰庫簽署您的 APK:
a. 如果您構(gòu)建的是調(diào)試版本的應用(即專用于測試和分析的應用),打包器會使用調(diào)試密鑰庫簽署您的應用绽昏。Android Studio 自動使用調(diào)試密鑰庫配置新項目协屡。
b. 如果您構(gòu)建的是打算向外發(fā)布的發(fā)布版本應用,打包器會使用發(fā)布密鑰庫簽署您的應用全谤。要創(chuàng)建發(fā)布密鑰庫肤晓,請閱讀在 Android Studio 中簽署您的應用。
在生成最終 APK 之前认然,打包器會使用 zipalign 工具對應用進行優(yōu)化补憾,減少其在設備上運行時的內(nèi)存占用。
構(gòu)建流程結(jié)束時卷员,您將獲得可用來進行部署盈匾、測試的調(diào)試 APK,或者可用來發(fā)布給外部用戶的發(fā)布 APK毕骡。
下面是分塊的總結(jié):::
- 資源
Android 打包流程的第一步削饵,是處理資源文件。
在這個步驟中未巫,起主要作用的是 aapt窿撬。
剛剛提及的 AndroidManifest.xml, res 文件夾,resource.arsc 文件的生成都與其有關(guān)橱赠,簡單來說尤仍,aapt 解析項目代碼中的 AndroidManifest.xml,收集項目中 res 文件夾的資源文件及 xml 文件狭姨,對其做壓縮以及編譯的處理宰啦。在此過程中,分配了資源 id 并生成了 R.java 文件 以及 arsc 文件饼拍。 - 代碼
上一步得到了 R.java 文件后赡模,將其與項目代碼一起編譯得到 .class文件,然后打包為 jar 包师抄。這個過程中漓柑,還會有混淆代碼這一步驟。之后,再通過 dx 工具辆布,將生成的 jar 包與第三方庫的 jar 包一起編譯為 dex 文件瞬矩。這個過程中,如果是 5.0 以前的系統(tǒng)且超過了 65535 方法數(shù)的限制锋玲,需要人為的分 dex景用,5.0 以后則由 dx 工具包辦。
到這一步惭蹂,實際上 apk 所需要的主要內(nèi)容已經(jīng)大致齊全了伞插。只需要把上面生成的 AndroidManifest.xml,classes.dex盾碗,res文件夾媚污,resource.arsc 打包進 apk,并且將項目工程中的 assets 以及 lib 目錄一并放入廷雅,就有了一個未經(jīng)簽名的 Android 安裝包了耗美。 - 簽名
接下來還缺簡單但是卻關(guān)鍵的最后一步,那便是 apk 包的簽名榜轿,這一步在之前對 META-INF 的介紹中幽歼,實際已有提及。只需要按步驟生成 MANIFEST.MF, CERT.RSA谬盐,CERT.SF 并放入META-INF 文件夾即可甸私。
在網(wǎng)上找到一個更詳細的流程圖:鏈接
APK反編譯工具
1.利用ApkTool,獲取AndroidManifest和res等資源文件
工具地址: https://ibotpeaches.github.io/Apktool/
進入官網(wǎng)有詳細的使用過程:https://ibotpeaches.github.io/Apktool/install/
具體如下圖:
我來寫一下我自己的詳細步驟:
1.在D盤新建一個文件夾命名為apktool飞傀,進入此文件夾皇型。
2.新建一個空的apktool.bat文件,點擊上圖第一步的wrapper script
跳轉(zhuǎn)到新的網(wǎng)頁砸烦,復制網(wǎng)頁的所有內(nèi)容弃鸦,打開apktool.bat文件,把剛才復制的內(nèi)容粘貼到里面幢痘,保存唬格。
3.點擊上圖第二步的find newest here
下載最新的jar包,下載到本地后改名為apktool.jar颜说,移動到D://ApkTool
下面购岗。
4.把要反編譯的文件比如no.apk放入到D://ApkTool
目錄下,打開命令行门粪,切換到D://ApkTool
目錄下喊积,運行java -jar apktool.jar d no.apk
5.執(zhí)行完上面的文件就可以得到一個no文件夾。打開文件夾就能看到AndroidManifest和res等資源文件玄妈。
以上就是ApkTool的使用,最后的結(jié)果如下:
2.dex2jar反編譯dex文件乾吻,jd-gui 可視化反編譯配合使用
2.1 dex2jar反編譯dex文件髓梅,得到java源代碼
dex2jar 可將 .dex 轉(zhuǎn)換成 .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文件擒权,就多次執(zhí)行d2j-dex2jar xxx.dex -o xxx.jar
得到相應的文件。
那么得到的jar文件怎樣看呢阁谆?碳抄?就需要下面的步驟了。
2.2 jd-gui 可視化反編譯查看 .jar 文件
官網(wǎng):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/
兩個優(yōu)點:
1.可以直接反編譯出.java文件
2.查看源碼時直接顯示資源名稱,而不是像jd-gui里顯示的資源ID
安裝: 下載完成后進行解壓到自己指定的目錄焰盗。
使用: 進入bin目錄下執(zhí)行jadx-gui.bat璧尸,jadx也有GUI,進入后選中然將要反編譯的apk即可熬拒,運行效果如下爷光。
4.android-classyshark全自動的反編譯工具
下載:https://github.com/google/android-classyshark/releases
使用:直接打開,拖拽apk進入就可以澎粟。運行效果如下:
上面應該夠用的了吧V颉!
如果有新的編譯工具活烙,請在下面留言徐裸。。啸盏。謝謝重贺。。