果然, 从小到大, 我最大的动力来源就是玩游戏耍帅… 今天本来是想打猎了但是回不去广州, 只好玩3ds上的4G, 然而这毕竟5年前的老游戏了, 那时怪猎在中文圈可能也不火… 基本找不到任何想要的中文资料(Ping’s Dex因为系统原因用着不太方便), 所以为了好好打游戏…我把黑手伸向了一个需要看广告才能好好用的app….
这个App的收费点在于看广告换积分, 然后凭积分兑换配装器的特定功能次数. 因此我原本的目标是让积分无限或者让兑换的使用次数无限. 我本来想的是程序代码里应该有这么个变量, 没使用一次变量数值就会下降, 我把下降的这一行代码去掉, 那就可以无限使用了.
那么就来操作上.
解包和解析Apk
实际上一个Apk文件就是个压缩包, 直接unzip
就可以了, 解压后的软件包应该会包括很多部分, 其中实际的执行文件会是*.dex
, 这是编译后的执行文件, 解析的话需要先把这个文件转换为jar
, 我使用的是enjarify
, 来自github, 克隆下来就能用.
1 | unzip your.apk |
接下来就是查看java代码了, 我使用的是jd-gui
, AUR
上可以能找到(aur/jd-gui-bin
), 将文件拖进去就行. 这里就纯粹是代码阅读了, 由于代码不是咱写的, 而且作者为了保护自己也可能会加上一些混淆的东西, 可能会难定位. 所以我就想到了靠日志定位的方式:
- 首先使用
adb shell
连接手机终端,pm list packages
查看目标app的名称 - 根据名称抓取指定app的日志
adb logcat device_id|grep you.app.name
- 在手机上操作这个app, 比如我就进入了app的付费页面, 就能从日志上看到是调用了什么
class
了
完成定位后就很枯燥了… 猜指定文件中的代码逻辑怎样(毕竟我根本不懂java…), 然后尝试想一个解决方案,
反编译Apk并对代码进行修改
我使用的是apktools
, 加了archlinuxcn
源之后直接sudo pacman -S android-apktool
就行, 安装好了之后apktool d your.apk
进行反编译就行了.
反编译后进入产生文件夹的smali
文件夹内, 这个文件夹和jar
里面的看到的java项目的目录结构是一样的, 只不过里面的是smali
这种汇编语言的代码, 而不是java
. 虽然语言不一样(甚至里面部分实现逻辑都是不太一样的), 但是实现一样的东西, 所以根据前面看过的java代码, 可以对应去文件里找相应的部分, 找到之后就可以按照smali
的语法对代码进行更改了.
重打包与签名
修改完代码文件就可以用修改后的文件夹重新生成Apk文件了: apktool b -o your.mod.apk your_path
.
不过重新打包的Apk是不能直接用的, 还得签名… 这个签名完整的过程是要先给信息生成密钥, 然后再签名, 我觉得太麻烦就直接github上找了一个快速签名用的项目uber-apk-signer, 直接给未注册的Apk文件, 他会用内置的测试签名快速签, 然后就能装来用了.
1 | java -jar uber-apk-signer-1.1.0.jar --apks your.mod.apk |
之后就是对修改后的App进行测试, 如果没有达到效果就再改就是了. 然后我实际上没有达到最初预想的效果, 因为我并没有在代码中找到那个数值下降的位置(因为实在看不懂java), 但是我却在购买的位置找到了判断积分是否充足的部分, 于是我直接跳过这个判断, 直接让积分兑换完成, 换了个方式实现了我要的效果… 唯一不足的就是… 我还得进购买页面疯狂兑换去…
嘛, 毕竟这么做对原作者不好… 所以我就不给App名称和实际的代码了…
不知道这次的技能以后会不会又在奇怪的地方有奇效…