1. 程式人生 > >Apk反編譯再打包

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,大功告成!!!