尝试破解某记账APP的VIP验证,顺带发现了彩蛋
尝试破解某个记账APP的VIP验证顺带发现了彩蛋
1.有个朋友
真·有个朋友发来某个开源的记账软件的 github 链接,要我帮忙打个 APK 出来。
我一看这 Readme 下面不是有市场链接么,就进行了一番礼貌交流。
又过了一会,大爷直接甩一张截图过来,让我给他改 VIP,说是有源码重编一下就好。
可是我仓库里搜 "vip" 没有结果,apk下过来一看淦了。
混淆、资源压缩,可是应用都没接广告 sdk,也不知道应用里提示的 VIP 去广告去了什么。
既然大爷有要求,就得给人家干,这个混淆差点给我整不会了。
2.oO0混淆
这个混淆麻烦的点在于,jd-gui 没法直接搜索,explorer 里也是找起来麻烦,只能一直 vscode 里面全局搜索。
想着先找到界面按钮再去对应到点击事件,看处理的流程去分析。可是找了好一会都没找到按钮的在哪里加载出来的。。。
中间浪费了一段时间去对着AlertDialog
源码研究,没注意 package,光看类名不对了
AlertDialog
被混淆成了OooOOO
,AlertDialog.Builder
变成了OooOOO.OooO00o
,我对着AlertController
的代码一顿分析
3.换个思路
混淆看的太费时间,换个思路先抓包。
结果除了接的第三方统计 SDK 以外,没找到别的网络请求。
购买激活码跳到的第三方发卡平台跳转时只带了一个 token,这是搞的本地校验?
可是本地校验设备id都不传就卖验证码么,和我们的需求一样本地几十万的激活码数据库匹配?
复制了应用的存储看,数据库、cache 和 sp 都没有存东西,懵了。
开始重新看代码,搜 host 相关,才发现应用的 Retrofit 设置了 NO_PROXY 绕过代理,怪不得抓不到包。
4.确定机制
抓到真正的包以后,一切就都简单了。
分析数据、构造模拟响应测试,应用验证 VIP 的机制直接确定了。
输入激活码的部分,发送 deviceId 和 验证码,服务器校验之后返回的 json 中会包含请求结果的状态。
状态是成功时,本地存储验证码和设备号,激活成功和每次进入应用后再请求第二个接口去验证,验证接口返回的状态为 true 认为有 VIP。
既然应用只判断接口返回的状态,直接在定义的Response
基类里面,把获取状态的值永远返回 true 就好了。
想改的细致点可以去找每个解析判断数据的接口,再单独改getSuccess
前的判断条件,像这样
总之改起来就一行代码,找了半天出去
5.测试
应用开了资源压缩,用 apktool b 的时候会报错找不到一些 attr,直接编 dex 替换进去再重签名。
安装测试一切正常,发给朋友。
6.彩蛋
抓包的时候还发现启动时应用会单独请求彩蛋接口,返回配置包括烟花和下雪。
模拟相应数据看了下,效果还不错。
7.总结
这次主要是学到了先抓包有时候可以节省很多不必要的步骤。
再就是要注意应用的网络框架配置了绕过代理的情况。
正常的流程不顺利时及时换个思路,不要一条死路走到黑,浪费时间和精力。