|
要取得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,还原后的字符串为:〖自游人混戰服務專用譏〗【廣西岑溪】[C-D]
第四段,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 7A A7 41
44是固定的可以用它判断是否是玩家列表数据包,从01开始到38 7A A7 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 。
第四段,38 7A A7 41 为玩家的已玩时间,这个计算额为麻烦。首先要将它转为 小数型,再取整数,最后再计算出hour\minute\sec .详细算法不写出来了。
易语言:
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/11395070/200873111422191221.rar
delphi:
http://bbs.cga.com.cn/UploadFiles/77/2008-7-31/1134879/200873111371744224.rar
向服务器取得rcon权限也是通过发包验证实现的,方法大家自己琢磨吧. |
|