banchen 发表于 2008-8-6 17:06:56

抓包取得CS服务器状态方法

要取得CS服务器的状态信息,首先要发送一个请求给服务器,服务器收到请求后便送回请求所需的数据.编写程序来实现数据包的收发,我用易语言和DELPHI编写程序来实现。除此之外还需要两个辅助工具来方便调试 – wpe pro 1.0 和 turns4 。wpe pro 是一个针对某个程序抓包的软件,可以用它来监视hlds所收发的数据包,然后以16进制方式显示所截得的数据包内容。turns4 是一个ASCII及进制转换工具,可以利用它将wpe所截得的16进制数据进行转换查询。


现在介绍怎么发送请求数据包:
1.      请求返回基本状态信息,也就是当前地图/服务器名称/ip地址/在线人数/最大人数和游戏类型的数据包.该请求数据包25字节。
1) 使用wpe pro 来模拟发送请求包,基本信息请求数据包内容如下:
    十六进制:FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79
    普通字符串:”????TSource Engine Query”

    要注意的是TSource Engine Query前空白的4个位置就是FF FF FF FF所转出来的ASCII字符.他们可以用turns4互相转换。
2) 接收到的基本信息数据包,例子:
   FF FF FF FF 6D 31 32 37 2E 30 2E 30 2E 31 3A 32 37 30 31 35 00 E3 80 96 E8 87 AA E6   B8 B8 E4 BA BA E6 B7 B7 E6 88 B0 E6 9C 8D E5 8B 99 E5 B0 88 E7   94 A8 E8 AD 8F E3 80 97 E3 80 90 E5 BB A3 E8 A5 BF E5 B2 91 E6 BA AA E3 80 91 5B 43 2D 44 5D 00 64 65 5F 64 75 73 74 32 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 00 00 A8 2F 64 77 00 01 77 77 77 2E 64 63 6F 6F 2E 63 6F 6D 00 00 00 01 00 00 00 00 9E F7 0A 00 01 00 00
   返回包头是4个字节FF FF FF FF .数据包的段数都是固定的,00分一个段。
第一段,6D表示m字母,16进制转字符可直接得到该字符,这个值是固定的。可以用来判断时基本信息数据包。
第二段,31 32 37 2E 30 2E 30 2E 31 3A 32 37 30 31 35表示IP地址 ,也是用16转字符串,    转换过来的内容是127.0.0.1:27015
第三段,E3 80 96 E8 87 AA E6。。。。如果是CS1.6的他的编码是UTF8的Unicode字符,这个想还原字符就有些麻烦了,首先从16进制转为UTF8格式,然后转为数值,
          最后转ASCII,还原后的字符串为:〖自游人混戰服務專用譏〗【廣西岑溪】

第四段,64 65 5F 64 75 73 74 32 表示当前地图,de_dust2,16进制转字符可直接得到该字符.
第五段,63 73 74 72 69 6B 65 表示游戏类型,cstrike ,16进制转字符可直接得到该字符.
第六段,43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 这个同样是游戏类型 ,Counter-Strike,16进制转字符可直接得到该字符.
第七段,00 A8 表示当前游戏人数和最大游戏人数,00是在线人数0,A8是最大游戏人数168,所以得到人数信息0/168。

2.      请求返回服务器配置信息。
1) 使用wpe pro 来模拟发送请求包,基本信息请求数据包内容如下:
      十六进制:FF FF FF FF 56 FF FF FF FF   或FF FF FF FF 56
普通字符串:” ????V????”   
   2) 接收到的配置信息数据包,例子:
      FE FF FF FF 06 00 00 00 02 FF FF FF FF 45 58 00 5F 74 75 74 6F 72 5F 62 6F 6D…..
      返回包头是4个字节FF FF FF FF .数据包的段数都是固定的,00分一个段。这是一个大   于1400字节的数据包很大,所以会拆成两个包发送给请求端。
      45 58是固定的,可以用它来判断为配置信息数据包。
      查找该包 61 6D 78 5F 74 69 6D 65 6C 65 66 74,amx_timeleft可以得到剩余游戏时间。
      查找该包 6D 70 5F 74 69 6D 65 6C 69 6D 69 74,mp_timelimit 可以得到总时间。
      查找该包 61 6D 78 5F 6E 65 78 74 6D 61 70,amx_nextmap 可以得到下张地图。
      该包有服务的所有配置信息。


3.      请求返回玩家列表,返回玩家的小序号,名称,杀敌数和游戏时间。
1) 使用wpe pro 来模拟发送请求包,基本信息请求数据包内容如下:
      十六进制:FF FF FF FF 55 FF FF FF FF   或FF FF FF FF 55
普通字符串:” ????U????”   
   2) 接收到的玩家列表数据包,我只取了一个玩家的信息作例子,其它都相同:
      FF FF FF FF 44 01 01 5A 2E 59 2E 52 20 7C 20 42 61 6E 43 68 65 6E 00 06 00 00 00 38   7AA7 41

      44是固定的可以用它判断是否是玩家列表数据包,从01开始到38 7AA7 41为一    个玩家的信息,有用信息可分为4段。
      01 表示当前列表的人数。
    第一段,01表示玩家的序号。
      第二段,5A 2E 59 2E 52 20 7C 20 42 61 6E 43 68 65 6E,为玩家名字Z.Y.R | BanChen,可以直接16转字符串,不过有些服务器有中文玩家名,所以用UTF8 转 ASCII好些.
      第三段,06 为玩家杀敌数6 。
      第四段,387AA7 41 为玩家的已玩时间,这个计算额为麻烦。首先要将它转为       小数型,再取整数,最后再计算出hour\minute\sec .详细算法不写出来了。



易语言:
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/11395070/200873111422191221.rar
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/11395070/200873111402419255.jpg

delphi:
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/1134879/200873111371744224.rar
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/1134879/200873111351527146.jpg

向服务器取得rcon权限也是通过发包验证实现的,方法大家自己琢磨吧.

zwfgdlc 发表于 2008-8-7 01:32:38

回复: 抓包取得CS服务器状态方法

http://www.valve-erc.com/srcsdk/Code/Networking/serverqueries.html
这里有了,很详细.

Cr@zyTreE 发表于 2008-8-7 08:56:13

回复: 抓包取得CS服务器状态方法

好贴啊。。。。。:D :D :D :D

KzFun.小鱼 发表于 2009-1-6 11:35:39

看看再说
:lol

Hoyc 发表于 2009-1-6 15:34:44

得空学点来好东西。最后还是要谢谢楼主的分享精神。

d4server 发表于 2009-1-9 16:22:54

这样也可以??

d4server 发表于 2009-1-9 16:24:00

这样不是服务器就不安全了吗??人家一个包过来,密码就没有了!!

orange3 发表于 2009-1-9 16:34:26

楼主的创意可以用在其他的地方,比如说SNIFFER软件抓包后可以编译出来,对解析网络内部的传输数据有很大帮助。

a246022 发表于 2009-1-15 23:59:58

thank you!
支持LZ
顶下
谢了

jixiwb 发表于 2009-1-16 11:01:14

好强,好花~~~
页: [1] 2
查看完整版本: 抓包取得CS服务器状态方法