这一篇博客只是单纯的讲讲 Apktool 的使用,当然我们接到的业务远不止如此。后面基本是先集成一个可用的 bash script 用来基于一个模板 APP 快速生成一些包,然后就是写一个初版的构建平台能够在后台上传图标选择 APP 功能构建一个 APP。
至于为啥选择将打包好的 APK 逆向再编译,我们不是有源码吗?直接改源码打包不是更舒服吗?对于反编译再封装和直接用源码打包其实最大的区别在于利用源码编译一个完整的 APK 相比逆向修改再编译来说所用的资源和时间是完全不在一个量级上的。而且我们只是需要简单的修改一些配置并不用大量的动基础代码。
当然在玩这些高端玩法之前我们先要知道这个 Apktool 怎么用。那就先手动玩一波利用 Apktool 反编译吧。
其实我本人与 Android 反编译有着很不一样的缘分…从初中时利用烧饼修改器和葫芦侠修改器修改游戏金币和道具,利用 MT 文件管理器逆向破解单机游戏混迹于葫芦侠三楼和论坛也曾经拥有自己的论坛和粉丝群,到后来与一群小伙伴开发游戏为了解决游戏被破解折腾各种加固和混淆…
破解过别人的游戏,改过别人的软件,也是因为这段经历我才想做出属于自己的游戏和软件从而踏上成为一名开发者的道路,然后也作为开发者对抗过各种修改和反编译破解…(手动打断故事,再讲下去这篇博客就成划水文了
好了,我们先了解一下我们今天的主角 Apktool 吧。
来自官网的描述:A tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form and rebuild them after making some modifications. It also makes working with an app easier because of the project like file structure and automation of some repetitive tasks like building apk, etc.
It is NOT intended for piracy and other non-legal uses. It could be used for localizing, adding some features or support for custom platforms, analyzing applications and much more.
大致的意思就是 Apktool 是用来逆向工程第三方、封装好的、已经编译为二进制 Android 应用程序的工具。它可以将资源解码为几乎原始的形式,并在进行一些修改后重建它们。由于文件结构之类的项目和一些重复性任务(如构建 apk 等)的自动化,它还使使用应用程序变得更容易。
不能用于盗版和其他非合法用途。它可用于本地化、添加一些功能或支持自定义平台、分析应用程序等等。
Apktool 官网: https://ibotpeaches.github.io/Apktool/
Apktool GitHub: https://github.com/iBotPeaches/Apktool
Apktool 是用 Java 写的一个开源的 APK 逆向工具,简单易用,方便二次开发。
简单了解 Apktool 之后接下来我将一步步和大家把一个 APK 的名称和图标替换掉,让它变成 "属于" 我的 APP
首先在使用前我们需要先安装 jdk8 或其他版本的 Java 开发环境(如果还有没有安装的小伙伴可以看看我之前的博客 https://bin.zmide.com/?p=193 )
接着就是安装 Apktool 了,我这里是直接用 mac 并且装好 brew 所以就直接使用 brew install 了
brew install apktool
Linux 的话可以先下载脚本 https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
将脚本保存到文件,把脚本文件命名为 apktool ,然后去 https://bitbucket.org/iBotPeaches/apktool/downloads/ 下载最新的 jar,如我这边的目前最新的是 apktool_2.5.0.jar
下载两个文件之后,给他们一个可执行权限
# 下载脚本
wget -O apktool https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
wget -O apktool.jar https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.5.0.jar
# 设置可执行权限
sudo chmod +x apktool apktool.jar
# 移动到 /usr/local/bin/ 目录
sudo mv apktool /usr/local/bin/
sudo mv apktool.jar /usr/local/bin/
# 查看 apktool 版本,检查是否安装成功
apktool -version
如果安装成功将会输出 apktool 的版本号了。我这里准备了一个 demo_v001.apk
我们先看看 demo_v001.apk 装在手机上现在是什么样的吧
接下来我们用 apktool 先将 demo_v001.apk 逆向解包
apktool d demo_v001.apk
能看到 apktool 帮我们把 apk 解压成一个文件夹了,打开文件夹之后就能看到 AndroidManifest.xml 文件,res 资源文件夹,assets 资源文件夹还有 smali 文件夹其实就是 java 编译之后逆向出来的反汇编语言。
我们本次改名称和 icon 其实都是在 res 文件夹,就先不动 smali 代码了。
首先改名称,我们在 AndroidManifest.xml 文件中看到主要读取的是 @string/app_name
,这个 @string 是从 res/values/strings.xml 文件夹中读取的
我直接改成天真的APP,没错就是这么简单我们就把 APP 的名字改成自己的了。
接下来我们把图标也换成我们自己的,我准备了下面这个图标给它换上去
我们在 AndroidManifest.xml 文件中能看到 icon 用的是 @mipmap/ic_launcher
我们在 res 文件夹中找到 mipmap 相关的文件夹中就能看到了。这里有几个文件夹,不同后缀代表不同的尺寸。我这里就偷懒直接全换成我这一个了。
我这里换好之后
现在我们名称和图标都换好了,开始使用 apktool 重新封装回去。demo_v001 就是你逆向出来那个文件夹
apktool b demo_v001
下面就是我重新编译回去之后的输出,当我们编译成功之后我们会看到 demo_v001 目录里面会多出一个 build 目录和一个 dist 目录,dist 目录就是我们重新编译好的 APK 输出目录打开之后我们就能看到我们重新编译好的 demo_v001.apk 文件了
这样就结束了吗?不,由于重新编译后 APK 的签名就被破坏了所以说现在我们需要给它重新签个名(关于签名的博客可以看看我之前写的,玩转 Android APK 签名,是时候该用上 apksigner 工具给你的 APP 签名了 https://bin.zmide.com/?p=879)。
/Users/test/android/sdk/build-tools/30.0.3/apksigner sign --ks /data/keys/app/test.keystore --ks-key-alias by_bin --ks-pass pass:"this_is_password" ./demo_v001.apk
这里的 /Users/test/android/sdk/build-tools/30.0.3/apksigner 是 Android sdk 中 apksigner 工具的位置具体可以看看上面的博客,/data/keys/app/test.keystore 是你的签名文件,by_bin 是签名文件的别名,this_is_password 是签名文件密码,./demo_v001.apk 是当前目录下这个 apk 文件
然后安装我们这个签好名的 APK 文件到手机就能发现 APP 名称和图标都变成我们的了。而且 APP 是能够正常启动和使用的。
包括 APP 中的启动图,和页面布局还有 java 相关代码其实都是可以改的。还有一个小知识点比如我们公司的产品都是 React Native 那就还需要逆向一下 assets/index.android.bundle 文件,当然我们有源码那就直接使用脚本把代码改掉之后用源码构建一个 index.android.bundle 文件将 APK 中的文件替换一下就完美了。
后面如果我不鸽的话会继续输出使用 bash 脚本实现利用脚本更换图标,icon,启动图,APP 主题颜色,一些关键词然后输出一个 APK。
再实现一个 web 端选择配置就可以基于我们的 APP 工厂模版构建一个属于自己的 APP。
app_name 是在 res/values/strings.xml 文件中修改,文章中是 src/values/strings.xml
感谢提醒