CS1.6 HLDS服务器收到客户端未知0x58数据包的问题求助
CS 1.6 模拟服务器中的神秘数据包问题
我在模拟CS 1.6服务器时遇到了一个无法处理的神秘数据包:b'\xff\xff\xff\xffX'(原始字节为FF FF FF FF 58)。该数据包不属于标准A2S协议(A2S_INFO=0x54、A2S_PLAYER=0x55等),若忽略它客户端会重复发送,但真实服务器无响应。我抓取其他服务器流量发现同样存在该数据包,服务器均无回复,但我的模拟服务器忽略它时,客户端连接时会持续发送。在Valve服务器查询协议及GoldSrc规范中均未找到相关说明。
相关代码如下:
import socket import struct import time import threading from random import randint import os FAKE_SERVER_IP = "0.0.0.0" FAKE_SERVER_PORT_START = 27015 FAKE_SERVER_PORT_END = 27115 REDIRECT_IP = "185.97.255.43" REDIRECT_PORT = 27017 challenge_token = os.urandom(4) steam_challenge_token = os.urandom(8).hex().encode() SERVER_ANSWER = f'\xFF\xFF\xFF\xFFS2C_CONNECTION {REDIRECT_IP} {REDIRECT_PORT} {randint(100, 9999999)}' SERVER_TOKEN_A2S = b'\xFF\xFF\xFF\xFF\x41' + challenge_token SERVER_TOKEN_STEAM = b'\xFF\xFF\xFF\xFFchallenge ' + steam_challenge_token + b'\n' SERVER_NAME = "Мой Фейковый Сервер (Редирект)" MAP_NAME = "de_dust2" GAME_FOLDER = "cstrike" GAME_NAME = "Counter-Strike 1.6" APP_ID = 10 MAX_PLAYERS = 32 BOTS = 0 SERVER_TYPE = b'd' ENVIRONMENT = b'w' VISIBILITY = 0 VAC = 1 HEADER_INFO = b'\xFF\xFF\xFF\xFF\x49' HEADER_CHALLENGE = b'\xFE\xFD\x09' HEADER_REDIRECT = b'\xFF\xFF\xFF\xFF\x09redirect ' INFO_QUERIES = ( b'\xFF\xFF\xFF\xFFTSource Engine Query\x00', b'\xFF\xFF\xFF\xFF\x54' ) redirect_packet = ( b'\xFF\xFF\xFF\xFF' # Заголовок + b'redirect\x00' # Команда + b'185.97.255.43:27017\00' # Новый адрес ) def create_info_response(): response = b'\xFF\xFF\xFF\xFF\x49' # Заголовок ответа response += struct.pack('<b', 17) # Protocol version response += SERVER_NAME.encode('utf-8') + b'\x00' response += MAP_NAME.encode('utf-8') + b'\x00' response += GAME_FOLDER.encode('utf-8') + b'\x00' response += GAME_NAME.encode('utf-8') + b'\x00' response += struct.pack('<h', APP_ID) response += struct.pack('<bbbb', 0, MAX_PLAYERS, BOTS, SERVER_TYPE[0]) response += struct.pack('<bb', ENVIRONMENT[0], VISIBILITY) response += struct.pack('<b', VAC) response += b'\x00' # No ETV return response def handle_redirect(): # return HEADER_REDIRECT + f"{REDIRECT_IP}:{REDIRECT_PORT}".encode() pass def run_fake_server(FAKE_SERVER_PORT): with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: try: sock.bind((FAKE_SERVER_IP, FAKE_SERVER_PORT)) print(f"Сервер запущен на {FAKE_SERVER_IP}:{FAKE_SERVER_PORT}") while True: data, addr = sock.recvfrom(1024) print(f"Пакет от {addr[0]}:{addr[1]} [{len(data)} байт]") print(data) if data in INFO_QUERIES: sock.sendto(create_info_response(), addr) print(f"Ответил на A2S_INFO {addr[0]}") elif b'getchallenge' in data: if b'steam' in data: sock.sendto(SERVER_TOKEN_STEAM, addr) print("Отправляю токен для стим") else: sock.sendto(SERVER_TOKEN_A2S, addr) print("Отправляю токен для A2C") if b'\xff\xff\xff\xffX' in data: # sock.sendto(b'\xff\xff\xff\xffInvalid query', addr) print("Мистический пакет, ignore") sock.sendto(b'\xff\xff\xff\xff', addr)
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

