假期的收获!怎样分析数据包特征,确定《王者荣耀》游戏流量

大概从7月中旬,我开始研究路由器和网络抓包方面的东西。嗯,没错,这个时间点,就是孩子开始放暑假的时候。可能广大家长在这个时候都开始想到网络监控这个需求了吧。

做了很多很多预备工作,补充很多知识空白,wireshark抓包、openwrt路由器定制、乃至docker、ddev开发环境搭建。。。终于在这个十一假期,整个技术设想完整走通了。

目前,也只是验证走通了,离彻底做完还遥遥无期。其实开始做的时候,很快就想明白,等这一大套东西做完,估计孩子中考也结束了。所以做这个自己能用上的场景不多,也许将来放出来,能满足类似需求的人吧。

毕竟我自己事先找了一圈,没有看到能满足需求的家用级产品。选出来感觉能用的,都是价格好几万的整套设备+服务。

构想中的难点,一直在于怎么识别抓到的数据,是来自于哪个应用的。原来抓到了IP地址,在数据库里保存了DNS解析记录,想要通过IP反查域名来作为确认应用来源的线索。但是现在这个时代,大厂已经没有用单个IP做服务支撑的了。不同城市、不同网络服务商的用户,恐怕得到的都是不同的IP。

查了很多很多资料,直到发现Open FROS  https://github.com/destan19/openfros 这个项目,给了我极大的启发!感谢这个项目的作者!

下面记录一下整个过程。先以《王者荣耀》为例,做一次测试分析。

首先启动游戏。在等候界面里,最明显的,有持续网络流量的功能,就是右上角这个持续测速度。我们从这里开始抓包。

过滤一下请求,发现启动游戏后,有很多域名解析的请求:

msdk.qq.com,tdm.qq.com,awx.smoba.qq.com,这些很明显都是和王者荣耀相关的。有个api.xunyou.mobi,迅游?就是经常弹出广告,让购买加速的东西吧?

哟!发现还有个anticheatexpert.com,防作弊专家?IP地址122.96.96.250,研究一下这里有什么有意思的东西?!不过还是赶紧收回心神,提醒自己,我的目的是为了开发监控,不是游戏上分。

查了几个解析出来的IP地址,果然都是在自己附近的联通节点。如果做成按IP定位的程序,其他城市肯定要单独收集IP数据了。

https://tool.chinaz.com/ipwhois?q=116.128.170.140

不能从IP地址入手,就要再继续从数据包来分析了。过滤一下和这个IP的通讯记录:

ip.addr == 192.168.1.1 and ip.src == 116.128.170.140

从下图能看出一些信息:

  • 数据包长度60,这从Length列能看到。
  • 但是去掉头部信息,每个包里的实际数据,在每行末尾能看到Len=18。很小,很整齐。
  • 来源端口号都是5010。
  • 再进一步看,有没有发现收包时间很整齐,5秒钟一个!

结合这三个信息,包小、内容固定、时间间隔规律,有点象是游戏右上角那个测速功能了吧?

把搜索条件改为 ip.addr == 192.168.1.1 and udp 。查所有udp链接。(因为UDP效率比TCP高,游戏数据不太可能用TCP)

发现从562到565行这4行里,我们向4个不同IP的5010端口发送了一个请求。之后下面566行开始,就在持续不断的从这4个不同的IP地址里收到22字节的数据包。见下图。

随便找其中之一,Follow udp,查找相关联的一组相关联的数据库。查一下这些包的原始数据。切换显示格式 “show data as Raw”。看到这一组22字节的数据包内容很整齐。
都是01 02 c8 41开头,一堆4141结尾

在udp下面,把stream index,add as column。
在 data下面,把data字段,add as column。
这样在前面的列表里,会加上这两个字段

重新回到全部udp包的显示里。就能直观看到数据的16进制内容和索引编号了。看来以后就需要把这两个字段,导入数据库。然后再用程序去做分析。

再随便找个数据包,追踪一下,观察规律。都是0102开头。中间有03 e9。
下图右边红框子里,是一组从00、01、02一直到1d的十六进制数字。很象是测速功能里,计算数据包的计数器吧?

但是有一件事,很奇怪,时间字段里,发现每个数据包间隔都是0.1秒左右。100ms一个包,不足以计算更低的延迟速度。但是在游戏中,100ms已经是很高的延迟了。一般20-40ms才比较好。这个时间对不上。可能推翻我之前的猜测。

之前发现有5010和5008两个不同的端口,再查一组5008的端口看看。

这次增加了delta字段,这是距离接收上一个包之后的时间。可以直观看一下每个包之间的间隔时间。仍然是0.1秒一个。解释不通。

另外,一个好消息和刚才5010端口的特征一致,都是包含在数据包第49,50位,包含03e9的标志。开头的01 02没有了。后面的计数器还在。

在游戏菜单里,能发现的信息就是这些。下面再进一步验证一下自己的分析。

18点25开始对战,重新抓一组数据包。打完之后,再来分析一下数据包。

对战过程中,data里,特征依旧。以后准备用这个特征来判断王者荣耀数据包。
最大的惊喜是在Delta字段里!

有发现delta字段的变化了吗?每个测速数据包,不再是100毫秒一个。
每个数据包之间的时间差,从18ms到62ms不等。差不多就是测速里显示的时间!

看来开始对战之前,程序并没有在很积极的测速,只是验证网没断。只有在开始对战之后,才开始实际测速了。

最后,战绩还行。收工!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload CAPTCHA.