準(zhǔn)備工作,工具下載配置
反編譯會(huì)使用到的工具有apktool、dex2jar、jd-gui.
現(xiàn)在開始下載安裝和配置
- apktool配置
1.右鍵保存鏈接為apktool wrapper script
2.apktool.jar下載地址 打開可以看到歷史版本列表,可以選擇最新版本的,此教程使用的版本為:2.1.1. 下載成功重命名為apktool.jar.
3.將apktool.jar和apktool拷貝到/usr/local/bin(需要root權(quán)限)
4.修改這兩個(gè)文件的權(quán)限:chmod + x
5.現(xiàn)在就可以在終端運(yùn)行apktool
命令了。配置正常運(yùn)行apktool
命令顯示如下:
Apktool v2.1.1 - a tool for reengineering Android apk files
with smali v2.1.2 and baksmali v2.1.1
Copyright 2014 Ryszard Wi?niewski brut.alll@gmail.com
Updated by Connor Tumbleson connor.tumbleson@gmail.com
……
For additional info, see: http://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali
* dex2jar下載配置
1.[dex2jar下載地址](https://sourceforge.net/projects/dex2jar/),下載后可以看到目錄`dex2jar-2.0/`,查看目錄文件如下圖所示:
```
lasses.dex d2j-jar2jasmin.sh
d2j-baksmali.bat d2j-jasmin2jar.bat
d2j-baksmali.sh d2j-jasmin2jar.sh
d2j-dex-recompute-checksum.bat d2j-smali.bat
d2j-dex-recompute-checksum.sh d2j-smali.sh
d2j-dex2jar.bat d2j-std-apk.bat
d2j-dex2jar.sh d2j-std-apk.sh
d2j-dex2smali.bat d2j_invoke.bat
d2j-dex2smali.sh d2j_invoke.sh
d2j-jar2dex.bat lib
d2j-jar2dex.sh old_jinrong_classes.jar
d2j-jar2jasmin.bat
2.修改*.sh
的權(quán)限:
執(zhí)行命令:chmod a+x *.sh
- jd-gui下載配置
jd-gui下載地址
下載成功直接打開名為jd-gui
的文件就可以使用
工具都準(zhǔn)備好了,現(xiàn)在開始反編譯
1.反編譯AndroidManifest和資源文件
為了防止文件目錄太亂,最好新建一個(gè)目錄進(jìn)行以下操作此教程使用/WorkSpace/apkDecompileTest/
(根據(jù)個(gè)人習(xí)慣),將需要反編譯的apk(此教程使用testapp.apk
)和dex2jar-2.0/
均拷貝到該目錄.
使用apktool工具反編譯apk,可以獲取到AndroidManifest.xml和使用到的資源文件
使用命令:$ apktool d testapp.apk
會(huì)看到一些日志輸出,等執(zhí)行完畢將會(huì)看到在目錄下多了一個(gè)目錄testapp/
,其中就包含我們想要的AndroidManifest.xml和res/.
此時(shí)資源文件反編譯就完成了,下面繼續(xù)反編譯java代碼.
2.反編譯java代碼
使用dex2jar工具可以反編譯apk的java代碼,下面會(huì)介紹2種方式進(jìn)行反編譯.
方法一
1.先解壓縮.apk文件
#unzip testapp.apk -d testapp_source
// 解壓縮testapp.apk并將解壓縮的文件放到目錄testapp_source/中
2.在目錄testapp_source/中可以看到有個(gè)classs.dex,接下來執(zhí)行
sh dex2jar-2.0/d2j-dex2jar.sh testapp_source/classes.dex
// 將.dex文件反編譯為.class文件
執(zhí)行完畢就可以在該目錄看到多了一個(gè)文件classes-dex2jar.jar
,此時(shí)使用jd-gui打開該文件就可以看到j(luò)ava代碼了。
方法二
1.直接執(zhí)行
sh dex2jar-2.0/d2j-dex2jar.sh testapp.apk
同樣可以看到目錄下多了一個(gè)文件testapp-dex2jar.jar
,使用jd-gui打開該文件跟方法一看到的是一樣的。
方法二相比較比方法一少了解壓縮的步驟。
注意
在目錄中修改.sh的權(quán)限
chmod a+x *.sh
否則直接執(zhí)行會(huì)提示:
d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied
此處可以做一些修改(請(qǐng)保證原App不會(huì)被惡意修改)!
重新打包
apktool b testapp // 在testapp的上一層目錄中執(zhí)行該命令
成功執(zhí)行之后會(huì)發(fā)現(xiàn)目錄testapp/
中多了兩個(gè)目錄dist/ 和 build/
,其中dist/
中就是我們重新打包出來的安裝包。
接下來對(duì)生成的apk進(jìn)行簽名,執(zhí)行下面的命令行:
jarsigner -verbose -keystore testapp.keystore -signedjar testapp-signed.apk testapp.apk testapp.keystore -verbose 輸出簽名詳細(xì)信息 -keystore 指定密鑰對(duì)的存儲(chǔ)路徑 -signedjar 后面三個(gè)參數(shù)分別是簽名后的apk、未簽名的apk和密鑰對(duì)的別名