一款IOS小游戏的数据抓包篡改实践

5,332 阅读4分钟

引言

最近跳一跳游戏真是风靡了整个朋(I)友(T)圈,身边有很多小伙伴尝试了各种语言写跳一跳的脚本,而我由于比较懒,所以只尝试py版本的脚本实验,然后又研究了一下POST直接提交分数的过程,在这个过程中,对抓包这件事儿产生了浓厚的兴趣。

抓包

首先说说自己的抓包把,前端攻城狮一枚,所以采用的代理工具是阿里的 AnyProxy

主要特性包括:

基于Node.js,开放二次开发能力,允许自定义请求处理逻辑
支持Https的解析
提供GUI界面,用以观察请求

这里简单描述一下如何使用anyproxy抓取https的包

1. npm install -g anyproxy
2. anyproxy-ca // 生成https ca证书
3. 手机下载生成的本地ca证书并添加信任(IOS需要使用Safari打开下载证书的地址)
4. anyproxy -i 启动AnyProxy并解析所有https的服务

具体细节这里就不拓展开了,百度能找到很多资料。 然后由于放在本地代理抓包每次都要重新启动AnyProxy并且需要保证和电脑在同一个局域网下非常麻烦,所以我将AnyProxy部署到了服务器上。 服务器上的部署和本地没什么区别,无非就是需要使用pm2去管理一下AnyProxy

pm2 start anyproxy -x -- -i [这里可以加上anyproxy其他的参数,比如端口相关]

这里有一个问题就是,AnyProxy有一个Web GUI可以看到抓取的包,但是没有任何认证,所以任何人都可以登录这个界面看到使用这个代理的包信息,这是一件非常不安全的事情,所以如果放在服务端还是对AnyProxy做一下二次开发比较好。

某游戏

简单介绍一下这个游戏:
一款单机类的游戏,可以根据离线时间获取离线收益。(够简单吧...)

包分析

其实没啥好分析,因为获取离线收益的包一眼就能发现,由于是一款单机游戏,那么与服务器进行交互的就比较少,所以一眼就能发现这样的一个请求。

一看就能发现这是请求的一个时间戳,那简单的分析一下,这个游戏应该是用这个服务器的时间和本地的时间作比较然后计算出离线时间的(当然修改本地时间这种做法已经被作者考虑到了),那么是不是意味着我可以伪造一个这样的时间戳就能产生一个高额的离线收益呢!

伪造请求

这种请求比较容易伪造,不需要身份验证,没有加密数据,需要完成的就是伪造host然后转发一个虚假的时间戳。

伪造host

最简单的方式:

1. vim /etc/hosts // 打开hosts文件
2. 在最后一行加入 服务器IP 指向域名

这时候如果从服务器访问www.hko.gov.hk的话必然会先解析到本地的host,然后跳转到服务器启动的Server

所以这时候我选择用node起一个Simple Server, GET请求的地址便是上图的/cgi-bin/gts/time5a.pr,简单的server如下

const server = require('server')
const { get } = server.router

server({ post: 80 }, {
  get('/cgi-bin/gts/time5a.pr', ctx => '0x191234567890')
})

这里偷懒了,用了一个第三方的库快速生成一个Simple Server,没用使用http来createServer,并且直接使用了80端口。如果80端口被占用的话可以考虑使用结合Nginx处理。

成果

好了一切准备就绪,来看一下最终的成果吧。

成功了~果然成功了~
离线收益成功结算了,但是有上限的数额,好像是6个小时,不过可以无限刷...无限刷...

其他实践

这只是一个很简单的实践,在做这个实践之前还有一个大胆的想法。在跳一跳火的同时,发现口令红包莫名火了起来,这时候就思量着如何能够提取口令红包的数据然后伪造呢(坏笑ing...) 思路大概这样

  • 通过代理捕获小程序口令红包接口(https)
  • 提取其中需要转化成语音的字段
  • 通过文字转化语音的接口伪造报文POST

唔...显然我是失败了,不然我现在就躲在后面闷声发大财了...应该不违法把各位亲,毕竟我抢的是红包呀~~不过有兴趣的人可以再尝试尝试,如果能捕获到所有的红包...那收入还是有些可怕的...

总结

总的来说这个过程是比较轻松Esay的,但贵在思考和探索的过程,通过也从一个方面给我这个前端攻城狮打响了警钟,原来抓包伪造是一件如此可怕的事情,对于网络安全的防范需要特别的注意才行,不然轻则诸如这个小游戏,重则涉及资金相关的,这可不是闹着玩的。

敬请大佬们多多指点!