1. 程式人生 > >APK反編譯、重編譯、簽名、檢視原始碼

APK反編譯、重編譯、簽名、檢視原始碼

1.反編譯與重編譯

工具:apktool
下載地址:https://ibotpeaches.github.io/Apktool/
環境:Java 7 (JRE 1.7)
安裝步驟:參考官網(也可以不安裝,直接使用java -jar apktool.jar 命令) ,具體如下圖所示
反編譯命令:java -jar apktool.jar d xxx.apk --frame-path <指定框架資源儲存路徑>
重編譯命令:java -jar apktool.jar b <反編譯出來的資料夾> --frame-path <指定框架資源儲存路徑>
作用:資原始檔的獲取,可以提取出圖片檔案和佈局檔案進行檢視

1.1 反編譯

開啟終端指向apktool根目錄,輸入以下命令即可完成反編譯:

java -jar apktool.jar d xxx.apk

如上圖所示日誌中出現了一個警告:

S: WARNING: Could not write to (C:\Users\Administrator\AppData\Local\apktool\fra
mework), using C:\Users\ADMINI~1\AppData\Local\Temp\ instead...
S: Please be aware this is a volatile directory and frameworks could go missing,
 please utilize 
--frame-path if the default storage directory is unavailable

大致意思是預設儲存框架資源的資料夾不可用。如果不想這個警告輸出,可以在命令後面加上引數--frame-path重新指定儲存框架資源的資料夾。

java -jar apktool.jar d xxx.apk --frame-path <指定框架資源儲存路徑>

成功反編譯的話可以看到如下日誌並生成一個和apk名字一樣的資料夾(與apktool.jar同一目錄)以及在指定目錄生成的1.apk檔案。

這樣我們就可以根據需求對mainfest.xml等檔案做相應的修改了(比如增加許可權等)。

隨著反編譯的流行,為了保證自己的產品不會變成滿天飛的山寨應用,更多的企業選擇了混淆編譯以及將核心邏輯編譯成.so等方法,以防止別人的反編譯。

1.2 重編譯

接下來我們就需要進行重編譯,同樣是使用Apktool工具。在終端輸入:
java -jar apktool.jar b <反編譯出來的資料夾> --frame-path <指定框架資源儲存路徑>

重編譯成功的話會在資料夾中看到build和dlist資料夾,重新編譯成功的apk就儲存在dlist資料夾中。但是這個apk目前還不能正常安裝,原因是該apk還是未簽名狀態(unsign)。

2.簽名

工具:re-sign.jar
下載地址:https://pan.baidu.com/s/1i3H0tKD
前提:1.SDK;2.C:\Users\Administrator\.android\debug.keystore檔案
作用:將apktool重編譯的應用變成帶有簽名證書的應用

接下來我們就說說Android應用的簽名。

在Eclipse的設定中點選Android標籤中的Build選項,可以看到Eclipse中Android工程預設的簽名都是Android ADT自帶的debug簽名,如圖所示。

同樣地,右擊一個專案,選擇Android Tools中的Export Signed APPlication Package,能夠成功建立所選簽名證書的應用apk。

而需要讓一個沒有簽名的應用程式簽上名的話,需要工具re-sign.jar。

下載後雙擊開啟,介面如下圖所示。

將重編譯出來的apk檔案拖到上圖介面上,選擇儲存路徑後,彈出下圖所示訊息提示簽名成功。

另外,由此提示訊息也可以得知此apk包的package name和main activity。

此時會生成一個<apk name>_debug.apk檔案,可以將其安裝到模擬器或真機上測試。

問題1:在開啟re-sign.jar時可能會彈出如下訊息。

 

解決方法:在環境變數中配置ANDROID_HOME為sdk路徑,並將ANDROID_HOME新增到Path中。

問題2:簽名後的apk包安裝失敗。

可能原因:重簽名的原理就是去除apk正式簽名,使用系統自帶的 debug.keystore預設簽名進行再次簽名。因為re-sign.jar預設的 debug.keystore 在C盤/使用者/.android/debug.keystore下,而後來Android SDK更新後 debug.keystore存在於SDK目錄/.android/debug.keystore,導致C盤/使用者/.android/目錄下缺少debug.keystore檔案。

解決方法:在C盤/使用者/.android/目錄下建立一個debug.keystore檔案即可。

建立debug.keystore的方法(參考這裡):
在cmd下,進入C:\Users\Administrator\.android目錄執行命令如下:
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
輸入密碼,使用者等資訊確認後便可生成一個debug.keystore。

3.檢視原始碼 

工具1:dex2jar
下載地址:https://sourceforge.net/projects/dex2jar
反編譯命令:d2j-dex2jar.bat xxx.apk
作用:將apk反編譯成java原始碼

工具2:JD-GUI
下載地址:http://jd.benow.ca/
使用方法:雙擊開啟,將<apk name>-dex2jar.jar檔案直接拖進去即可檢視
作用:檢視apk中的原始碼

在dex2jar根目錄處開啟命令視窗,輸入以下命令進行反編譯:

d2j-dex2jar.bat xxx.apk

成功之後會生成<apk name>-dex2jar.jar檔案。

接著使用JD-JUI開啟<apk name>-dex2jar.jar檔案,就能夠直接看到應用程式的程式碼,如下圖所示。