Robtium 测试第三方应用之重签名

转载于:http://www.tuicool.com/articles/va6RVf

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、A PK实际上是一个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。  

 

 

 

PS:这里的debug.keystore是自己生成的,生成于当前cmd命令运行的文件夹内,与eclipse的“Window”->“Preferences”->“Android”->“Build”右侧看到的debug.keystore不是同一个,所以如果使用不一样的debug.keystore会导致签名不一致

这个keystore的密码是android,Alias是androiddebugkey。找到这个文件,然后在命令行输入:keytool -list -keystore debug.keystore。可以查看文件的内容。

 

 

总之、在debug.keystore执行下列命令,如果这个文件没有,需要执行上述说明的详细步骤,-storepass和-keypass自带的一般都是android

1、jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar KaiXin_signed.apk KaiXin.apk androiddebugkey

2、zipalign -v 4 KaiXin_signed.apk Target.apk

 

有些应用设置了签名代码校验,反重签名机制,比如说微信和QQ如果重签名之后很多功能都不可用

posted @ 2016-02-22 23:49  璃素颜  阅读(140)  评论(0)    收藏  举报