本篇文章作者 ius,本文属 i 春秋原创奖励计划,未经许可禁止转载
原文链接:https://bbs.ichunqiu.com/thread-63876-1-1.html

某稀小程序敲木鱼活动逆向分析

前言

最近发现某稀在小程序搞了个活动,敲木鱼赢好礼。

身为一名程序猿,必然要分析分析请求接口辣

image-20240212225711002
image-20240212225711002

正文

抓包软件,启动!

image-20240212225938249
image-20240212225938249

然后我们打开活动界面,测试一下

image-20240212230100622
image-20240212230100622

ok,一切正常

image-20240212230051819
image-20240212230051819

然后进入游戏,开始抓接口

image-20240212230240197
image-20240212230240197

可以看到这个就是提交接口的返回内容

image-20240212230748721
image-20240212230748721

里面的参数只有token是未知的,我们的目标就是搞定这个参数

image-20240212230828453
image-20240212230828453

而且这个参数每次都会变动,并非固定的

image-20240212230944369
image-20240212230944369

通过分析抓包流程可以发现,在每次的接口提交中,都会对这个接口发起请求

image-20240212232159181
image-20240212232159181

我们可以大胆的推测,token就是由这个data来生成的

image-20240212231142586
image-20240212231142586

先模拟请求一下,把data摘出来

image-20240212232520621
image-20240212232520621

放到js里运行一下

image-20240212232657057
image-20240212232657057

提示缺少window,我们在开头补上

image-20240212232742120
image-20240212232742120

再次运行,可以运行成功,但是没有结果

image-20240212232802325
image-20240212232802325

我们去浏览器里运行测试看看,是不是检测nodejs环境了

在浏览器里控制台会打印一个false

image-20240213000118100
image-20240213000118100

这时候,我们要想办法调试一下,单看肯定看不出来

先给代码格式化一下

image-20240213000309188
image-20240213000309188

这些注释估计就是混淆视听的,我们用正则去除一下

image-20240213000354202
image-20240213000354202

然后再格式化一下

image-20240213000429103
image-20240213000429103

在最后下个断点

可以发现,在window中生成了一堆乱码

这样看来单纯的分析这个js好像没什么头绪了

image-20240213000700057
image-20240213000700057

在抓包流程中,我们可以发现小程序的首页

对于这种内嵌的网页,我们尝试直接从浏览器访问

image-20240212233053130
image-20240212233053130

访问成功,但是提示我们没有登录

image-20240212233124868
image-20240212233124868

我们把抓包中的cookie导入到浏览器中,这里需要用到一个Cookie-Editor这个插件,在chrome扩展商店可以下载到

复制cookie

image-20240212233311522
image-20240212233311522

导入

image-20240212233359849
image-20240212233359849

刷新界面,这次没有提示我们未登录

image-20240212233431180
image-20240212233431180

在浏览器调试就舒服多了,随便给下个xhr断点

image-20240212233804914
image-20240212233804914

再次提交,成功断住

image-20240212233848211
image-20240212233848211

开始跟栈分析token生成位置

此处省略1万字

简单说一下这种流程如何跟栈吧

我们从这里可以大概的看一下,调用函数名称

image-20240212234930444
image-20240212234930444

总览一下,看看有哪些函数名比较关键

image-20240212235016397
image-20240212235016397

这里有个叫startGame的函数,我就选择在这里断点,然后一步一步分析

跟到这里的时候,我们可以发现参数token的生成

image-20240212235228757
image-20240212235228757
image-20240212235302145
image-20240212235302145

进去之后,发现是这样的一串代码

这个代码的意思是,从window里获取p83d60的值

image-20240212235326205
image-20240212235326205

我们从控制台测试一下

image-20240212235526146
image-20240212235526146

看着就像token,我们放行断点,看看发包是不是这个值

看着这俩参数长得不能再一样了

image-20240212235606115
image-20240212235606115

所以这个token是从window里取得值。

我们回到刚才测试js里

打印一下window

image-20240212235731699
image-20240212235731699

果然有一堆乱七八糟的参数

试试打印window['p83d60']

undefined?

image-20240212235826452
image-20240212235826452

我们重新获取一次data,然后再打印试试

image-20240212235943352
image-20240212235943352

这次成功获取到了,所以看来这个window的值并非固定的。

经过测试发现,这个值大概是1个小时会变一次

不过,这点小伎俩,怎么可能会阻碍到聪明绝顶的我??

在这个js中,只有一个参数是我们想要的,而其他的值都是用来混淆视听的

所以我们可不可以,获取两次data,然后在生成的值中找到两次data相同的值

从而获取到当前时间段的真正的值?

理论形成,实践开始!

为了方便调用js,这次我们直接用nodejs写

获取data参数,然后用vm执行js,最后打印window

image-20240213001447184
image-20240213001447184

然后根据上面的思路完善一下,最后运行,测试成功!

image-20240213001624647
image-20240213001624647

后记

参数都搞定了,我们来用代码模拟一下流程试试

根据抓包分析可以知道

需要请求三次个接口,创建页面,开始游戏,提交分数

这里就不赘述了,简单完成一下

成功提交

image-20240213001927674
image-20240213001927674