apktool反編譯和二次打包,jarsigner和apksigner進行簽名

柴月和岐月發表於2017-12-27

 

今天在嘗試簡單的反編譯,但是網上資料多繁雜重複且存在不可行的方式,遂記下此收穫

1.apktool反編譯

反編譯:

apktool d test.apk //apktool d XXX.apk

反編譯test.apk檔案,並且會在當前目錄下生成test資料夾,其中,
res資料夾下存放的是反編譯出來的所有資源,
smali資料夾下存放的是反編譯出來的所有程式碼,
AndroidManifest.xml則是經過反編譯還原後的manifest檔案,
smali資料夾下的檔案smali檔案使用的是Android虛擬機器所使用的暫存器語言。

二次打包:
apktool b test -o new_test.apk //apktool b XXX(反編譯後的資料夾名稱) -o newXXX.apk(新APP的名字)

會在當前目錄下生成需重新簽名的APK檔案,無法安裝到安卓系統上
可以使用Android Studio或者IDEA簡單生成簽名檔案來簽名,使用JDK自帶的jarsigner來對APK簽名

APK簽名和jar包簽名,兩者原理流程差不多
對APK簽名,既可用 JDK/bin/jarsigner.exe,
也可用 Android SDK/build-tools/版本號/apksigner.bat或者Android SDK/build-tools/版本號/lib/apksigner.jar

最新版下載地址:https://ibotpeaches.github.io/Apktool/install/

 

2.jarsigner簽名

網上例項裡包含演算法名稱,同時我想到在AS或者IDEA裡生成祕鑰的時候並沒有指定演算法,所以演算法上的指定可能就是在這裡,並且如果不指定話,似乎預設為RSA
使用IDEA生成金鑰庫123_key.jks,密碼123456,別名(似乎是金鑰鏈)key,別名密碼123456(以下親測可行,具體含義請看下面的引數說明)

(命令在java路徑下:\jdk路徑\bin\jarsigner.exe)
1.jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystrore 123_key.jks -storepass 123456 app.apk key
2.jarsigner -verbose -keystrore 123_key.jks -storepass 123456 app.apk key

驗證是否簽名成功:jarsigner -verify -verbose -certs new_test_aligned.apk

zipalign是一款對APK檔案進行優化的工具。(該工具在/build-tools/目錄下)
APK檔案本質上是一個zip壓縮文件,經過優化能使包內未壓縮的資料有序的排列,從而減少應用程式執行時的記憶體消耗。在使用jarsigner對APK重簽名之後,可以使用該工具優化已簽名APK檔案。

zipalign -v 4 in.apk out.apk //執行4位元組對齊優化操作
zipalign -c -v 4 in.apk //檢查當前APK是否已經執行過Align優化


注意:
1)簽名檔案,APK檔案為完全路徑不能有中文,空格,轉譯字元
2)簽名前後的檔案路徑不能改
3)加密演算法請參考官方文件自行選取,但是第一次選擇了後後面不要再隨意更換加密演算法
4)在jdk7及以上版本中執行jarsigner命令時,務必新增上-digestalg SHA1 -sigalg MD5withRSA引數,以修改jdk7預設digest演算法sha256為sha1,修復Android低版本(4.2以下)出現的問題。

C:\Users\悅>jarsigner -help
用法: jarsigner [選項] jar-file 別名
jarsigner -verify [選項] jar-file [別名...]

[-keystore <url>] 金鑰庫位置

[-storepass <口令>] 用於金鑰庫完整性的口令

[-storetype <型別>] 金鑰庫型別

[-keypass <口令>] 私有金鑰的口令 (如果不同)

[-certchain <檔案>] 替代證照鏈檔案的名稱

[-sigfile <檔案>] .SF/.DSA 檔案的名稱

[-signedjar <檔案>] 已簽名的 JAR 檔案的名稱

[-digestalg <演算法>] 摘要演算法的名稱

[-sigalg <演算法>] 簽名演算法的名稱

[-verify] 驗證已簽名的 JAR 檔案

[-verbose[:suboptions]] 簽名/驗證時輸出詳細資訊。
子選項可以是 all, grouped 或 summary

[-certs] 輸出詳細資訊和驗證時顯示證照

[-tsa <url>] 時間戳頒發機構的位置

[-tsacert <別名>] 時間戳頒發機構的公共金鑰證照

[-tsapolicyid <oid>] 時間戳頒發機構的 TSAPolicyID

[-tsadigestalg <演算法>] 時間戳請求中的摘要資料的演算法

[-altsigner <類>] 替代的簽名機制的類名

[-altsignerpath <路徑列表>] 替代的簽名機制的位置

[-internalsf] 在簽名塊內包含 .SF 檔案

[-sectionsonly] 不計算整個清單的雜湊

[-protected] 金鑰庫具有受保護驗證路徑

[-providerName <名稱>] 提供方名稱

[-providerClass <類> 加密服務提供方的名稱
[-providerArg <引數>]]... 主類檔案和構造器引數

[-strict] 將警告視為錯誤

 

3.apksigner簽名

注:
APK除錯簽名的預設金鑰庫, 預設在C:\Users\使用者名稱\.android
金鑰庫名: debug.keystore
金鑰別名: androiddebugkey
金鑰庫密碼: android

apksigner是一款在Android build tools 24.0.3及以上版本中提供的對apk檔案簽名以及驗證簽名資訊的工具,它與jarsigner的作用類似,但比後者功能更加強大。注意在使用apksigner前,請先對APK執行zipalign,而不能在之後執行zipalign操作,這一點與jarsigner不同。(路徑在build-tools\相應版本\apksigner.bat)

apksigner sign --ks release.jks app.apk //簽名
apksigner verify --verbose app.apk //驗證簽名

 

4.更多資訊

更多資訊請自行查閱jarsigner.jar -help和apksigner.bat help

相關文章