微信小游戏抓包分析


(最近刚来到平台,以前在CSDN上写的一些东西,也在逐渐的移到这儿来,有些篇幅是很早的时候写下的,因此可能会看到一些内容杂乱的文章,对此深感抱歉,以下为正文)


引子

新的一年又开始了,因为才恢复正常工作不久,手上的活儿也不是很多,因此就有了一些时间供本人挥霍。期间为了帮一个同学的忙,玩了一段时间Arduino,结果当实现的差不多的时候,又告诉我不需要了,当时真的是欲哭无泪,好吧扯远了,原谅笔者说了一波闲话。

故事的起因是在一次出差中,因为出差的地方只能做大巴去,所以路上消耗的时间还是比较久的,期间我的Leader向我分享了一个微信小游戏-消灭病毒,然后我两就沉浸在了冲关的道路上,越走越远。

这个游戏跟早些年的飞机大战很像,但玩法比飞机大战丰富多了,并且依托于小游戏的平台,所以还是火了一把。值得注意的是,这个游戏并没有充值的通道,只能靠一些分享或者看广告来获取额外的奖励。因为还有排行榜功能,所以也算是激起了玩家的战斗欲,总之我和我Leader之间就默默地形成了看谁冲关冲的远的这种现象,正值这周接了个保障的活,空闲时间比较多,所有才有了这篇文章。

正文

Fiddler抓包

微信小游戏在我的理解其实就是H5游戏,只不过是依托在了微信这个大平台上,玩家打开某个小程序后,便会从微信的服务器上下载对应的应用包下来(wxapkg,小程序的一种包结构,类似于以前的apk包),然后再在本地的V8环境下运行着。

因为笔者以前也做过手游,也接触过飞行射击类的游戏,因此猜测,消灭病毒这种弱联网游戏一般都只有在关卡结算或者退出时,才会向服务器上写入玩家数据,所以便想着有没有机会了解一下这个数据交互的过程,因此决定抓包查看。

这里笔者使用了Fiddler工具进行抓包,下面就先简单地介绍一下抓包的流程。

PC软件安装

Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。(以上内容摘自百度百科)

对这个工具有了一个初步的了解后,我们便可以开始进行安装了,笔者是前往的Fiddler官网进行的下载。
进入官网,点击右上角的TRY NOW按钮,来获取Fiddler。


Fiddler官网

根据提示,填充相关信息后下载Fiddler的安装包。


Fiddler安装包下载

下载后成功获得安装包,然后一路傻瓜式的安装即可。


Fiddler安装程序

安装成功后,点解Fiddler.exe图标,启动Fiddler。


Fiddler启动程序

Fiddler运行界面

Fiddler运行界面

这里我们需要进行一下简单的配置,详细步骤可以参考Fiddler手机抓包。
点击Tools按钮,出现下拉选项,继续选中Options按钮进入设置界面。

Fiddler设置界面

进入Options界面,点击General选项卡,勾选如下选项(该选项基本是默认的好像)


General选项

进入Options界面,点击HTTPS选项卡,勾选如下选项。

HTTPS选项设置

进入Options界面,点击Collections选项卡,勾选如下选项,这里主要注意的是监听端口的填写,不能与本地的应用端口冲突,该端口号之后需要使用到。

Collections选项设置

配置完成后点击OK,然后重启Fiddler工具,使配置生效。

移动端代理配置

Fiddler抓包前提是使用的移动端(泛指手机)与安装了Fiddler工具的PC机处于同一个无线网络内。然后手机通过设置代理来实现由Fiddler转发的功能。这里笔者使用的手机是小米8。

打开无线设置,然后选中对应的无线网进行进一步的管理,在代理设置处改选为Manual,然后HostName填写为安装了Fiddler工具的主机IP,端口号为之前安装Fiddler设置的端口号。


手机端代理设置

修改成功后(手机跟pc在一个无线网),用手机浏览器访问Hostname:Port下载证书(抓取Https时需要的),下载完成后安装即可。


证书下载

大部分手机可以直接安装证书,笔者的小米8在安装过程中需要一点儿小弯路,无法直接安装,需要在无线设置-增强型设置里手动安装。
无线管理-增强型设置。


小米机型特殊设置

安装证书

证书安装

选择对应的证书进行安装。


证书安装

完成上述操作后,就可以在Fiddler中抓取到手机的包了。

抓包尝试

保持需要抓包的手机跟安装Fiddler软件的PC机处在同一个可以上互联网的无线网络中,根据上一条的配置逐步操作。
成功启动FIddler后,可以在如下图标红的位置查看本机的IP,然后手机端配置相应的代理,Fiddler即可实现抓包功能。


状态查看

配置正常,运行正常时,可以在左侧发现大量的请求。


运行界面

此时,用手机登录小游戏,在左侧的请求列表中,就会看到一些有意思的请求了。


运行界面

从请求名字中,也许就能发现些什么,upload,开发小哥的接口做的还是很见名思意的,默默地点进去瞅一瞅,通过Fiddler工具,我们可以看到请求和回应的详细信息。


运行界面

点开upload请求的请求内容,看到了一堆json类型的数据,并且发现数据并没有加密,居然是明文传输=-=,直接就能看出火力值,金币,钻石,活力等信息。


运行界面

模拟请求

因为在上一步发现消灭病毒这款微信小游戏,可以比较轻松地抓取到请求的内容,并且是明文传输的,所以便迫不及待地打开了我的Restlet Client工具(笔者的笔记本因为安装Postman老是报错,所以就装了个类似于Postman的工具Restlet Client来调试了)。


Restlet Client客户端

对照着之前Fiddler抓取的请求内容,创建好HEADER和BODY(第一次尝试,完全拷贝抓取的信息),默默地点了一波发送,然后就发现返回跟Fiddler抓取的Response是一致的,于是。。。嘿嘿嘿。。。


模拟请求尝试

发现可以直接用工具发送请求并且服务器正常回应后,二话不说,直接把请求内容中的什么金币啊钻石啊之类的往上加了加(我真的只加了一点儿一点儿,诶?加了几个零来着!),然后点击发送,然后发现返回了1000,操作失败,看来并没有想象中的简单。


模拟请求尝试

第一次尝试失败后,就意识到了在请求体中必然有一些数据是用来验证的,于是仔细地观察一波。没错,被马赛克勇士绑架的一些信息,都是一些无序的字符组合,因此暂时对这些数据进行重点分析。


数据分析

通过进一步的观察后发现,uid,openid其实就是对应着游戏中设置界面的ID,于是一下子排除了两个选项。


游戏ID

再看剩下来的两个怀疑对象,嗯,名字都叫sign,可疑度增加1000点,经过多条数据抓取,可以发现,短时间内的第一个sign值是相同的,因此直接锁定最后一个sign值,该值每次请求都会发生改变。这里就牵扯到了数据的加密解密了,因此就想着是否能获取小程序源码了,毕竟加密解密不能光靠猜。

反编译小程序

小程序刚出来的时候,看过一点儿入门基础,小游戏可以看成一种简化的小程序,但又加强了绘制功能。因为以前从没有反编译过小程序,因此就找了把度娘,然后就再次验证了度娘的强大。

笔者参考了链接如何反编译小程序,使用了夜神模拟器,RE管理器以及Github上qwerty472123大神写的node.js版本的脚本(如果没有nodejs的环境话,可能还要考虑一下nodejs环境的安装,这个直接度娘即可)。在使用脚本前需要安装一系列依赖,根据上面连链接博客中一步一步操作(笔者在尝试的时候,少了不止参考博客中的依赖,总之少啥就装啥),最终成功反编译出了源码。

小程序源码

使用微信开发工具打开工程,静静地观摩一波源码。导入时当提示需要appid之类时,只需点击小游戏,然后会自动分配一个id给你(这个游戏没有,但点完之后就可以进工程了=-=)。


小程序源码

仔细浏览一下大概的结构,就会发现主要的逻辑全在code.js中。然后根据之前推断的一些关键字,sign,archive\upload,md5等进行一波全局搜索,就能发现一些有趣的事情了。最终发现了sign的生成原理,并且在生成过程中还删除了一些信息,appid和secret。


小程序源码

删除的信息,全局搜索了一下,居然还搜到了,很是尴尬。。


小程序源码

加上之前知道了加密过程,将加密方法截取出来,填入自己的数据,尝试生成sign值。


模拟加密过程

模拟加密获取sign值

将自己生成的sign值跟之前截取到的消息中的sign值比对了一下,发现一致,就知道了本次探索基本结束了,静静地修改数据,重新生成sign值,然后发送请求,然后就成功修改了数据。

总结

笔者在本次摸索中也遇到了一些坑,比如数据格式的正确性,运行库的依赖等等,不过总体还是实现了预期效果。

最后非常感谢一位不认识的朋友,给我提供了非常多的帮助,非常感动。
下面将附上他的博客的地址,欢迎大家前往观看,TMaize的博客
,同时他也制作了修改的小工具供大家使用,在线修改工具。

以上为本篇的全部内容。

你可能感兴趣的:(微信小游戏抓包分析)