[Python] Receving a strange packets from client to cs1.6 server (HLDS)

Discussão em 'Python' iniciado por Stack, Abril 10, 2025.

  1. Stack

    Stack Membro Participativo

    I was trying to emulate a CS 1.6 server but got stuck handling a mysterious packet: b'\xff\xff\xff\xffX'.

    Observed raw bytes: FF FF FF FF 58 (header FF FF FF FF + single byte X/0x58), but it's not a part of standard A2S protocol (A2S_INFO=0x54, A2S_PLAYER=0x55, etc.). Sent repeatedly by the client if ignored, but no response observed from real servers.

    I checked traffic to other servers. Same packet FF FF FF FF 58 appears, but servers ignore it (no reply). I tried ignoring it, but client spams it every time when tries to connect. I haven't found anything in Valve’s Server Query Protocol or GoldSrc specs.

    Source code

    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)

    Continue reading...

Compartilhe esta Página