Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд [Сурс] CS:S Cheat Communication — Общение между юзерами через Voice Data

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
706
Реакции
18
CS:S комьюнити наполовину мертвое, а оставшиеся админы серверов сами не гнушаются катать с софтом. Чтобы палить «своих» или просто координировать юзеров вашей пасты прямо на сервере, есть старый, но рабочий метод через саб-канал голосовых данных. Сервер прокидывает CLC_VoiceData всем клиентам как SVC_VoiceData, абсолютно не проверяя пейлоад. Нам остается только вшить туда свой «магический маркер».

Суть метода
Метод позволяет детектить других юзеров вашего софта на одном сервере. Мы отправляем пакет данных, который сервер транслирует всем остальным, а наш хук на принимающей стороне фильтрует эти данные по специфической сигнатуре.

Нюансы реализации
  1. При отправке данных у других игроков на мгновение загорается иконка микрофона, хотя звука нет. Защита от спама — раз в 10 секунд.
  2. В SendNetMsg обязателен флаг bVoice=true, иначе сервер просто дропнет сообщение без объяснения причин.
  3. Для CS:S x64 индекс clc_VoiceData равен 10 (в стандартном Source 2007 это 9, но из-за смещения clc_Move индекс уехал на +1).

Техническое мясо

Сигнатура SVC_VoiceData_Process для engine.dll:
Код:
Expand Collapse Copy
48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 B8 B0 10 00 00

Лэйаут структуры SVC_VoiceData под x64 системы:
Код:
Expand Collapse Copy
+0x00 vtable
+0x08 CNetMessage base (0x20 bytes)
+0x28 int m_nFromClient
+0x2C bool m_bProximity
+0x30 int m_nLength (размер данных в битах)
+0x40 bf_read { pData, nDataBits (+0x0C), iCurBit (+0x10) }

Код:
Expand Collapse Copy
#pragma once
#include <array>
#include <cstdint>

#define clc_VoiceData 10
#define svc_VoiceData 15

constexpr uint32_t COMM_MAGIC = 0xDEAD1337;

class CLC_VoiceData : public CNetMessage {
public:
    int GetType() const    { return clc_VoiceData; }
    const char* GetName()  const { return "clc_VoiceData"; }
    int GetGroup() const   { return INetChannelInfo::VOICE; }
    const char* ToString() const { return "clc_VoiceData"; }

    bool ReadFromBuffer(bf_read& buffer) {
        m_nLength = buffer.ReadUBitLong(16);
        m_DataIn = buffer;
        return buffer.SeekRelative(m_nLength);
    }

    bool WriteToBuffer(bf_write& buffer) {
        buffer.WriteUBitLong(GetType(), NETMSG_TYPE_BITS);
        m_nLength = m_DataOut.GetNumBitsWritten();
        buffer.WriteUBitLong(m_nLength, 16);
        return buffer.WriteBits(m_DataOut.GetData(), m_nLength);
    }

    CLC_VoiceData() { m_bReliable = false; }

    int m_nLength{};
    bf_read m_DataIn;
    bf_write m_DataOut;
};

Обработка и хук
Основная логика заключается в чтении бит из буфера после получения сообщения. Если первые 32 бита совпадают с нашим COMM_MAGIC, значит на сервере еще один «наш» человек.

Код:
Expand Collapse Copy
uint64_t svc_voice_data_hook(void* rcx, void* svc_msg) {
    if (svc_msg && g_communication.on_voice_data_received(svc_msg))
        return 1; // Блочим дальнейшую обработку, если это наш пакет
    return svc_voice_data_original(rcx, svc_msg);
}

Риски и траблшутинг
Не забывайте, что это не панацея от бана, если вы играете слишком палевно. Механика микрофона может вызвать подозрения у внимательных админов, так что имеет смысл додумать решение, которое будет скрывать анимацию активации микрофона на стороне сервера.

Видео-превью метода:

Если будете портировать под другие Source-игры, чекайте индексы сообщений, они часто прыгают от версии к версии.
 
Назад
Сверху Снизу