Серверный и клиентский античит: где должно приниматься решение
Клиентские проверки делят память с читом, который хочет их обойти. Что клиент видит, а сервер никогда не увидит, и как всё равно этим пользоваться.
Любой спор об античите заканчивается в одном и том же месте: кто решает, что что-то произошло? Если ответ - машина самого игрока, у вас не античит, а пожелание. Это не критика какого-то конкретного продукта. Это свойство того, где выполняется код. Так выглядит главное различие между серверным античитом и клиентским.
Две машины, и одна из них принадлежит читеру
У ресурса RedM есть клиентская часть и серверная часть. Клиентская работает внутри процесса игры, на железе, которым владеет игрок, рядом со всем, что этот игрок решил загрузить. Мод-меню не атакует ваш ресурс снаружи: после инжекта оно делит то же адресное пространство, что и игра, и ваше состояние Lua. Оно в комнате. Всё, что может прочитать ваш клиентский скрипт, меню прочитает первым; всё, что может отправить ваш клиентский скрипт, меню перепишет на выходе.
Это даёт атакующему четыре хода против клиентской проверки, по возрастанию лени:
Прочитать её. Ваша логика детекции - это Lua, поставляемый игроку. Её пороги, названия событий и исключения читаемы, а значит, чит можно настроить так, чтобы держаться чуть ниже каждого выбранного вами числа.
Пропатчить её. Заменить функцию, которая сообщает, или натив, который она вызывает, на такую, что возвращает всё, что нужно для вашего молчания. Проверка продолжает выполняться. Она выполняется в пользу читера.
Не дать ей запуститься. Самый частый способ в природе и наименее изощрённый. Ничего не нужно обходить, если файл никогда не выполняется: некоторые загрузчики пишут в глобальную таблицу ресурса раньше, чем ваш код успевает инициализироваться.
Ответить за неё. Если сервер спрашивает клиента «вы всё ещё наблюдаете?», чит отвечает «да». Лжец вполне способен подтвердить, что он честен.
Каналы целостности всё равно стоит иметь, просто они ничего не доказывают. Наш требует, чтобы ресурс отвечал серверу по расписанию, а сервер считает подряд пропущенных ответа событием для эскалации, а не немедленным действием, именно потому, что сельское соединение даёт ту же сигнатуру, что и вмешательство. Молчание говорит, что надо пойти посмотреть. Оно никогда не говорит, что произошло.
Не публикуется/Пороги срабатывания не публикуются: известное значение - это значение, под которое настраивают чит.
Что видит клиент и никогда не увидит сервер
Кинематика прицеливания. Сервер получает позиции и выстрелы. Камеру он не получает. Угловая траектория, по которой прицел идёт между двумя целями (мгновенный скачок, полная остановка, выстрел сразу после), существует только на клиенте, и это самый надёжный след, который оставляет внешний аимбот. Как это выглядит на практике, см. в статье детекция silent aim на RedM.
Вызовы нативов. Спавн педа, фургона или объекта проходит через игровые функции. Изнутри процесса видно, что вызов пришёл ни из какого известного ресурса. С сервера вы всегда видите только результат, среди всего, что ваши собственные скрипты создают легитимно.
Локальные артефакты. Глобальные переменные, которые закладывает загрузчик, файлы, которые он бросает рядом с игрой, собственное состояние меню. Всё это никогда не пересекает сеть. Если никто не смотрит изнутри, не смотрит вообще никто.
Клиент - это датчик. Он никогда не судья.
- заявлено клиентом
- принято к сведению, с меткой времени, никогда не достаточно
- установлено сервером
- дельты позиций, число попаданий, здоровье на сервере
- подтверждено другим клиентом
- жертва описывает то же событие
- принятое действие
- только сервером, на установленных или подтверждённых фактах
Правило, которого мы держимся, короткое: отчёт клиента может открыть дело, но никогда не может его закрыть. Клиент, говорящий «этот игрок невидим», - повод начать считать то, чем владеет сервер. Самое сильное доказательство - не датчик вовсе, а два независимых клиента, описывающих одно событие, потому что читеру пришлось бы подделать обе машины, чтобы остаться согласованным, а одна из них принадлежит жертве, которой незачем помогать.
Работа на стороне сервера имеет реальную цену, и RedM заставляет её платить. Лошадь в полном галопе приземляется точно туда, где стоит наивный порог скорости. Игрок, стоящий в движущемся дилижансе или на поезде, едет, не двигаясь. Быстрое перемещение по замыслу перемещает людей, а реанимация вашего фреймворка ставит тот же самый флаг неуязвимости, что и скрипт годмода. Серверная проверка, игнорирующая эти четыре факта, даёт не меньше ложных срабатываний, чем клиентская. Она даёт больше, громче и с правом кикать.
Поэтому проверка скорости - это не порог, а сравнение: пройденное расстояние против того, что, по данным движка, делает игрок, с допуском на окне в и полностью отбрасываемое, когда перемещение было скриптовым. Точное окно и исключаемые контексты остаются у нас, потому что опубликованное число - это число, под которое можно настроить чит.
Не публикуется/Пороги срабатывания не публикуются: известное значение - это значение, под которое настраивают чит.
Без агента, без сканирования диска
Некоторые античиты на других платформах просят игроков установить драйвер, перечисляют запущенные процессы или хешируют файлы вне папки игры. Мы ничего этого не делаем, и об этом стоит сказать прямо: BaobabAC ничего не устанавливает на машину игрока. Это ресурс, который поставляет ваш сервер, как и любой другой ресурс. Он не читает диск, не перечисляет процессы, не трогает память вне игры. На ролевом сервере, где значительная часть вашего населения и так с подозрением относится к тому, что может видеть ваш персонал, это не технические детали: это разница между сообществом, которое принимает инструмент, и сообществом, которое против него агитирует.
Если вы сравниваете продукты, спрашивать вендора нужно не о том, сколько у него детекций. Спрашивать нужно так: где принимается это решение и что сервер знает сам по себе? Как это выглядит у нас, можно увидеть на реальных данных в демо-панели, тарифы публичны, а наш античит RedM отвечает на этот вопрос в первом же абзаце. Статья как работает античит RedM рассказывает о семействах детекций, которые эта статья предполагает известными.