Apk反編譯再打包
Apk反編譯再打包
近期研究了一下Apk反編譯技術,在網上找了很多資料,進行了實踐,成功完成了apk反編譯,修改程式碼,再打包編譯的過程。這個過程耗費了我3天的時間,踩了很多坑。記錄下來,便於我以後忘記,也便於其他程式猿/媛們重現這個過程,節約大家的時間。
1.準備階段
(1)系統資訊
macOS Sierra 10.12.5
$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
windows系統和linux系統也可以的,需要安裝jdk1.8,這個過程不在本文章範圍內。
(2)下載工具
apktool,jd-gui,dex2jar,auto-sign
百度可以搜到,有些工具需要訪問外網才可以下載到。
如果閒麻煩的話我這裡準備了下載包(csdn 2積分):
壓縮包中的jd-gui是mac版的,其他版本在官網下載http://jd.benow.ca/
zip:https://download.csdn.net/download/moluth/10779181
tar:https://download.csdn.net/download/moluth/10779172
(3)工具簡介
apktool:用於編譯,反編譯apk包
auto-sign:給apk包簽名
dex2jar:把dex檔案還原成jar包
jd-gui:反編譯jar包,檢視jar原始碼。
(4)工具解壓
如果你下載了(2)中的壓縮包解壓,先解壓,然把裡面的dex2jar-2.0.zip也解壓,如下圖,共4個工具:
2.檢視原始碼
(1)解壓apk包
apk包是一個zip格式的壓縮包,把副檔名改成zip,然後解壓。解壓後可以看到這個apk包中的檔案,不同apk包中有所區別。
assets:放的是各種app會用到原始檔案,如html,css,json等
kotlin:kotlin是安卓開發新一代程式語言,有些apk使用kotlin語言,這個資料夾下放的是kotlin編譯後文件。
lib:存放的是c/c++生成的.so動態連結庫檔案。
res:各種佈局檔案,動畫,圖片,資原始檔,xml檔案,這個不太好解釋,做過安卓開發的應該都可以意會。
okhttp3:是一個第三方網路請求包。
*.dex:java程式碼編譯成jar包後,合併成dex包,安卓系統可以識別dex包。
AndroidManifest.xml:裡面寫著Activity,Application,app許可權等資訊。
resources.arsc:資原始檔索引檔案,這個比較複雜,但是對我們來說沒有什麼用處,不必理會
其他:忽略
(2)將dex還原成jar包
先把dex檔案拷貝到dex2jar的資料夾下,執行命令:
類linux系統:
$chmod 777 d2j-dex2jar.sh
$./d2j-dex2jar.sh *.dex
windows系統:
$d2j-dex2jar.bat *.dex
執行後會生成一些jar包,然後用jd-gui開啟這些jar包,就可以看到java原始碼了,如下圖所示。
3.反編譯apk
先把apk包放到apktool_2.3.4.jar所在目錄,然後執行命令:
$java -jar apktool_2.3.4.jar d xxx.apk -o xxx
如果不需要修改資原始檔(修改資原始檔有坑,再次編譯過程中有可能會報錯),使用下面命令:
$java -jar apktool_2.3.4.jar -r d xxx.apk -o xxx
做完上面操作,會產生一個xxx資料夾,資料夾內容如下:
這時可以修改上面圈出的檔案,要保持檔名稱不變。
smali:看這裡https://blog.csdn.net/yuanguozhengjust/article/details/80493963
可以對比著jd-gui中的原始碼修改smali檔案。
4.再編譯apk
在第3步,修改smali,資原始檔,和AndroidManifest.xml檔案後就可以再把這個打包成apk了
(1)打包
執行下面命令:
$java -jar apktool_2.3.4.jar b xxx
執行後xxx資料夾下回產生build和dist資料夾,dist資料夾下就是apk檔案了。這時的apk檔案還不能安裝,需要簽名。
(2)簽名
至於為什麼要簽名,建議去搜一下,找幾篇文章看看,這裡不再贅述。
把xxx/dist資料夾下的xxx.apk拷貝到Auto-Sign(簽名工具,1中有介紹)資料夾下,然後執行下面命令:
$java -jar signapk.jar testkey.x509.pem testkey.pk8 xxx.apk xxx_signed.apk
就可以再這個資料夾下生成xxx_signed.apk,大功告成!!!