月金剑客
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

0x01 前言
最近在整理清理电脑文件的时候,看到大一自己做的一款c语言飞机大战。那个时候还不怎么懂安全,传输给服务器端的数据没有加密,于是测了测发现很容易就篡改了一些游戏数据(比如伤害、钻石)。第一次这么直接的参与到了外挂,于是来了兴趣,闲暇之余在微信小程序上寻找起了会有这种数据传输的小游戏。
0x02 发现目标
搜罗了一圈,基本上都是没有数据传输只在js互动上显现和没有加密的游戏,没有难度。最后逛了半个小时,终于发现目标,存在sign验证。

啃臭键+f,开搜之前上传给服务器端的记录接口
找到接口对应逻辑,看到sign加密函数
这句话为引子,慢慢顺藤摸瓜。
跟进sign函数
发现需要wx_appid与wx_secret。但搜遍代码,发现这两个参数是浓墨重彩层层加密。
0x04 sign绕过
1.第一次解密尝试
无奈,开启第一次解密尝试。
查看了对应加密函数
![image-20240418195626667]
初步观测属于两层加密
编写了一个小html文件看看能否输出
乱码
不出意外的话跟mousedown事件属性相关,但相关继承函数却又跟了更多的外层函数,实在无法继续推演,遂放弃。
2.第二次解密尝试
时隔忙碌于文档的两周,我回来了。
这次我把所有源码解出来想尝试用微信开发者程序去重新编译调试输出一些关键信息。
可惜的是缺少核心app.json,要是能重新恢复的话我估计得把这二十多万行代码看完。(bushi。)
切换角度,尝试恢复核心js,在里面输出些信息。
在经历了漫长的报错调试,终于,皇天不负有心人,爆出了两个secret值
根据传参信息观察,这个uploadrecord相关函数采取的secret值和其他所有上传服务器的函数所采用的校验secret值是不同的
我先尝试对获取时间戳参数的sign值进行复原,看看我阅读的代码逻辑是否正确。
原处和js调试最后输出的值发现一样,有戏,成功复现
接下来复现uploadrecord
根据相关函数编写如下
撰写改编后将sign值进行修改
回显成功
0x05 结果展示
目前只玩了第一关,只有204金币
提交数据包重新加载程序后
成功修改了钻石金币等值!
0x06 总结
1.反编译代码如果完全可以尝试输出调试信息进行编译获取关键信息
2.反编译代码不全可以尝试恢复关键代码进行输出调试
3.没有遇到混淆加密等情况,若涉及到rsa等加密用go去加解密会更清爽自动化一些
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)