通過反編譯 我們可以獲得layout,源代碼,資源等。反編譯我們感興趣的apk,可以查看對應的內(nèi)容,借鑒人家的代碼。另外,有時候我們?yōu)榱藱z驗自己的應用是否混淆成功,通過反編譯可以查看混淆情況。
1.工具
注意:這些工具的正常使用要先搭好Java開發(fā)環(huán)境
下載后如下:
全部.png
2.工具安裝與使用
- apktool的使用
下載后放到新建的apktool文件夾下,將我們要反編譯的apk文件放入此文件夾下,命令行進入此文件夾,輸入java -jar apktool.jar d test.apk
進行反編譯,編譯后在此文件夾下生成了我們需要的文件,在里面我們可以看到layout等一些資源
apktool編譯后.png
生成的文件.png
layout.png
- dex2jar的使用
下載后解壓,把我們要反編譯的安裝包格式改為zip或rar,解壓后會得到classes.dex文件,把此文件放入dex2jar文件夾,命令行切換到此文件夾,輸入chmod +x d2j-dex2jar.sh
賦予可執(zhí)行權限,輸入sudo sh d2j-dex2jar.sh classes.dex
即可生成我們所需要的jar文件
注意:如果生成jar文件時出現(xiàn)異常,主要是Java版本太低(不小于7.0),通過升級Java版本或者降低dex2jar版本可以解決
生成classes.dex文件.png
生成jar文件.png
- jd-gui使用
打開jd-gui解壓包中的JD-GUI應用,打開后用此應用打開我們剛才生成的jar文件,然后可查看apk文件中的源代碼了
啟動JD-GUI.png
源代碼.png
注意:打開jar文件時JD_GUI可能會出現(xiàn) Invalid input fileloader錯誤,在命令行輸入:
sudo chmod +xr classes-dex2jar.jar
即可解決
屏幕快照 2017-06-02 14.58.54.png
3.重新打包簽名
- 將AndroidManifest.xml文件中channel值改為10001(如果沒有,就不用修改)
- 命令行到apktool文件夾下,輸入:
java -jar apktool.jar b apkName -o apkName_new.apk
,進行重新打包 - 簽名使用:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名文件名 -storepass 簽名密碼 待簽名的APK文件名 簽名的別名
- 簽名完成后,最好對APK文件進行對齊操作,這樣可以使得程序在Android系統(tǒng)中運行得更快,對齊操作使用的是zipalign工具,該工具在<Android SDK>/build-tools/<version> (我的路徑為:/Users/cxg/Library/Android/sdk/build-tools/25.0.2/zipalign)目錄下,需要將這個目錄配置到系統(tǒng)環(huán)境變量當中也可以在任何位置執(zhí)行此命令。
zipalign 4 new_name.apk new_name_aligned.apk
4.關于應用安全
通過反編譯我們看到了程序源代碼,布局等資源文件,有時候就需要對我們自己的應用進行保護,主要方法如下:
- 使用ProGuard進行混淆處理,可以增加反編譯的難度(這是最基本保護代碼的方法,還可以做到壓縮,優(yōu)化我們的代碼)
- 應用加固(可以防篡改,防反編譯,但也不是絕對的)
- 應用加密(同樣可以達到反編譯效果,可以使用第三方提供的相應服務)
5.后記
后期發(fā)現(xiàn)使用jadx方法也可以進行反編譯,此方法更簡單,更好用,反編譯出來的.class文件中的資源引用不是ID值,而是文件名。使用方法如下:
git clone https://github.com/skylot/jadx.git
cd jadx/
./gradlew dist
./jadx/build/jadx/bin/jadx-gui
- 如果安裝了之后在jadx目錄下運行
./build/jadx/bin/jadx-gui
即可