AKP反编译签名

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文件夹)。
AKP反编译签名
这里写图片描述

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

用JDK自带的工具Keytool和Jarsigner,就能生成签名,并对APK进行签名。
生成新证书

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

E:\mine\tmp\baidu_yun_*****>keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  123
What is the name of your organizational unit?
  [Unknown]:  456
What is the name of your organization?
  [Unknown]:  789
What is the name of your City or Locality?
  [Unknown]:  123
What is the name of your State or Province?
  [Unknown]:  456
What is the two-letter country code for this unit?
  [Unknown]:  cn
Is CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?
  [no]:  y

Enter 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的代码可能做了签名验证,。