搜索
查看: 7909|回复: 18

[AMXX 带源码] 抓包取得CS服务器状态方法

[复制链接]
发表于 2008-8-6 17:06:56 | 显示全部楼层 |阅读模式 来自 中国–广西–贵港
要取得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的他的编码是UTF8Unicode字符,这个想还原字符就有些麻烦了,首先从16进制转为UTF8格式,然后转为数值,
          最后转ASCII,还原后的字符串为:〖自游人混戰服務專用譏〗【廣西岑溪】[C-D]

  第四段64 65 5F 64 75 73 74 32 表示当前地图,de_dust216进制转字符可直接得到该字符.
  第五段,63 73 74 72 69 6B 65 表示游戏类型,cstrike 16进制转字符可直接得到该字符.
  第六段,43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 这个同样是游戏类型 Counter-Strike16进制转字符可直接得到该字符.
  第七段,00 A8 表示当前游戏人数和最大游戏人数,00是在线人数0A8是最大游戏人数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 74amx_timeleft可以得到剩余游戏时间。
      查找该包 6D 70 5F 74 69 6D 65 6C 69 6D 69 74mp_timelimit 可以得到总时间。
      查找该包 61 6D 78 5F 6E 65 78 74 6D 61 70amx_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权限也是通过发包验证实现的,方法大家自己琢磨吧.
发表于 2008-8-7 01:32:38 | 显示全部楼层 来自 中国–广东–惠州

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

回复

使用道具 举报

发表于 2008-8-7 08:56:13 | 显示全部楼层 来自 中国–广东–深圳–龙岗区

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

好贴啊。。。。。:D :D :D :D
回复

使用道具 举报

发表于 2009-1-6 11:35:39 | 显示全部楼层 来自 中国–湖北–黄冈
看看再说
:lol
回复

使用道具 举报

发表于 2009-1-6 15:34:44 | 显示全部楼层 来自 马来西亚
得空学点来好东西。最后还是要谢谢楼主的分享精神。
回复

使用道具 举报

发表于 2009-1-9 16:22:54 | 显示全部楼层 来自 中国–广东–河源
这样也可以??
回复

使用道具 举报

发表于 2009-1-9 16:24:00 | 显示全部楼层 来自 中国–广东–河源
这样不是服务器就不安全了吗??人家一个包过来,密码就没有了!!
回复

使用道具 举报

发表于 2009-1-9 16:34:26 | 显示全部楼层 来自 中国–新疆–乌鲁木齐
楼主的创意可以用在其他的地方,比如说SNIFFER软件抓包后可以编译出来,对解析网络内部的传输数据有很大帮助。
回复

使用道具 举报

发表于 2009-1-15 23:59:58 | 显示全部楼层 来自 中国–广东–东莞
thank you!
支持LZ
顶下
谢了
回复

使用道具 举报

发表于 2009-1-16 11:01:14 | 显示全部楼层 来自 中国–北京–北京
好强,好花~~~
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表