Apktool 是一款用于对第三方、封闭、二进制 Android 应用进行逆向工程的工具。它可以将资源解码为接近原始形式,并在进行一些修改后重建它们;它可以逐步调试 smali 代码。由于具有类似项目的文件结构和一些重复任务(例如构建 apk 等)的自动化,它还可以更轻松地使用应用。

官方地址:https://github.com/iBotPeaches/Apktool 文档地址:https://apktool.org/docs/the-basics/decoding Apktool下载:https://github.com/iBotPeaches/Apktool/releases

本文以某 myapp.apk 为例,解包后修改 AndroidManifest.xml 文件中的内容,再重新打包签名。

1、使用Apktool解包

java -jar apktool_2.9.3-2.jar d myapp.apk -f -s

可以使用 -o 参数指定解包后输出的文件夹名称,不指定默认和文件名一致。因为我只需要修改 AndroidManifest.xml 内容,所以使用 -s 参数忽略 dex 文件的处理,更多参数详解官方文档。

2、修改解包后的内容

(略)

3、使用Apktool重新打包

java -jar apktool_2.9.3-2.jar b myapp -o myapp-unsigned.apk

4、重新签名

apk 只有被签名后,才可以正常被手机安装,因为我解包后修改重新进行了打包,所以必须要进行签名后才可以使用。

假设你使用的是Windows系统,并且已经安装了JDK,因此你有访问keytooljarsigner的权限。在Linux或MacOS上,这些工具通常也随JDK一起提供。

第一步:生成密钥库和证书

首先,你需要使用keytool命令来生成一个密钥库(keystore)。运行以下命令:

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 30000

这里解释一下上述命令的参数:

  • -genkey 指示keytool生成一个新的密钥对。
  • -v 表示详细输出。
  • -keystore 是你将要保存密钥库的文件名。
  • -alias 是你在密钥库中存储密钥的别名。
  • -keyalg 指定生成密钥对的算法。
  • -keysize 指定密钥的大小。
  • -validity 指定证书的有效期(以天为单位)。

在执行上述命令时,系统会提示你输入一些信息,例如你的名字、组织名、城市、国家等,以及用于保护密钥库和密钥的密码。

第二步:使用密钥库对APK进行签名

一旦你有了密钥库,就可以使用jarsigner工具来对你的APK进行签名。假设你的未签名APK文件名为myapp-unsigned.apk,并且你想要将其签名后的版本命名为myapp-signed.apk,你可以运行以下命令:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore myapp-unsigned.apk my-key-alias

这里的参数含义如下:

  • -sigalg-digestalg 分别指定了签名算法和摘要算法。
  • -keystore 是之前创建的密钥库文件。
  • myapp-unsigned.apk 是你想要签名的未签名APK文件。
  • my-key-alias 是你在密钥库中的密钥别名。

在执行这个命令时,系统会再次要求你输入之前创建的密钥库和密钥的密码。

第三步:验证签名

签名完成后,你应该验证签名是否成功。这可以通过再次使用jarsigner命令来完成,但这次添加-verify选项:

jarsigner -verify -verbose -certs myapp-unsigned.apk

如果签名成功,你应该看到类似下面的输出:

jar verified.
manifest verified.
...

5、优化和对齐APK(可选)

最后,你可能还希望使用zipalign工具来优化和对齐你的已签名APK,以减少其大小并提高性能。假设你已经下载了zipalign工具,可以使用以下命令:

zipalign -v 4 myapp-unsigned.apk myapp-aligned.apk

然后,你可以将对齐后的APK重新签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore myapp-aligned.apk my-key-alias

这样,你就完成了整个过程,得到了一个经过签名和优化的APK文件,可以用于发布。记得妥善保管你的密钥库文件和密码,它们是非常重要的,丢失或泄露可能会导致安全问题。


(END)