Android apk 反编译并重新打包签名(Mac环境)

4,852 阅读3分钟

一、 环境配置

首先要具备JDK和SDK的环境

二、 工具下载安装

2.1 下载安装 apktool

apktool是一款功能强大的Android应用反编译工具,它能够帮助开发者对APK文件进行解码、编辑和重新编译。

2.1.1 根据apktool网站提示的下载方法,右击 wrapper script,链接存储为apktool,不要带拓展名

1.png

2.png

2.1.2 然后点击latest version下载 apktool.jar,选择第一个下载最新版本

3.png

2.1.3 下载完成把 apktool_2.8.3.jar 重命名为 apktool.jar,然后把 apktool.jarapktool 一起移动到 /usr/local/bin 路径下

4.png

2.1.4 终端输入apktool命令,看到以下输出说明 apktool 配置成功

5.png

三、反编译

3.1 Android项目结构的三大部分:代码、资源文件、清单文件
目前资源文件和清单文件可以直接查看了,而classes.dex则是代码 19.png

3.2 在需反编译 test 目录打开终端 6.jpg

3.3 输入apktool d test.apk开始反编译,反编译成功就会多个 test 文件夹 7.png

3.4 下载安装 dex2jar

dex2jar 是 Android 中的一个反编译工具,它可以将 Android 程序安装包 Apk 文件中的 .dex 文件反编译成一个 .jar 文件,也可以将反编译后的 .jar 文件重新编译成 .dex 文件。反编译以后的 .jar 文件可以直接通过 JD-GUI 查看源代码(源码是混淆的)。

8.png

3.4.2 下载完 dex2jar 解压到 test 目录方便操作, test 目录打开终端,输入命令sh dex2jar/d2j-dex2jar.sh test.apk(如果提示Permission Deny权限问题,先输入命令chmod +x dex2jar/d2j-dex2jar.sh改一下权限),生成文件 test-dex2jar.jar,就是我们需要的 java 代码压缩文件

9.png

3.5 下载安装 JD-GUI

JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。
使用JD-GUI浏览重构的源代码,以便即时访问方法和字段。

3.5.1Download 里下载最新版本 tar

10.png

3.5.2 打开 JD-GUI 可能遇到的问题

3.5.2.1 无法打开“JD-GUI.app”,因为无法验证开发者。解决办法

12.png

3.5.2.2 ERROR launching 'JD-GUI',解决办法

13.png

3.4.2.3 打开 JD-GUItest-dex2jar.jar 拖入 JD-GUI 查看代码(或者右击 test-dex2jar.jarJD-GUI 打开)

14.png

四、改源码

不是所有的代码都可以改,比如已经编译出来的id等等。但是简单的增/删/改一些小逻辑,还是没有问题的。

smali 的目录结构与 class 目录结构是相同的,可以找到对应的 ClashKt

15.png

五、重新编译打包

5.1test 目录打开终端执行命令apktool b test

16.png

5.2 build 目录是打包后的dex文件和资源文件(和 apk 解压内容一致) 17.png

5.3 dist 目录下是重新打包的 apk 文件 18.png

六、重新签名

6.1 可能遇到的问题

6.1.1 SDK >= 30时,APK 反编译后重打包安装失败,apktool 重新打包,然后手动签名,用adb发现会安装失败,报错显示:Failed parse during installPackageLI: Targeting R+ (version 30 and above)...,该问题是由 resource.arsc 文件的压缩导致的,该文件是apk的资源文件,是一个二进制文件,用于存储apk的资源信息,如图片、布局等,该文件在安装时会被解包,所以在安装时,该文件必须是未压缩的,且必须是4字节对齐的,否则会导致安装失败。

6.1.2 解决方案

zipalignAndroid SDK 中的一个工具,用于对apk进行4字节对齐,使用方法如下:

zipalign -f -v 4 input.apk output.apk

6.2 apksigner 进行签名

apksignerAndroid SDK 中的一个工具,用于对apk进行签名,使用方法如下:

apksigner sign --ks my-release-key.jks --out output.apk input.apk
  • 请不要使用 jarsigner 进行签名,因为jarsigner只能进行V1签名,而V2签名是SDK>=24时才支持的,所以使用jarsigner签名后,安装时会报错:INSTALL_PARSE_FAILED_NO_CERTIFICATES

参考资料

Android反编译apk并重新打包签名(Mac环境)
mac下apk的反编译、修改源码、重新打包
解决SDK>=30时,APK反编译后重打包安装失败的问题