請大家不要用此方法對apk做惡意修改,維護世界和平。
下載下傳相關工具
-
Apktool: 反編譯apk的工具
https://ibotpeaches.github.io/Apktool/install/
根據安裝向導,完成安裝
-
dex2jar: 将dex轉換成class檔案的工具
https://sourceforge.net/projects/dex2jar/files/
-
JD-GUI: 檢視class源碼的圖形化工具
http://jd.benow.ca/
反編譯——看源碼
一、用Apktool反編譯整個項目
apktool d -s {apk路徑}// -s 不反編譯源碼
預設會将apk反編譯到目前目錄下,檔案結構如下圖:
Android項目的三大部分:代碼、資源檔案、清單檔案。
目前資源檔案和清單檔案可以直接檢視了,而classes.dex則是代碼。
二、用dex2jar反編譯dex
将dex2jar壓縮包解壓,執行d2j-dex2jar:
預設會将dex轉換的jar存放在目前目錄下。
如果出現錯誤 d2j_invoke.sh: Permission denied,執行指令如下:
sudo chmod +x d2j_invoke.sh
三、用JD-GUI檢視jar檔案
将JD-GUI壓縮包解壓,運作之。
用工具打開上面新出爐的jar,即可檢視jar中的class檔案源碼。
至此,已經實作了檢視apk中的所有内容。
反編譯——修改源碼
下面在可檢視源碼的基礎上,要對apk的源碼進行修改并重新打包。
改源碼
當然,并不是所有的代碼都可以改,比如已經編譯出來的id等等。但是簡單的增/删/改一些小邏輯,還是沒有問題的。
一、用Apktool重新反編譯apk
這次apktool不需要加-s
反編譯出來的檔案裡,smali檔案夾代替了上面的classes.dex。但smali的目錄結構與上面的class目錄結構是相同的,依然可以找到上面的AlarmListActivity,如圖:
二、修改對應的smali檔案
Smali可以了解為是Dalvik編譯出來的代碼。Smali文法需要自行查閱學習,但如果你隻做簡單的修改,可以複制現有的smali代碼。
比如,我要在AlarmNotifyActivity的release方法中加一句finish。可以先在class源碼中找到AlarmListActivity中的finish位置,再找到對應的smali代碼并複制,然後粘貼在AlarmNotifyActivity對應的smali檔案中。
PS:注意複制過來的代碼中,資訊是否與目前類對應
Apktool重新打包
一、打包apk
修改完源碼,需要打包成apk,運作程式。
打包出來的apk存放在項目目錄中的dist檔案中,該apk處于未簽名狀态。
二、簽名apk
由于你的keystore與原開發者的keystore不同,是以簽名後的apk與原apk的簽名肯定不同。但可以在裝置上先解除安裝原來的app,再重新安裝新的apk。