反编译后的APK重新签名

来源:互联网 发布:dota2能在mac上玩吗 编辑:程序博客网 时间:2024/05/21 17:46

APK签名是什么

Android系统要求所有安装的应用程序都必须用数字证书进行过签名。签名的意义在于,确认应用程序的作者,尽力各个应用之间的信任关系。同一个应用程序升级时,系统也会对签名进行验证,只有签名相同的APP才会被允许update。

理解签名需要注意下面几点:

  • 所有应用程序都必须被签名,没有签名的APK是不会被Android允许安装的
  • Debug程序时,SDK会为debug release自动生成一个特殊的debug签名
  • 带有debug签名的APP是不允许被发布的
  • android系统只在安装时检查签名中的过期时间。如果安装后才过期,APP也能被正常使用
  • 可以用JDK自带的工具Keytool 和 Jarsigner 生成签名并进行签名
  • 对APK签名后,建议用zipalign对APK package进行优化

为什么需要重签名

修改一个APP的行为,一般先要用Apktool对APK进行反编译,修改smali代码后,在编译回APK(参考[2])。
但smali代码经Apktool编译出的APK,其中的签名就丢失了(没有了META-INF文件夹)。

这里写图片描述

没有签名的APK是不会被Android允许安装的,所以此时就需要对APK进行重签名。
除此之外,发布APP之前,也是需要对APK进行签名的。

怎么给APK重新签名

用JDK自带的工具KeytoolJarsigner,就能生成签名,并对APK进行签名。

生成新证书

keytool就能生成新证书,下面生成一个叫ybdesire的证书(注意这里需要根据CMD提示,输入信息)。

E:\mine\tmp\baidu_yun_crack>keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystoreEnter keystore password:Re-enter new password:What is your first and last name?  [Unknown]:  123What is the name of your organizational unit?  [Unknown]:  456What is the name of your organization?  [Unknown]:  789What is the name of your City or Locality?  [Unknown]:  123What is the name of your State or Province?  [Unknown]:  456What is the two-letter country code for this unit?  [Unknown]:  cnIs CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?  [no]:  yEnter key password for <ybdesire.keystore>        (RETURN if same as keystore password):

这里keytool的参数含义为:

  • -alias ybdesire.keystore, 别名为ybdesire.keystore
  • -keyalg RSA, 使用RSA算法对签名加密
  • -validity 20000, 有效期限20000天
  • -keystore ybdesire.keystore,证书为ybdesire.keystore

重新签名

jarsigner对反编译并打包后的baiduyun_481_d.apk进行签名。

jarsigner -verbose -keystore ybdesire.keystore -signedjar baiduyun_481_d_s.apk baiduyun_481_d.apk ybdesire.keystore

用zip工具打开重签名后的baiduyun_481_d_s.apk可以看到,包里面含有META-INF文件夹,说明这个APK签名成功了。

结论

注意重新签名后的APK,只能保证能被正常安装,不能保证安装后能正常运行。因为APP的代码可能做了签名验证,。

参考

  • [1] 为什么APK需要签名,http://stackoverflow.com/questions/23906799/why-should-i-sign-my-application-apk-before-release
  • [2] https://github.com/ybdesire/AndroidAPPLearn/tree/master/decompile_apk/1_helloworld
0 0