首先明確,反編譯別人apk是一件不厚道的事情。代碼是程序員辛苦工做的成果,想經過這種手段坐享其成,是不對的。這也說明,代碼指鹿爲馬常重要的。本文抱着學習的態度,研究在一些特殊的狀況下若是有須要,該怎麼反編譯apk。html
apktool,編譯和反編譯apk,從apk中提取圖片和佈局資源android
dex2jar,將可運行文件classes.dex反編譯爲jar源碼文件git
jd-gui,查看jar源碼文件程序員
Windows系統:
1. 首先確保系統安裝有Java
2. 下載apktool.bat腳本
3. 下載最新版本的apktool.jar,而且重命名爲apktool.jar
4. 將apktool.bat和apktool.jar放在同一目錄下,就能夠在命令行窗口使用了。
5. 其餘系統請參考連接github
能夠直接在命令行執行apktool.bat查看幫助。這裏介紹兩個最經常使用的:算法
apktool.bat d -o <output_dir> test.apk
其中<output_dir>指定輸出目錄,默認爲apk.out。windows
apktool.bat b -o <output.apk> <input_dir>
其中<input_dir>就是上面反編譯輸出的目錄,<ouput.apk>是編譯的輸出結果,默認爲dist/<name>.apk。工具
一個典型的apktool反編譯的結果以下:佈局
此時,能夠查看AndroidManifest.xml,res及smali文件了。甚至能夠修改這個目錄下的資源文件或者smali文件,而後從新編譯。學習
值得注意的是,apktool反編譯出來只能獲得apk的smali文件,即彙編語言版本,並不能獲得源代碼。
一. 這裏須要用到另外兩個工具,下載dex2jar並解壓。下載jd-gui,這是一個帶UI的應用程序。
二. 將須要反編譯的apk的後綴名改成.zip或者.rar,而後解壓到一個文件夾,獲得其中的classes.dex文件。
三. 將classes.dex複製到解壓後的dex2jar-2.0文件夾下。從命令行進入到該目錄,執行
d2j-dex2jar.bat classes.dex
會生成由classes.dex反編譯獲得的jar文件,classes-dex2jar.jar。
四. 而後使用jd-gui打開classes-dex2jar.jar,就能夠查看源碼了。
若是apk在發佈的時候加過混淆處理,那麼咱們也只能獲得混淆後的版本。想經過閱讀源碼來破解別人的apk,仍是有一些難度的。
若是隻是修改apk相應的資源,例如圖片,比較好辦,在res文件夾下找到相應的文件替換就能夠。
修改代碼比較麻煩,由於反編譯出來的結果中只有smali文件,即Java虛擬機支持的彙編語言。
若是確實須要修改代碼,就得對照smali文件和從classes.dex反編譯出來的源碼了,按照smali的規範來改動便可。至關於寫彙編,這個難度比較大。
使用apktool編譯前面反編譯生成的目錄便可。
簽名是對要發佈的apk文件做標記,確保你的apk文件有惟一的身份歸屬認證,只有相同簽名和相同包名的文件才能夠覆蓋安裝並保留用戶信息。
對於反編譯的apk,咱們能夠經過jarsigner來對它進行簽名。
首先,簽名須要keystore文件,可使用keytool工具生成,通常Java環境都帶有keytool命令,能夠在命令行測試。
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
各個參數解釋以下:
-genkey 產生證書文件
-alias 產生別名
-keystore 指定密鑰庫的.keystore文件中
-keyalg 指定密鑰的算法,這裏指定爲RSA(非對稱密鑰算法)
-validity 爲證書有效天數,這裏咱們寫的是40000天
輸入上述命令後,會有以下的提示:
輸入keystore密碼: 再次輸入新密碼: 您的名字與姓氏是什麼? [Unknown]: test 您的組織單位名稱是什麼? [Unknown]: test 您的組織名稱是什麼? [Unknown]: 您所在的城市或區域名稱是什麼? [Unknown]: 您所在的州或省份名稱是什麼? [Unknown]: 該單位的兩字母國家代碼是什麼 [Unknown]: CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎? [否]: y 輸入<demo.keystore>的主密碼 (若是和 keystore 密碼相同,按回車):
jarsigner也存在於Java JDK的安裝包當中,因此安裝好了Java環境的話,能夠直接在命令行使用。
jarsigner -verbose -keystore demo.keystore demo.apk demo.keystore
-verbose 指定生成詳細輸出
-keystore 指定數字證書存儲路徑
對於Android Studio生成的jks文件
jarsigner -digestalg SHA1 -sigalg SHA1withRSA(或SHA1withDSA) -verbose -keystore xxx.jks -signedjar xxx.apk(簽名後的apk名字) xxx.apk(須要簽名的apk) xxx(keystore別名)
例如:
jarsigner -digestalg SHA1 -sigalg SHA1withRSA -verbose -keystore ttl.jks -signedjar dest1.apk dest.apk CP
也能夠增長storepass參數,來設置密碼口令.這樣就不用手動敲了
-storepass xxxxx
這樣,就完成了對一個apk的簽名過程,而後就能夠安裝使用了。注意若是你的手機上原來就有這個apk,須要卸載掉。由於新apk的簽名已經改變了。