APK是安卓系统安装包的文件格式,由于安卓系统整体开源的特性,所以APK文件也可以说是“开源”的,这也就给我们“破解”apk文件创造了机会。
岩兔站最后接触了一个大佬写的聚合类app,功能很完善,很好用,但是加了一定的限制,非常的不爽。于是开始了本次的折腾之路,通过修改apk文件包内容,达到破解的目的。
准备工作
从岩兔站目前的了解来看,安卓程序和java有密不可分的联系。但是由于岩兔站从来没接触过java,所以很多时候都是懵的,google一些,连猜带试的一路折腾,写错了希望大佬指正。
本次折腾在windows平台上进行,Mac或Linux平台应该会更方便的。windows平台必备工具有:
工具准备就绪之后首先了解一下整个工作的流程:
- 将apk文件解包/反编译
- 分析其代码,并修改或删除内容
- 将修改过的代码重新打包成apk
- 对新生成的apk签名
- 安装修改过的apk
大概了解了工作流程,就可以开始着手开始了,开始之前务必安装jdk环境,测试方法是命令行中输入java -version
,回显1.8以上版本即可。
apk解包反编译-打包
解包工具介绍了两种,分别是apktool和dex-tool+jd-gui,岩兔站认为两种方法各有优劣,同时又都是不可或缺的,所以一并介绍一下。
apktool反编译
首先是apktool的操作,apktool之所以流行度比较高,是因为它是一款免费软件,免费不等于效果差,apktool就是如此,可以说是apk反编译的领军软件。
官方网站:https://ibotpeaches.github.io/Apktool/install/
安装官方都有说明,以windows为例,简单来说:
- 下载apktool.bat文件
- 下载最新版本的apktool.jar并重命名为
apktool.jar
- 将两个文件复制到
C:\windows
下 - 尝试在命令行中运行
apktool
有输出即安装成功
解包方法
// 反编译bar.apk $ apktool d bar.apk I: Using Apktool 2.0.0 on bar.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: 1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Baksmaling classes.dex... I: Copying assets and libs... // 将 bar.apk 反编译到 baz 目录 $ apktool d bar.apk -o baz
打包方法
// 将 bar 目录中的文件打包成 bar.apk $ apktool b bar // 将 bar 目录中的文件打包成 new_bar.apk $ apktool b bar -o new_bar.apk
而我们要做的就是编辑解包后的文件夹,可以用任意代码编辑器进行编辑,岩兔站用的是VSCode,全平台适用,非常的好用。
解包后的文件被反编译成.smali
的文件,岩兔站是没接触过,但目测是一个很底层的语言,比较贴近机器语言,非常难理解!所以编辑起来很是费力。
反编译后的主程序文件都在smali/com
文件夹下,作者一般会建一个自己软件名称的文件夹,重点在这个文件夹中查找代码即可。
推荐几篇大神的入门文章:
- https://www.jianshu.com/p/730c6e3e21f6
- https://blog.csdn.net/lpohvbe/article/details/7981386
- https://www.anquanke.com/post/id/85035
正是因为smali语法的难理解,编辑起来无从下手,所以岩兔站又尝试了第二种方法dex-tool+jd-gui
dex-tool反编译
官方地址:https://github.com/pxb1988/dex2jar
apk文件实际上就是一个压缩包,里面包含了一个app所有的代码,资源,签名等所有内容。
将apk文件重命名为.zip
,解压之后可得到一系列文件和文件夹,我们重点关注的是一个叫classes.dex
的文件,这里边包含了本app的所有代码,相当于apktool
反编译出来的smali
目录。
下载之后dex-tool得到一个zip文件,解压之后包含很多命令行工具,将classes.dex
复制到dex-tools目录中进行反编译操作。
将classes.dex
,反编译成bar-dex2jar.jar
// Windows d2j-dex2jar.bat -f path/to/classes.dex // Linux sh d2j-dex2jar.sh -f ~/path/to/classes.dex
打包
// Windows d2j-jar2dex.bat -f path/to/classes-dex2jar.jar // Linux sh d2j-jar2dex.sh -f ~/path/to/classes-dex2jar.jar
也就是我们只要编辑bar-dex2jar.jar
文件就能修改app。你可以使用任何可用的jar编辑器进行代码修改,岩兔站用的是jd-gui。
官方地址:http://jd.benow.ca/
下载之后直接打开jar文件即可查看包内容,这次内容是标准的java语法,可以很方便的阅读和修改代码。
apk签名
注意,反编译再打包的apk文件是不能安装的,安装之前必不可少的步骤是对安装包进行签名。
签名工具包括keytool
和jarsinger
,这两个工具在安装jdk环境时都默认自带,岩兔站的安装目录是在C:\Program Files\Java\jdk1.8.0_181\bin
,建议把这个路径添加到环境变量,方便其他位置调用。
首先生成签名,签名文件命名为yantuz.keystore
,有效期10000天,别名为yantuz
。
生成过程中需要输入两次密码,其他内容可以留空,最后是否正确需输入Y
keytool -genkey -keystore yantuz.keystore -keyalg RSA -validity 10000 -alias yantuz 您的名字与姓氏是什么? [Unknow]: xxx.xxxx.com.cn 您的组织单位名称是什么? [Unknow]: xxxx 您的组织名称是什么? [Unknow]: xxxx 您所在的城市或区域名称是什么? [Unknow]: beijing 您所在的洲或省份名称是什么? [Unknow]: beijing 该单位的两字母国家代码是什么? [Unknow]: 86 CN=cas.wptx.com.cn, OU=wptx, O=wptx, L=beijing, ST=beijing, C=86 正确吗? [否]: Y
apk签名,使用yantuz.keystore
为bar.apk
签名,签名后的文件另存为bar-signed.apk
jarsigner -verbose -keystore yantuz.keystore -signedjar bar-signed.apk bar.apk yantuz
测试
签名完成,apk文件应该能顺利安装了,再测试下自己的破解是否生效吧。
折腾了一晚上才摸到点门道,结果今天文章写完发现一个神器Android逆向助手,一个软件就能实现提取,反编译,签名这些工作,感觉白折腾了……