一、工具介紹:
1.apktool:aapt.exe,apktool.bat,apktool.jar;三個在同一目錄結合使用,用來反編譯apk,apk重新打包;
2.dex2jar:該工具作用是將classes.dex文件,反編譯出源碼(如果apk未加固),反編譯出文件,使用jd-gui工具進行查看;
3.Auto-Sign:自動簽名工具,將重新打包的apk進行簽名,如果不簽名,無法安裝使用。
工具下載地址:https://download.csdn.net/download/sxk874890728/10443156 (需要3CSDN積分,原本我設置3積分的,不知道為什么漲到16積分了......)
使用場景:項目源碼丟失,只有線上apk,並且沒有加固,要求修改apk接口地址,並且重新打包,再發布。
二、工具使用:
解壓后工具包如圖:
1.思路:使用工具dex2jar反編譯,並用jd-gui工具進行查看項目結構,查看源碼,並且找到接口地址類,修改接口地址;
步驟一:下載好工具,將需要反編譯的APK后綴名改為.rar或則 .zip,並解壓,如圖:
得到其中的classes.dex文件(它就是java文件編譯再通過dx工具打包而成的),將獲取到的
classes.dex復制到解壓出來的工具dex2jar-0.0.9.15 文件夾內,
在命令行下,進入到dex2jar.bat所在目錄,輸入命令:
dex2jar.bat classes.dex
效果如下:
步驟二:運行結束后,在該目錄下會生成一個classes_dex2jar.jar的文件,如圖:
然后打開工具jd-gui文件夾里的jd-gui.exe,用該工具打開生成的classes_dex2jar.jar文件,便可以看到源碼
了,效果如下:
2.思路:apktool,反編譯修改smali文件,進行重新打包,通過用jd-gui工具找到接口地址類后,與相應
的smali文件進行對比,修改接口地址;
下載上述工具中的apktool,解壓得到3個文件:aapt.exe,apktool.bat,apktool.jar ,將需要反編譯的
APK文件放到該目錄下,如圖:
打開命令行界面(運行-CMD) ,定位到apktool文件夾,輸入以下命令:
apktool.bat d -f test.apk -o test apktool -f [待反編譯的apk] -o [反編譯之后存放文件夾]
如圖:
反編譯之后會得到test 文件夾,打開test文件夾,里邊就是反編譯出來的各種資源文件
使用jd-gui查看源碼找到地址類,然后在smali文件里找到地址的smali文件,更改smali文件內接口地址。
如圖:
smali文件內找到與之對應的地址smali文件
修改接口smali文件里的地址將Ip更換成域名如圖:
修改后,保存。
3.重新打包。 執行打包命令
apktool.bat b test
在test文件內會多出兩個文件如下圖所示:
dist文件內就是我們需要的apk。
4.簽名apk,重新發布。
接下來就要用到簽名工具了,如果不經過簽名是不能正確運行的。工具: auto-sign.zip
將打包好的test.apk 拷貝到解壓好的auto-sign文件夾下,執行命令:
java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk
- 1
test_signed.apk就是簽名后的apk :
5.運行之后,發現在5.0上運行會直接崩潰,android studio捕捉到錯誤所在:
這里是在jd-gui上查看到了源碼位置
錯誤原因:
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.sun3d.culturejingan.communication.link }
如錯誤提示所示,在android 5.0版本以后,service intent必須為顯式指出。
那么就需要修改smali文件相關類,這里就用到將java2smali文件
6.java2smali插件,地址:https://plugins.jetbrains.com/plugin/7385-java2smali
插件安裝,選擇本地安裝,不懂怎么安裝插件,請百度下。
找到相應問題的smali文件代碼定位:
由於不太懂smali語法的書寫,所以我們直接將寫好java代碼用插件轉換為smali語法,拷貝進來,替換原有smali代碼
這是java代碼
轉換成smali代碼
相應代碼會直接展示,找到相應轉換結果:
替換反編譯出的相應smali文件里的相應代碼,然后執行重新打包命令,簽名命令,執行第3步。
整個過程並不復雜,只要有耐心就可以更改成功。
反編譯+重新打包+簽名
java -jar apktool.jar d -f zhugechengyu.apk -o MMTS d2j-dex2jar classes.dex 反編譯重新打包 java -jar apktool.jar b MMTS 生成簽名 keytool -genkey -alias android.keystore -keyalg RSA -validity 36500 -keystore android.keystore 重新簽名 jarsigner -verbose -keystore android.keystore -storepass hzx123 -keypass hzx123 -signedjar zg_signed.apk zhugechengyu.apk android.keystore
from:https://blog.csdn.net/sxk874890728/article/details/80486223