记一次h5小游戏逆向

记一次h5小游戏逆向
fulian23前言
在4399闲逛的时候看到个画风可爱的h5小游戏,由于不看广告根本玩不下去的设定过于逆天,遂决定好好研究这款游戏的广告结算流程,结果居然出乎我的意料
经过
首先打开调试,发现一直debug
之后在这篇文章中找到了绕过方法:https://www.jianshu.com/p/a3a0949a4e9a
成功进入调试
看一次广告,在控制台中找到了相关代码的位置
然而index.js已经被混淆,完全看不出执行逻辑
原来是用一个列表存放了所有关键字
换个方法,在打印“代码:10000,消息:开始播放”处打个断点,在右边的调用堆栈处查看,看看之前执行了哪些代码
在app.js里发现了跟广告奖励相关的代码
而且此处的
1 | case 1: |
正对应了控制台中的“调用原创统计 3 100”
在switch处打个断点,然后发现case是根据ed值进行的判断
当广告中断时,e的只为-2,在之后的case中也可以印证这一点
于是可以尝试将e的值直接改为2,打开广告后直接退出,也是能获取奖励的
然而还没有结束,我们还不知道返回奖励具体是调用哪个函数实现的
由于e是用来判断广告的观看情况,这直接决定了奖励的发放,而e在这里被分类,所以下面必然有调用e来决定奖励发放的函数
在这行代码上方令e=2.奖励成功发放
而在下方令e=2却没有奖励,说明奖励的发放就是调用的这个函数
1 | n(o.a.STATUS, e >= 1 ? kt.a.END : kt.a.ERROR), |
这段代码意思是n的第一个参数为o.a.STATUS,第二个参数由e的值决定,如果e>=0(也就是广告播放成功的情况),第二个参数就为kt.a.END,否则为kt.a.ERROR
所以下个断点,查看这三个值的具体内容,得到:
1 | o.a.STATUS="AD_STATUS" |
所以想到直接传递播放结束的参数给函数n
1 | n("AD_STATUS",{code:10001,message:"播放结束"}) |
确实可行!
发现大秘密
现在已经可以靠跳过广告快速获得奖励了,但是当我再次看源码时,又发现了一个更为快速的方法
源码中有对存档进行的操作,这时我才回过神来
这游戏是有存档的!!
而且我又在源码中看到了localstorage的字样
该不会存档保存在本地的吧
结果过一看,还真是,游戏中的所有数据,都可以在右边的json中找到
数值随便修改,甚至页面都显示不全
至此这款游戏已经彻底破解💐💐💐