Android反編譯(三)之重簽名

Android反編譯(三)

之重簽名

 


[目錄]

 

 

 

一、原理

1).APK簽名的要點

a.全部的應用程序都必須有數字證書 ,Android系統不會安裝一個沒有數字證書的應用程序;java

b.Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證;android

c.數字證書都是存在有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。 算法

d.Android使用標準的java工具 Keytool 、Jarsigner 來生成數字證書,並給應用程序包簽名。windows


2).APK簽名的好處 安全

a、應用程序升級: 若是想升級應用程序,簽名證書要相同,包名稱要相同!

b、應用程序模塊化:Android 系統能夠容許同一個證書籤名的多個應用程序在一個進程裏運行,系統實際把他們做爲一個單個的應用程序,此時就能夠把咱們的應用程序以模塊的方式進行部署,而用戶能夠獨立的升級其中的一個模塊。數據結構

c、代碼或者數據共享:Android 提供了基於簽名的權限機制,那麼一個應用程序就可 覺得另外一個以相同證書籤名的應用程序公開本身的功能。以同一個證書對多個應用程序進行 簽名,利用基於簽名的權限檢查,你就能夠在應用程序間以安全的方式共享代碼和數據了。

 

3).APK重簽名原理

a、Android系統簽名主要有ROM簽名和應用程序APK簽名兩種形式。ROM簽名是針對已經生成的Android系統ROM包進行簽名。應用程序APK簽名是針對開發者開發的應用程序APK進行簽名。模塊化

b、APK其實是一個jar或者說是一個zip壓縮文件,META-INF目錄下存放的是壓縮包中全部文件的簽名信息,用來保證apk包的完整性和系統的安全。工具

c、重簽名:實際上就是刪除META-INF目錄(刪除已有簽名),使用自已數據證書再次重簽名。優化

注:APK若有簽名自校驗(代碼有校驗)須要修改其代碼,非今天文章內容。 spa

 

二、工具與準備工做

1).工具 

a.數字證書生成:keytool

JAVA自帶工具   如:JDK1.7
例:路徑  C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exe
 
b.從新簽名:jarsigner
JAVA自帶工具  如:JDK1.7
例: 路徑  C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exe
 
c.優化APK:zipalign
 Android SDK自帶工具   
例:路徑  C:\Program Files\adt-bundle-windows-x86_64-20140321\sdk\tools\zipalign.exe

 

2).準備工做

a.安裝JDK,配置環境變量

b.安裝Android SDK,配置環境變量 


三、操做步驟

1)、本機
keystore數字證書

a、找現成的keystore文件

路徑   C:\Documents and Settings\Findyou\.android\debug.keystore 

debug.keystore
Keystore name: 「debug.keystore」 
Keystore password: 「android」
Key alias: 「androiddebugkey」
Key password: 「android」
CN: 「CN=Android Debug,O=Android,C=US」    
 

b、keytool生成keystore數字證書

 

(1).[CMD中執行下列命令]
keytool  -genkey -v -keystore debug.keystore  -alias androiddebugkey  -keyalg RSA  -validity 10000
  /*解釋:  
keytool是工具名稱,-genkey意味着執行的是生成數字證書操做,-v表示將生成證書的詳細信息打印出來,顯示在dos窗口中; 
-keystore  debug.keystore 表示生成的數字證書的文件名爲「 debug.keystore」;
-alias  androiddebugkey   表示證書的別名爲「 androiddebugkey  」,能夠與Keystore同樣;
-keyalg RSA 表示生成密鑰文件所採用的算法爲RSA;
-validity 10000 表示該數字證書的有效期爲10000天,意味着10000天以後該證書將失效

**/  

執行結果 輸入密鑰庫口令android

再次輸入新口令: android

您的名字與姓氏是什麼?
  [Unknown]:  Android Debug
您的組織單位名稱是什麼?
  [Unknown]:  Android
您的組織名稱是什麼?
  [Unknown]:  Android
您所在的城市或區域名稱是什麼?
  [Unknown]:  ShenZhen
您所在的省/市/自治區名稱是什麼?
  [Unknown]:  GuangDong
該單位的雙字母國家/地區代碼是什麼?   [Unknown]:  CN 
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN是否正確?
  [否]: Y
正在爲如下對象生成 2,048 位RSA密鑰對和自簽名證書 (SHA256withRSA) (有效期爲 10,00 0 天):
         CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN
輸入 <androiddebugkey> 的密鑰口令
        (若是和密鑰庫口令相同, 按回車):  [回車]
[正在存儲debug.keystore] 

 

(2). debug.keystore生成在CMD執行命令的目錄中  


 2)、刪除原APK簽名文件

(1).ThinkDrive.apk重命名爲ThinkDrive.zip,解壓ThinkDrive.zip文件 

(2).ThinkDrive重名名爲ThinkDrive_temp
(3).ThinkDrive_temp文件夾,找到META-INF,刪除META-INF
(4).將ThinkDrive_temp整個文件夾用zip工具,從新打包成zip壓縮包,而後更改後綴爲apk  
注意:
a.進入ThinkDrive_sign文件夾內直接打包文件,不是對ThinkDrive_sign整個文件夾打包,不然會產生二級根目錄)
b.注意是ZIP壓縮,不是RAR
c.能夠用jar來解包,壓縮包
解包: jar -xvf  ThinkDrive.apk                -->爲apk文件
壓縮包 jar -cvf ../ThinkDrive.apk   ./         -->進入文件夾打包,不會產生二級根目錄;apk生成在上一層,防止死循環  

 

3)、APK重簽名

jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar Thinkdrive_signed.apk  Thinkdrive_temp.apk androiddebugkey

/*解釋: jarsigner是Java的簽名工具

-verbose參數表示:顯示出簽名詳細信息

-keystore表示使用當前目錄中的debug.keystore簽名證書文件。

-storepass 密鑰口令 

-signedjar ThinkDrive_signed.apk表示簽名後生成的APK名稱,

ThinkDrive_temp.apk 表示未簽名的APK,

androiddebugkey表示debug.keystore的別名

*/ 

 

4)、優化APK  
zipalign -v 4 ThinkDrive_signed.apk Target.apk

注:

zipalign優化的最根本目的是幫助操做系統更高效率的根據請求索引資源,將resource-handling code統一將Data structure alignment(數據結構對齊標準:DSA)限定爲4-byte boundaries。 

 

小結:經過以上四個步驟 ,最終獲得的 Target.apk (名稱本身能夠第四步生成時自修改) 爲重簽名後的APK。 


四、裝X技巧

偶爾手工敲敲代碼無所謂,須要簽名的APK一多,那你就廢了。你會說,網上下載現成的重簽名jar啊之類的,多沒意思,來本身整一個批處理。

 

1)、代碼: [重簽名.bat]
@ECHO  OFF
  REM  key的名稱
  SET KEYSTORE_NAME= debug.keystore
  REM  key的別名
  SET KEYSTORE_ALIAS=androiddebugkey
  REM  key的密碼
  SET KEYSTORE_STOREPASS=android
  SET KEYSTORE_KEYPASS=android
  REM  臨時文件名或臨時文件夾名
  SET TEMP_PREFIX=temp_
  REM  重簽名後apk文件名前綴
  SET RE-SIGNED=Re-signed_
  FOR %%I IN (*.apk)  DO (
   ECHO [重簽名 %%I]
      ECHO [建立與APK同名的文件夾]
      REM  建立文件夾,若是已存在則先刪除
      RD /S /Q 【%%I】
      MD 【%%I】\%TEMP_PREFIX%
      REM  複製須要從新簽名的apk文件到臨時文件夾中
      COPY %%I 【%%I】\%TEMP_PREFIX%
      REM  複製key到APK同名文件夾中
      COPY %KEYSTORE_NAME% 【%%I】
      REM  進入臨時文件夾
      CD 【%%I】\%TEMP_PREFIX%

   REM  解壓APK文件
     JAR -xvf %%I
      REM  刪除複製到臨時文件夾中的APK文件
      DEL %%I
      REM  刪除MANIFEST
      RD /S /Q META-INF

   REM  從新壓縮成apk文件
      ECHO [從新打包成APK]
     JAR -cvf ../%TEMP_PREFIX%%%I ./
      CD ..

   ECHO [JARSIGNER %%I]
      REM  對APK包從新簽名,JDK1.7須要增長參數
     JARSIGNER -VERBOSE -KEYSTORE %KEYSTORE_NAME% -STOREPASS %KEYSTORE_STOREPASS% %TEMP_PREFIX%%%I %KEYSTORE_ALIAS% -KEYPASS %KEYSTORE_KEYPASS%
  
      ECHO [刪除JARSIGNER臨時文件]
      RD /S /Q %TEMP_PREFIX%
      REM  刪除同名文件夾中複製的debug.keystore
      DEL %KEYSTORE_NAME%
  
   ECHO [ZIPALIGN %%I]
      REM  使用android的zipalign工具對apk文件進行優化
     ZIPALIGN -v 4 %TEMP_PREFIX%%%I %RE-SIGNED%%%I
      REM  檢查apk文件是否被優化
     ZIPALIGN -c -v 4 %RE-SIGNED%%%I
      ECHO [刪除ZIPALIGN臨時文件]
      REM  刪除優化前的APK文件,保留優化後的APK
      DEL %TEMP_PREFIX%%%I
      CD ..
      ECHO [重簽名完成]  %RE-SIGNED%%%I
      ECHO.
 )
  PAUSE
  @ECHO  ON

 

2)、使用方法

(1).拷貝 xxxx.keystore 簽名文件至 "重簽名.bat"所在目錄

(2).拷貝須要重簽名的APK文件至 重簽名.bat"所在目錄中

(3).雙擊運行"重簽名.bat" 腳本

注:如需重簽名多個APK,可所有拷貝至 重簽名.bat"所在目錄中,BAT會查找到當前目錄下全部APK,所有重簽名。

 

執行結果圖:

   

五、問題

1)、重簽名安裝失敗(證書問題) 

檢查:是否JDK1.7,若是JDK1.7簽名問題,JARSIGNER須要增長兩個參數。

-digestalg SHA1 -sigalg MD5withRSA

 

2)、安裝成功,運行失敗

檢查:a.首先須要排除重簽名問題(再重籤一遍安裝)

b.重籤再裝仍有問題,檢查是否程序有自簽名檢查,若有簽名檢查較爲複雜。大致講解一下思路,反編譯代碼爲JAVA找到簽名檢查代碼,分析邏輯,用apktool反編譯,修改對應smail代碼,再從新打包,簽名。

相關文章
相關標籤/搜索