使用apktool、keytool、jarsigner反編譯并打包apk

記錄一下解壓一個apk,替換未加密的資源文件,然后再打包成apk,并簽名的過程。

操作環境與工具

環境:

  • Windows 7 SP1
  • Java SE 1.8.0_111-b14

工具:

需要準備的文件:

  • apktool_2.2.1.jar (上面下載完成,獲得的就是這個文件)
  • app.apk (這個是一個用來測試的apk,代碼已加密,資源未加密)
  • mykey.keystore (這是一個使用keytool生成的簽名文件,可以參照博客來生成)

解壓apk

我們先創建一個文件夾dir,將上面需要準備的文件全部放到這個文件夾dir內。然后打開cmd窗口,將使用cd命令,將當前工作目錄切換到新目錄dir下,方便操作。

當前目錄內容:

apktool_2.2.1.jar
app.apk
mykey.keystore

完成上面的準備工作之后。在cmd中使用如下命令:

java -jar apktool_2.2.1.jar decode app.apk

命令的參數decode表示解碼(可以用d表示),app.apk是需要解析的apk文件。

提示:執行jar文件,需要使用命令 java -jar [jar文件]

等待幾秒,命令執行完成后,會看到目錄dir下看到新增了一個文件夾app

打開app文件夾,可以看到目錄如下:

assets
lib
original
res
smali
unknown
AndroidManifest.xml
apktool.yml

我解壓的這個apk包,資源是未加密的,所以如果我想改資源,直接在res文件夾中去替換就好了。
注意:apktool.yml這個文件,在使用ApkTool壓縮成apk時是需要用到的,(如果是直接把app.apk的后綴改為zip,然后用壓縮工具解壓出來的,就不會有這個apktool.yml了,也不能用apktool再壓縮成apk)。


打包apk

上面進行完需要的修改(例如替換資源,修改配置數據等)之后。我們現在可以再使用ApkTool來打包這個app文件夾,生成新的apk。

繼續在cmd中進行操作,cmd的工作目錄仍然在我們在第一步新建的dir中,不需要改動。

在cmd中執行以下命令:

java -jar apktool_2.2.1.jar build -o myapp.apk app

命令的參數build表示打包(可以用b表示),-o 后接生成的apk名稱(路徑),最后是需要打包成apk的文件夾,也就是我們上一步解壓出來的app目錄

等待命令執行完成,目錄dir中多出來了一個myapp.apk,這個就是打包生成的apk了。

現在這個apk文件是不能安裝的,我在小米3上測試,安裝時會提示解析包錯誤。


給apk包簽名

上一步打包出來的apk文件在真機上無法安裝,需要對apk包簽名過之后才能使用。簽名時,我們需要知簽名文件mykey.keystore的別名Alias(知道密碼是前提)。

在知道密碼的前提下,想要看到簽名文件中的內容可以使用命令:

keytool -v -list -keystore mykey.keystore

然后輸入密碼,此時密碼是無回顯的,看不到輸入的過程,輸入完回車就行。

使用簽名文件mykey.keystore對上一步生成的myapp.apk進行簽名,可以在cmd中輸入如下命令:

jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias

命令的參數-verbose 表示簽名時輸出詳細信息,-keystore mykey.keystore指明需要使用的簽名文件,-signedjar signed_myapp.apk指明生成的簽名過的apk的名稱(路徑),后面的myapp.apk表示未簽名的apk文件,末尾的myAlias表示簽名文件mykey.keystore的別名(在生成這個簽名文件的時候配置的屬性)。

等待命令執行完成,可以看到我們的文件夾dir下新增了一個文件signed_myapp.apk,這個就是對上一步生成的myapp.apk進行簽名之后生成的文件了,這個文件可以直接在手機上安裝了(前提是app.apk可用,而且在解壓過后沒有進行一些錯誤的修改操作)。


總結

使用到的命令:

  • 解壓apk: java -jar apktool_2.2.1.jar decode app.apk
  • 查看keystore: keytool -v -list -keystore mykey.keystore
  • 打包apk: java -jar apktool_2.2.1.jar build -o myapp.apk app
  • 簽名: jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias

其實通常下載到的apk都會進行資源壓縮加密,代碼混淆加密。這里只是使用一個apk來進行流程的測試,真正去進行資源和代碼的反編譯、解密等要分具體情況來看。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容