Почему одного слоя мало
Большинство античитов для ФайвЭм опираются на один слой детекта: либо клиентский стек, который следит за инжектнутыми DLL, перехваченными API и известными сигнатурами меню, либо серверный, который проверяет события и отбрасывает невозможные переходы состояния игры. У каждого слоя есть известный способ отказать. Античит только на клиенте проваливается в тот момент, когда чит прячет свой загрузчик от проверки сигнатур. Античит только на сервере проваливается, когда чит уважает легальную поверхность событий, но пользуется клиентскими хаками (silent aim, ESP, воллхаки), которые вообще не вызывают серверных событий. Двухслойный детект означает, что чит ловит тот слой, который его видит, а тот, который не видит, всё равно даёт поведенческий сигнал для проверки админом.
За чем следит клиентский слой
На клиенте Raven отслеживает инжектнутые модули, перехваченные функции движка, состояние NUI DevTools, целостность собственных файлов ресурса и присутствие известных загрузчиков читов в памяти. Сигнатуры самых активных семейств мод-меню (Eulen, Redengine, HamMafia, Susano, TZ, TZX, Skript, Phaze, Lumia) держатся в актуальном состоянии с выходом раз в 1-7 дней (см. /changelog). Когда срабатывает известная сигнатура, собираются доказательства (скриншот + трейс детекта) и уходят в облачную панель. Когда сигнатура не срабатывает, а аномалии есть, рейтинг доверия игрока падает и он всплывает на живой карте для проверки админом.
За чем следит серверный слой
На сервере Raven прогоняет проверку валидации по каждому серверному событию, которое запускает игрок. Имена событий, которые никогда не должны приходить от клиента, блокируются сразу. Полезная нагрузка событий, выходящая за правдоподобные границы (количество предметов, изменение денег, спавн транспорта в минуту), отклоняется и логируется. Последовательности событий, совпадающие с известными эксплойтами, например цепочка событий у вариантов Redengine, блокируются на уровне паттерна. Серверный детект работает, даже если обойдены все клиентские проверки, поэтому серверное покрытие не обсуждается.
Как два слоя работают вместе
Слои связывает цикл heartbeat. Клиент периодически отправляет на сервер подписанный хеш своего критического состояния. Если heartbeat прекращается, сервер считает клиент изменённым и применяет настроенную реакцию (предупреждение, кик или автобан). Если heartbeat продолжает приходить, но его содержимое больше не совпадает с ожидаемым, сервер логирует расхождение и передаёт его в модель рейтинга доверия. В любом случае у сервера есть постоянное понимание, работает ли ещё клиентский слой, поэтому чит, отключивший клиентский слой, сразу становится виден со стороны сервера.
Почему это важно для устойчивости к обходу
Ни один античит не защищён от обхода. Чтобы обойти однослойный античит, надо победить один стек. Чтобы обойти двухслойный Raven, надо победить два стека одновременно, плюс heartbeat, плюс модель рейтинга доверия, которая поднимает поведенческие аномалии. Стоимость успешного незамеченного обхода заметно выше, а патч выходит быстрее, потому что слой, который чит всё-таки заметил, отдаёт свои данные команде, выпускающей следующее обновление сигнатур.