我們下載到的 App 安裝包是 Apk 文件(Android Application Package) 胆绊。通過 Apk 文件辑舷,我們也可以得到這個應(yīng)用的代碼和資源文件何缓,對應(yīng)用進(jìn)行修改还栓。
那么我們?nèi)绾潍@取這些文件呢剩盒?這就需要 Android 反編譯技術(shù)辽聊。
01 所需要的軟件
Apktool
反編譯 xml 文件和 dex 文件跟匆,并可以將編譯后的項(xiàng)目重新打包成 apk玛臂。
官方下載地址: Apktool
官方的速度有時候不穩(wěn)定封孙,也可以從我的網(wǎng)盤中下載: 鏈接 密碼:xkaodex2jar
將 classes.dex 轉(zhuǎn)換為「.jar」文件)
官方下載地址: dex2jar
我的網(wǎng)盤: 鏈接 密碼:xkao
02 Apktool
我們可以通過 Apktool 可以將 apk 文件進(jìn)行反編譯,但是直接把 apk 的擴(kuò)展名改成「.zip」也可以對其進(jìn)行解壓并得到一些資源文件橱鹏。
- META-INF 里保存 App 的簽名信息
- classes.dex
.dex 是 Dalvik 虛擬機(jī)上的可執(zhí)行文件挑围,需要使用 dex2jar 將其轉(zhuǎn)換為 jar 文件 - AndroidManifest.xml
Android 清單文件贮勃,向 Android 系統(tǒng)提供應(yīng)用的必要信息寂嘉。 - assets
存放一些資源文件字體泉孩,聲音等寓搬。 - lib
存放第三方庫 - original
存放未經(jīng)過反編譯的等 AndroidManifest.xml 文件 - res
存放資源文件句喷,例如圖片,顏色兄春,字符等赶舆。 - smali
smali 里存放的是 java 編譯成的 smali 代碼芜茵,smali 相當(dāng)于 Android 虛擬機(jī)上運(yùn)行的語言九串。
直接解壓可以得到一些資源文件蒸辆,但是 AndroidManifest.xml 和其他的 xml 文件都是亂碼析既,通過 Apktool 進(jìn)行反編譯,可以最大限度的還原這些文件的內(nèi)容拂玻。
02 - 1 安裝 Apktool
Windows :
- 到 這里 或者我的 網(wǎng)盤鏈接 里下載好 script 腳本文件檐蚜,修改名稱「apktool.bat」(如果從我的網(wǎng)盤下載闯第,無須修改名稱)
到 這里 或者我的 網(wǎng)盤鏈接 下載 apktool咳短,然后修改名稱為「apktool.jar」
將「apktool.jar」和「apktool.bat」移動到 windows 目錄(一般在 C://windwos 下)
在命令行中輸入
$ apktool
如果出現(xiàn)
則說明安裝成功咙好,若沒有出現(xiàn)勾效,則需要把「apktool.jar」层宫、「apktool.bat」的路徑添加到系統(tǒng)的環(huán)境變量中其监。
Mac OS:
到 這里 或者我的 網(wǎng)盤鏈接 里下載好 script 腳本文件棠赛,修改名稱「apktool」(如果從我的網(wǎng)盤下載睛约,無須修改名稱) 。
到 這里 或者我的 網(wǎng)盤鏈接 下載 apktool贸伐,然后修改名稱為「apktool.jar」捉邢。
把「apktool」、「apktool.jar」移動到
/usr/local/bin
目錄下在命令行中 cd 到
/usr/local/bin
中然后分別輸入下面兩條命令
$ chmod a+x d2j_invoke.sh
$ chmod a+x d2j-dex2jar.sh
- 在命令行中輸入
$ apktool
出現(xiàn)
則安裝成功
02 - 2 反編譯 Apk
- cd 到 apk 的目錄下
- 輸入
$ apktool d test.apk
運(yùn)行完成后宠进,得到一個包含資源文件和代碼的文件:
注意:
此時 dex 文件直接反編譯成了 smali 文件,而我們需要的是 .dex 文件吝镣。
此時再運(yùn)行:
$ apktool d -s -f test.apk
-d 反編譯 apk 文件
-s 不反編譯 dex 文件,而是將其保留
-f 如果目標(biāo)文件夾存在闸溃,則刪除后重新反編譯
此時得到這樣的文件夾:
02 - 3 打包辉川、簽名新的 Apk
為了演示如何將修改過后的 Apk 文件重新打包簽名员串,我寫了一個簡單的 Demo:把 Demo 的背景換了之后寸齐,進(jìn)行打包抄谐、簽名蛹含。
這是初始應(yīng)用程序的運(yùn)行效果:
- 使用 Apktool 反編譯
- 打開生成的目錄進(jìn)行修改
修改 bg.jpg 為另一張準(zhǔn)備好的圖片(注意前后命名一致)浦箱。
- 重新打包
$ apktool b b_test -o newtest.apk
-b 是指 build
b_test 是剛才反編譯出的文件所在的目錄
-o 用于指定新的文件名稱咽安,這里指定為「newtest.apk」
- 得到新的 apk 文件
注意:
此時的 apk 文件是不能安裝的妆棒,還需要對其進(jìn)行簽名糕珊。
- 對新的 Apk 進(jìn)行簽名:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore testjks -storepass password newtest.apk aliasName
簽名文件是我自己生成的红选,沒有辦法使用 Apk 原來的簽名進(jìn)行簽名纠脾。
現(xiàn)在將 Apk 安裝一下試試看:
可以看到苟蹈,背景資源已經(jīng)成功替換成我們設(shè)置的第二張圖片了慧脱。
03 dex2jar
下載、解壓好 dex2jar
將上一步得到的 classes.dex 文件(有時候還有 classes2.dex菱鸥,說明方法數(shù)過多氮采,把它當(dāng)成 classes.dex 處理就好了)復(fù)制到 dex2jar 解壓好的目錄中鹊漠。
在命令行中運(yùn)行:
$ sh d2j-dex2jar.sh classes.dex
如果提示:
d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied
執(zhí)行
$ sudo chmod +x d2j_invoke.sh
后再次執(zhí)行
$ sh d2j-dex2jar.sh classes.dex
運(yùn)行成功躯概,在當(dāng)前目錄下生成了 classes-dex2jar.jar 文件畔师。
04 jd-gui
安裝好 jd-gui 之后,用其將 classes-dex2jar.jar 打開姿锭,就可以看到反編譯出來的 java 代碼了呻此!
這里的代碼沒有經(jīng)過混淆趾诗,所以命名容易識別恃泪,如果是從應(yīng)用市場下載下來的 apk 文件贝乎,反編譯出來的代碼大部分是混淆過后的代碼。
出于對開發(fā)者的尊重和為了保持應(yīng)用的穩(wěn)定却舀,希望大家不要隨意修改別人的應(yīng)用程序挽拔,請僅從技術(shù)層面上妥善利用這一技術(shù)但校!