技术人玩小游戏,如何“不战而胜”

晴雯
• 阅读 868

虽然迟了一天,但还是祝各位小伙伴端午安康。

最近因为端午节到来,物业举办了一个网页小游戏,得分最高的前 N 名可以拿到奖品。

闲来无事的我参加了一下,发现自己实在是太菜了,总是玩不过别人,于是转变思路,研究看看这个小游戏是如何提交分数的。

抓包

通过 Charles 进行抓包,发现游戏结束时会调用 commit 接口提交分数。那这就好办了,因为我们可以利用 Postman 伪造请求,从而达到 “不战而胜”。

如果想了解如何抓包,可以在评论区留言,有需要的话再写一篇抓包教程。

接口分析

抓包知道哪个接口还远远不够,因为接口最重要的还是请求参数,所以我们需要弄清楚每个参数的代表的意思,一般可以参数名可以猜出来。

特殊参数

一个特殊的参数 sign,这个参数是签名的意思,由其他参数计算得到,作用是防止请求参数被篡改。因为参数发生变化,计算出来的签名也是不同的。服务端经过相同的计算,可以校验参数与签名是否匹配。

因为 sign 是计算得到的,我们伪造请求同样需要计算 sign,那么就要知道签名算法,如何知道?我们只能通过网页源码查看。

现在的网页源码大部分都是经过打包工具压缩混淆,我们想要阅读是一件比较困难的事情。但是我们只需要看提交分数的部分即可,如何快速定位代码位置?答案是通过搜索字符串来定位。

打包工具混淆代码只能修改变量名,而字符串是不能被混淆的,我们通过字符串搜索就可以稍微快速找到对应位置的代码。比如通过接口名 'commit'、参数名 'sign' 进行搜索,查看签名算法的逻辑。

请求头

很多人伪造请求,都不注意请求头的参数。例如 User-Agent 用户代理,即用户使用的浏览器标识、Cookie 一般会携带用户信息,用于区分用户。

既然要伪造请求,那就要伪造的真实一点,将抓包中显示的请求头都复制到 Postman 中(Content-Length除外)。

发起请求

一切都准备就绪,那么就可以开始利用 Postman 发起请求。因为涉及签名计算,我们可以利用 Postman 提供的 Pre-requset Script 编写请求前的计算逻辑,并将计算结果写入环境变量中,然后再使用 {{}} 进行取值。

sign 保存到环境变量中

pm.environment.set('sign', sign);

变量的使用
技术人玩小游戏,如何“不战而胜”

到这里就可以发起请求了,从而达到 “不战而胜” 的效果。当然了,这种做法破坏了游戏的公平性,是不可取的。不过我们可以从中吸取经验,多思考问题,提升自身的技能。

思考

换位思考一下,假如这个小游戏是我们自己开发的,那么请你思考这几个问题。

  1. 我们的应用该如何提高安全性,如何防止源码被轻易解读?
  2. 我们如何去发现识别这类伪造请求?

欢迎评论区留言讨论,也可以 wx 搜索 fe_develop6 一起在群里学习讨论。最后别忘了关注我,点赞来一波哦~

注意事项

  1. 该方法并不适用所有游戏,请自行分辨;
  2. 本文仅供学习,如产生不良后果,本文概不负责;
  3. 转载请标明出处 技术人玩小游戏,如何“不战而胜” @前端develop。
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
晴雯
晴雯
Lv1
要是你不嫌弃我的渣字我愿意为你写下你喜欢的句子。
文章
4
粉丝
0
获赞
0