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代码,再从新打包,签名。

相关文章
相关标签/搜索