0x00 前言
为什么会想去破解这个app呢?正所谓有需求才有生产……
这一切都要从上个学期期末那个抽烟种树喝洗脚水的日子讲起……
(往事不堪回首,此处省略一个里约奥运碧池的苦水)
所以,其实forest的用处就是让你离开手机,设定种树时间,如果你在这个时间中打开了别的app,微信啊、QQ啊,总之如果你玩了手机,那么你的树就会死掉。
好啊,所以这个app为什么要破解呢?因为解锁后可以关注好友,单机模式种树一点意思都没有啊!
但是,解锁需要0.99刀,对应着6rmb,6rmb买一个好的app也是不错的,但是。。。支付方式只有通过Google账号,PayPal没有绑定卡,而GooglePlay礼品卡最小面值是10刀,在淘宝卖60+,当然,也有另外的办法,借用别人已解锁的Google账号登陆,app自然也成解锁的了。
除此之外还有另外一个功能的解锁,同样也需要0.99刀,方法一样,不过这个功能具体怎么样我还没用过,最重要还是先加波好友。
而对于iOS用户……直接Apple Store付款就好了……
之前我借了别人已解锁的账号,解锁,但昨晚刷了一次机,数据全空了,重新下回这个app也变回了未解锁状态。
刚好这几天也在看关于Android逆向的知识,让我产生了破解的念头。
(有条件的人还是付款好啊T_T,毕竟app开发也不容易)
0x01 分析
根据这个app,在解锁页面应该是调用相应的API支付,那么支付应该会有个支付是否成功的函数,那只需要定位到这个函数,把无论是否成功都返回true就好了。(然而我事实上不是用这种方式,具体见后面)
通过DDMS输出的log,可以发现在触发支付页面时,出现了一个有关
MoreFeaturesViewController
的log,然后我就可以到反编译出来的工程中搜索这个类。
0x02 查看源码
这里看到个很神奇的地方,就是安装上是用GooglePlay支付,但在源码中我却发现了支付宝、微信支付的接口,不知道怎么才能触发,显然这更适合国内的用户支付。
在微信支付中,我看到了一下接口,但安装的APP触发的不是微信支付,
1 | public void succeed() { |
在这里看到一个FeaturesManager的类,用过这个app就知道feature对应各种可解锁出来的特性。
进入到FeatureManager这个类,可以看到构造函数中初始化了很多东西,其中便有关键的三个getIsASUnlocked、getIsCTUnlocked、setLocked
分析代码,当getIsCTUnlocked函数返回true,setLocked就是false。
于是,从前更改支付是否成功的方法改了,我们直接在他预设中setLock设置为true就可以了,或者我们进入到getIsCTUnlocked函数中强制返回true。
0x03 修改源码
这里我选择了第二种,因为并不清楚是否在别的地方还调用了getIsCTUnlocked这个函数,更改这个函数也更彻底。
1 | public boolean getIsASUnlocked() { |
就是这两个函数,我们在smali代码中直接改为return true就可以了。
对应samli代码
1 | .method public getIsASUnlocked()Z |
保存,重编译,打包签名~~~
安装发现,解锁成功!!!
0x04 总结
嗯……破解成功成就感真的很大啊啊啊,不过破解成功的apk就不上传了,人家开发也不容易嘛~,要的来私戳我。
原apk是通过Android downloader下载的,应该是GooglePlay上的原版吧。
其实过程不难,但真的很很很很有趣啊啊啊啊啊,而且第一次成就感炒鸡大,感觉get到了一项新技能。
另外,其实查看源码时会发现一些很有趣的东西,似乎app会根据某些参数来判断是给你调用GooglePlay或是支付宝或是微信的支付界面,还没发现是怎么样的,而目前我所知道的从GooglePlay下载的全是调用GooglePlay的支付。
嗯嗯,就是酱紫~