1. 程式人生 > >一步一步帶你反編譯apk,並教你修改smali和重新打包

一步一步帶你反編譯apk,並教你修改smali和重新打包

一、工具介紹:

1.apktool:aapt.exe,apktool.bat,apktool.jar;三個在同一目錄結合使用,用來反編譯apk,apk重新打包;

2.dex2jar:該工具作用是將classes.dex檔案,反編譯出原始碼(如果apk未加固),反編譯出文件,使用jd-gui工具進行檢視;

3.Auto-Sign:自動簽名工具,將重新打包的apk進行簽名,如果不簽名,無法安裝使用。

使用場景:專案原始碼丟失,只有線上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
  • 1

效果如下:

這裡寫圖片描述

步驟二:執行結束後,在該目錄下會生成一個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    
  • 1
apktool -f [待反編譯的apk] -o [反編譯之後存放資料夾] 
  • 1

如圖:

這裡寫圖片描述

反編譯之後會得到test 資料夾,開啟test資料夾,裡邊就是反編譯出來的各種資原始檔

這裡寫圖片描述

使用jd-gui檢視原始碼找到地址類,然後在smali檔案裡找到地址的smali檔案,更改smali檔案內介面地址。 
如圖:

這裡寫圖片描述

smali檔案內找到與之對應的地址smali檔案

這裡寫圖片描述

這裡寫圖片描述

修改介面smali檔案裡的地址將Ip更換成域名如圖:

這裡寫圖片描述

修改後,儲存。

3.重新打包。 執行打包命令

apktool.bat b test
  • 1

在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 }
  • 1

如錯誤提示所示,在android 5.0版本以後,service intent必須為顯式指出。

那麼就需要修改smali檔案相關類,這裡就用到將java2smali檔案

外掛安裝,選擇本地安裝,不懂怎麼安裝外掛,請百度下。

找到相應問題的smali檔案程式碼定位:

這裡寫圖片描述

由於不太懂smali語法的書寫,所以我們直接將寫好java程式碼用外掛轉換為smali語法,拷貝進來,替換原有smali程式碼 
這是java程式碼 
這裡寫圖片描述

轉換成smali程式碼

這裡寫圖片描述

相應程式碼會直接展示,找到相應轉換結果:

這裡寫圖片描述

替換反編譯出的相應smali檔案裡的相應程式碼,然後執行重新打包命令,簽名命令,執行第3步。

整個過程並不複雜,只要有耐心就可以更改成功。