反编译后的APK重新签名

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

参考

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值