Android apk包的重签名

众所周知,apk包是必须要被签名的,否则无法在用户的终端上安装。为了满足某些需求,有时我们需要更换特定apk的签名证书和签名,在这篇文章中我们谈谈如何重新对一个apk包进行重签名。

我们需要分几步来实现这个目标:

1.准备工作

2.生成新的秘钥对

3.对apk包进行签名

4.对签名后的apk包做对齐操作

1.准备工作

在正式开始前,需要确认你拥有keytool,jarsigner和zipalign这三个工具软件。keytool和jarsigner包含在JDK中,zipalign包含在Android SDK中,为了可以在命令行下正常使用,需要设置PATH环境变量。

另外,我们还需要一个apk包来进行测试,我用的是qq音乐的apk包。下面我们看一下apk包中与签名相关的文件,apk包其实就是个zip文件,我们用解压缩软件就可以直接打开它

META-INF文件夹中存放的就是与签名相关的文件

MANIFEST.MF是一个文本文件,里面逐条列出了apk包中每个文件的摘要值

ANDROIDR.RSA是用于签名的公钥证书文件

ANDROIDR.SF是包含签名数据的文件

我们对apk进行重签名就是要替换ANDROID.RSA和ANDROID.SF这两个文件

2.生成新的秘钥对

使用keytool来生成用于重新签名的RSA秘钥对,在命令行输入下面的命令

[plain] view plain copy

  1. keytool -genkey -v -keystore highball-key.keystore -alias highball-key -keyalg RSA -keysize 2048 -validity 10000  

秘钥对会以highball-key.keystore为文件名保存在当前目录下,别名为highball-key,算法为2048位的RSA,有效期为10000天。键入命令后,会提示你输入密码,密码一定要记住,因为以后每次使用该秘钥签名时都需要输入。然后工具会要求你输入一系列的个人信息,包括名字、组织等等。全部输入完毕后,秘钥就生成好了。

另秘钥的别名也需要记住,因为后面的jarsigner要用到。

3.对apk包进行签名

有了秘钥对和apk包,我们就使用jarsigner进行重签名了。

首先,我们删除前面提到的ANDROIDR.RSA和ANDROIDR.SF

然后在命令行下,输入命令和密码

[plain] view plain copy

  1. jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore highball-key.keystore qqmusic.apk highball-key  

新生成的apk包会覆盖之前的旧apk包

用解压缩软件查看新生成的apk包,可以看到证书文件和签名文件已经被替换了

*如果不删除ANDROIDR.RSA和ANDROIDR.SF,这里会同时出现两组证书和签名文件,我没有尝试安装这样的apk包,有兴趣的同学可以试一下。

4.对签名后的apk包做对齐操作

对apk包签名成功后,需要运行zipalign工具来对文件进行对齐操作,四字节的对齐可以让应用程序运行在设备上时有更好的性能。(可以用mmap()将文件映射到内存)。

[plain] view plain copy

  1. zipalign -v 4 qqmusic.apk qqmusic_aligned.apk  

参考文章:

http://developer.android.com/tools/publishing/app-signing.html

http://www.fengpiaoyu.com/2011/07/android-apk%E7%9A%84%E7%AD%BE%E5%90%8D%E4%B8%8E%E9%87%8D%E6%96%B0%E7%AD%BE%E5%90%8D/

时间: 2024-12-22 21:24:12

Android apk包的重签名的相关文章

android apk反编译到java源码的实现方法_Android

Android由于其代码是放在dalvik虚拟机上的托管代码,所以能够很容易的将其反编译为我们可以识别的代码. 之前我写过一篇文章反编译Android的apk包到smali文件 然后再重新编译签名后打包实现篡改apk的功能. 最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧. 首先我们需要的工具是dex2jar和jd-gui 其中第一个工具

android apk反编译到java源码的实现方法

Android由于其代码是放在dalvik虚拟机上的托管代码,所以能够很容易的将其反编译为我们可以识别的代码. 之前我写过一篇文章反编译Android的apk包到smali文件 然后再重新编译签名后打包实现篡改apk的功能. 最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧. 首先我们需要的工具是dex2jar和jd-gui 其中第一个工具

Android 安全之如何反编译与加密apk包

apk包真的安全吗?会被反编译吗?如何防止被反编译? 相关文章:Android apk如何加固防止被破解(防止逆向编译) 一.查看APK包的源码         dex2jar 这个工具用于将dex文件转换成jar文件         下载地址:http://sourceforge.net/projects/dex2jar/files/         jd-gui 这个工具用于将jar文件转换成java代码         下载地址:http://jd.benow.ca/         1.

Eclipse下配置Ant脚本并自动打包带签名的Android apk

eclipse虽然用的比较少,但是在一些古老的项目上还会用到滴,其中最麻烦的事情就是打带签名包的问题,不太方便,下面通过本文给大家记录下配置ant,自动打包带签名apk的过程,作为备份.(PC环境为MAC) 1,第一步得安ant,下载对应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否安装成功. 2

Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名_Android

对已有的apk文件进行重新打包,前面 Android签名机制:生成keystore.签名.查看签名信息 已经介绍了.本文介绍另外两种需求. 使用默认的Debug签名打包 如果直接使用Eclipse开发新程序,默认就会被打上Debug的签名,这个是地球人皆知,但是如果你是想Repack别人并且想使用Debug签名该怎么办? 首先需要找到你本机的默认签名的,一般位于C:\Users\用户名\.android\debug.keystore下,拷出来,然后打包,打包命令: 复制代码 代码如下: jars

Android Apk去掉签名以及重新签名的方法_Android

Android Apk去掉签名以及重新签名的方法 Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不签名没啥关系,说白了就是允许安装不从电子市场上下载的应用而已. 近几日需要修改一个Apk中JNI调用的.so文件,苦于没有apk源代码,只好研究了一下签名相关的问题.当然有很多第三方工具可以做到,但其实JDK中已经提供了强大的签名工具jarsigner. 1.

iOS证书及ipa包重签名探究

       iOS证书学习推荐博客代码签名探析,本文重点在于介绍ios8.1.3系统ipa包重签名(如企业证书)无法安装的问题.苹果在iOS8.1.3系统以后加强了对ipa安装包签名的验证,主要区别在于ipa唯一标识在原有Bundle Identifier的基础上增加了证书ID,也就说安装包和手机上已安装APP的Bundle Identifier即使一致,如果两者签名的证书ID不相同,那么安装包也无法正常安装.证书ID是什么? 图中方框里字符串就是证书ID,升级后的ipa标识就是证书ID+Bu

Android Apk去掉签名以及重新签名的方法

Android Apk去掉签名以及重新签名的方法 Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不签名没啥关系,说白了就是允许安装不从电子市场上下载的应用而已. 近几日需要修改一个Apk中JNI调用的.so文件,苦于没有apk源代码,只好研究了一下签名相关的问题.当然有很多第三方工具可以做到,但其实JDK中已经提供了强大的签名工具jarsigner. 1.

Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名

对已有的apk文件进行重新打包,前面 Android签名机制:生成keystore.签名.查看签名信息 已经介绍了.本文介绍另外两种需求. 使用默认的Debug签名打包 如果直接使用Eclipse开发新程序,默认就会被打上Debug的签名,这个是地球人皆知,但是如果你是想Repack别人并且想使用Debug签名该怎么办? 首先需要找到你本机的默认签名的,一般位于C:\Users\用户名\.android\debug.keystore下,拷出来,然后打包,打包命令: 复制代码 代码如下: jars