使用 apktool 反编译安卓 apk 文件、重新打包与签名

摘要

当你对一个安卓 apk 应用比较感兴趣,可能会想了解学习一下它的源码内容,甚至希望可以稍作修改后重新打包再安装体验。此时你可能会需要 apktool 这个工具。本文介绍了使用 apktool 反编译安卓 apk 文件、重新打包与签名的基本方法。本文内容仅供技术研究学习参考,请尊重原应用版权,切勿作破解再分发等事宜,避免惹上不必要的麻烦。

目录
[隐藏]

1 配置 apktool 工具环境

2 使用 apktool 解压、重新打包与签名

  1. 解压 apk 文件。执行命令示例: apktool d -f -s -o a_dev a.apk
  2. 重新打包为 apk,执行命令示例: apktool b a_dev -o a_unsigned.apk
  3. 对重新打包的 apk 文件签名。示例:
jarsigner -verbose -keystore [证书存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [证书别名]

jarsigner 参数说明:

  • keystore 参数指定您的私钥的绝对路径,例如:a.keystore
  • signedjar 参数指定签名后apk文件存放的路径,例如 a_signed.apk
  • [未签名的文件路径] 指定要签名apk文件的路径,例如 a_unsigned.apk
  • [证书别名] 是指创建密钥时设置的证书名称。

2.1 密钥证书:生成一个 keystore 文件

执行如下命令,生成 abc.keysotre 文件。需要输入密码时,输入为 123456

keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore

2.2 签名示例:使用 jarsigner 重新签名 apk 文件

使用 jarsigner 基于 abc.keystorea_unsigned.apk 签名,生成已签名的 a_signed.apk 文件:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass 123456 -keypass 123456 -keystore abc.keystore -signedjar a_signed.apk a_unsigned.apk abc.keystore

查看文件 a_signed.apk 的签名信息:

keytool -printcert -jarfile a_signed.apk

2.3 jarsigner 签名问题之一:找不到证书链

在使用 Android Studio 生成的密钥执行签名命令时,遇到如下错误提示:

jarsigner: 找不到a.keystore的证书链。a.keystore必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目。

这是因为证书别名不对。可以执行如下命令查看其别名:

# 假若安装了 Android Studio, 则会生成一个默认的密钥证书:
# - 其默认位置在 <用户目录>/.android/debug.keystore
# - 默认别名为: androiddebugkey
# - 默认密码为: android

# 查看 debug.keystore 信息
keytool -list -v -keystore debug.keystore

# 查看 xxx.jks 密钥证书信息
keytool -list -v -keystore xxx.jks

输出信息参考如下:

输入密钥库口令:

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: androiddebugkey
创建日期: 2019-1-7
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1

可以看到这里的证书别名androiddebugkey

2.4 签名示例:使用 apksigner 重新签名 apk 文件

jarsigner 是 Java JDK 提供的 jar 文件通用签名工具,只支持 V1 签名校验。

从 Android 7.0 开始, 谷歌增加新签名方案 V2 Scheme (APK Signature)。在 Android SDK 中提供了 apksigner 等用于 apk 签名。

  • Android SDK/build-tools/<SDK版本>/apksigner
  • Android SDK/build-tools/<SDK版本>/zipalign

使用 zipalign 执行包对齐优化:

# 4字节对齐优化
zipalign -v 4 a_unsgined.apk a_unsgined_4.apk
# 检查 APK 是否对齐
zipalign -c -v 4 a_unsgined.apk

使用 apksigner 执行 V2 签名:

apksigner sign --ks abc.keystore --ks-key-alias abc.keystore --out a_signed_v2.apk a_unsigned_4.apk

查看签名信息:

apksigner verify -v --print-certs a_signed_v2.apk

4 小结

上面介绍的使用 apktool 解压、重打包与签名 apk 的方法和流程,可以总结为如下几个步骤及命令:

# 1. 解包: a.apk 至 a_dev 目录
apktool d -f -s -o a_dev a.apk

# 2. 打包:a_dev 目录打包为 a_unsigned.apk
apktool b a_dev -o a_unsigned.apk

# 3. 生成证书 abc.keystore
keytool -genkey -alias abc.keystore -keyalg RSA -validity 30000 -keystore abc.keystore

# 4. 签名:a_unsigned.apk -> a_signed.apk
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass 123456 -keypass 123456 -keystore abc.keystore -signedjar a_signed.apk a_unsigned.apk abc.keystore

5 相关参考

  • https://ibotpeaches.github.io/Apktool/install/
  • http://www.dayanzai.me/apktool.html
  • https://www.jianshu.com/p/a5af94a963d0
  • https://blog.csdn.net/weixin_44212888/article/details/111396635
点赞 (2)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code