记一次h5小游戏逆向

前言

在4399闲逛的时候看到个画风可爱的h5小游戏,由于不看广告根本玩不下去的设定过于逆天,遂决定好好研究这款游戏的广告结算流程,结果居然出乎我的意料

经过

首先打开调试,发现一直debug

之后在这篇文章中找到了绕过方法:https://www.jianshu.com/p/a3a0949a4e9a

成功进入调试

看一次广告,在控制台中找到了相关代码的位置

然而index.js已经被混淆,完全看不出执行逻辑

原来是用一个列表存放了所有关键字

换个方法,在打印“代码:10000,消息:开始播放”处打个断点,在右边的调用堆栈处查看,看看之前执行了哪些代码


在app.js里发现了跟广告奖励相关的代码

而且此处的

1
2
3
case 1:
a.default.console.debug("广告播放结束"),
Rt.send(s, 3, 100);

正对应了控制台中的“调用原创统计 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
2
3
o.a.STATUS="AD_STATUS"
kt.a.END={code:10001,message:"播放结束"}
kt.a.ERROR={code:10010,message:"播放异常"}

所以想到直接传递播放结束的参数给函数n

1
n("AD_STATUS",{code:10001,message:"播放结束"})

确实可行!

发现大秘密

现在已经可以靠跳过广告快速获得奖励了,但是当我再次看源码时,又发现了一个更为快速的方法

源码中有对存档进行的操作,这时我才回过神来

这游戏是有存档的!!

而且我又在源码中看到了localstorage的字样

该不会存档保存在本地的吧

结果过一看,还真是,游戏中的所有数据,都可以在右边的json中找到

数值随便修改,甚至页面都显示不全

至此这款游戏已经彻底破解💐💐💐