一、 环境配置
二、 工具下载安装
2.1 下载安装 apktool
apktool是一款功能强大的Android应用反编译工具,它能够帮助开发者对APK文件进行解码、编辑和重新编译。
- apktool :ibotpeaches.github.io/Apktool/ins…
2.1.1 根据apktool网站提示的下载方法,右击 wrapper script,链接存储为apktool,不要带拓展名
2.1.2 然后点击latest version下载 apktool.jar,选择第一个下载最新版本
2.1.3 下载完成把 apktool_2.8.3.jar 重命名为 apktool.jar,然后把 apktool.jar 和 apktool 一起移动到 /usr/local/bin 路径下
2.1.4 终端输入apktool命令,看到以下输出说明 apktool 配置成功
三、反编译
3.1 Android项目结构的三大部分:代码、资源文件、清单文件
目前资源文件和清单文件可以直接查看了,而classes.dex则是代码
3.2 在需反编译 test 目录打开终端
3.3 输入apktool d test.apk开始反编译,反编译成功就会多个 test 文件夹
3.4 下载安装 dex2jar
dex2jar 是 Android 中的一个反编译工具,它可以将 Android 程序安装包 Apk 文件中的 .dex 文件反编译成一个 .jar 文件,也可以将反编译后的 .jar 文件重新编译成 .dex 文件。反编译以后的 .jar 文件可以直接通过 JD-GUI 查看源代码(源码是混淆的)。
- dex2jar:github.com/pxb1988/dex…
3.4.1 在 Assets 里下载最新版本 dex2jar-v2.zip
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 代码压缩文件
3.5 下载安装 JD-GUI
JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。
使用JD-GUI浏览重构的源代码,以便即时访问方法和字段。
- JD-GUI:jd.benow.ca
3.5.1 在 Download 里下载最新版本 tar
3.5.2 打开 JD-GUI 可能遇到的问题
3.5.2.1 无法打开“JD-GUI.app”,因为无法验证开发者。解决办法
3.5.2.2 ERROR launching 'JD-GUI',解决办法
3.4.2.3 打开 JD-GUI 把 test-dex2jar.jar 拖入 JD-GUI 查看代码(或者右击 test-dex2jar.jar 用JD-GUI 打开)
四、改源码
不是所有的代码都可以改,比如已经编译出来的id等等。但是简单的增/删/改一些小逻辑,还是没有问题的。
smali 的目录结构与 class 目录结构是相同的,可以找到对应的 ClashKt
五、重新编译打包
5.1 在 test 目录打开终端执行命令apktool b test
5.2 build 目录是打包后的dex文件和资源文件(和 apk 解压内容一致)
5.3 dist 目录下是重新打包的 apk 文件
六、重新签名
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 解决方案
zipalign 是 Android SDK 中的一个工具,用于对apk进行4字节对齐,使用方法如下:
zipalign -f -v 4 input.apk output.apk
6.2 apksigner 进行签名
apksigner 是 Android 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反编译后重打包安装失败的问题