Android反編譯(三)之重簽名


Android反編譯(三)

之重簽名

 


[目錄]

 

 

 

1、原理

1).APK簽名的要點

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

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

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

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


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如有簽名自校驗(代碼有校驗)需要修改其代碼,非今天文章內容。 

 

2、工具與准備工作

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,配置環境變量 


3、操作步驟

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。 


4、裝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,全部重簽名。

 

執行結果圖:

   

5、問題

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

檢查:是否JDK1.7,如果JDK1.7簽名問題,JARSIGNER需要增加兩個參數。

-digestalg SHA1 -sigalg MD5withRSA

 

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

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

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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM