Защита От Читеров На Примерах Для Unity

Всем привет! С вами снова Илья и мы продолжаем серию статей по разработке игр с использованием Unity. Сегодня мы рассмотрим процесс защиты ваших игр на примерах.

Я буду объяснять на основе нашей открытой библиотеки, созданной для Pixel Incubator — сообщества, в котором мы учим создавать игры и не только.



Защита от читеров на примерах для Unity



Начало работы

Итак, все начинается с библиотеки.

Естественно, по ходу статьи мы рассмотрим, как работают элементы античита, а пока предлагаю просто взять готовый и бесплатный простой пример: https://github.com/TinyPlay/Pixel-Anticheat Эта библиотека включает в себя:

  • Несколько типов детекторов читов (Speed Hack, Wall Hack, Teleport Hack, Time Hack, Assembly Injection, Memory Hack);
  • Защищенные типы, шифрующие свои значения;
  • Классы для безопасного хранения данных в настройках проигрывателя или файлах;
  • Библиотеки шифрования и хеширования (AES, RSA, SHA, MD5, Base64, xxHash);
  • Библиотека для получения сетевого и местного времени;
  • служебные библиотеки;
  • Сцена представляет собой пример работы с античит-интерфейсом;
  • Единый интерфейс управления;
В ближайшем будущем также планируется добавить больше уровней защиты.

Все они могут быть подключены/отключены динамически.

Детекторы читов работают автоматически с минимальными настройками.

Далее мы рассмотрим, как они выявляют читеров и защищают ваши игры.

Стоит сказать, какой бы у вас не был античит, в идеале вы не должны хранить или обрабатывать какие-либо данные на стороне клиента.

По возможности проделайте все критичные манипуляции с данными на сервере.

Подключение детекторов читов: Инициализацию любого детектора можно выполнить следующим образом:
  
  
  
   

AntiCheat.Instance().

AddDetector<MemoryHackDetector>().

InitializeAllDetectors();

Вы также можете подключить все датчики одновременно:

AntiCheat.Instance() .

AddDetector<MemoryHackDetector>() .

AddDetector<InjectionDetector>() .

AddDetector<SpeedHackDetector>() .

AddDetector<WallHackDetector>() .

AddDetector<TeleportDetector>() .

AddDetector<TimeHackDetector>() .

InitializeAllDetectors();

Некоторые из них могут содержать параметры.

Например:

AntiCheat.Instance().

AddDetector<SpeedHackDetector>(new SpeedhackDetectorConfig(){ coolDown = 30 }).

InitializeAllDetectors();



Детекторы читов

Эти классы позволяют перехватывать возможные методы нечестной игры и уведомлять об этом код с помощью событий.

В нашей библиотеке мы привели пример, в котором при срабатывании таких событий отображается UI с подозрением на читерство:

namespace PixelAnticheat.Examples { using UnityEngine; using System.Collections.Generic; using PixelAnticheat.Detectors; using PixelAnticheat.Models; public class SampleScript : MonoBehaviour { [Header("Anti-Cheat References")] [SerializeField] private Transform _playerTransform; [Header("UI Referneces")] [SerializeField] private AntiCheatUI _antiCheatUI; private void Start() { // Initialize All Detectors AntiCheat.Instance() .

AddDetector<MemoryHackDetector>(new MemoryHackDetectorConfig()) .

AddDetector<InjectionDetector>() .

AddDetector<SpeedHackDetector>(new SpeedhackDetectorConfig(){ coolDown = 30, interval = 1f, maxFalsePositives = 3 }) .

AddDetector<WallHackDetector>(new WallhackDetectorConfig(){ spawnPosition = new Vector3(0,0,0) }) .

AddDetector<TeleportDetector>(new TeleportDetectorConfig(){ detectorTarget = _playerTransform, availableSpeedPerSecond = 20f }) .

AddDetector<TimeHackDetector>(new TimeHackDetectorConfig(){ availableTolerance = 120, networkCompare = true, timeCheckInterval = 30f }) .

InitializeAllDetectors(); // Add Detectors Handlers AntiCheat.Instance().

GetDetector<MemoryHackDetector>().

OnCheatingDetected.AddListener(DetectorCallback); AntiCheat.Instance().

GetDetector<InjectionDetector>().

OnCheatingDetected.AddListener(DetectorCallback); AntiCheat.Instance().

GetDetector<SpeedHackDetector>().

OnCheatingDetected.AddListener(DetectorCallback); AntiCheat.Instance().

GetDetector<WallHackDetector>().

OnCheatingDetected.AddListener(DetectorCallback); AntiCheat.Instance().

GetDetector<TeleportDetector>().

OnCheatingDetected.AddListener(DetectorCallback); AntiCheat.Instance().

GetDetector<TimeHackDetector>().

OnCheatingDetected.AddListener(DetectorCallback); } private void OnDestroy() { AntiCheat.Instance().

GetDetector<MemoryHackDetector>().

OnCheatingDetected.RemoveAllListeners(); AntiCheat.Instance().

GetDetector<InjectionDetector>().

OnCheatingDetected.RemoveAllListeners(); AntiCheat.Instance().

GetDetector<SpeedHackDetector>().

OnCheatingDetected.RemoveAllListeners(); AntiCheat.Instance().

GetDetector<WallHackDetector>().

OnCheatingDetected.RemoveAllListeners(); AntiCheat.Instance().

GetDetector<TeleportDetector>().

OnCheatingDetected.RemoveAllListeners(); AntiCheat.Instance().

GetDetector<TimeHackDetector>().

OnCheatingDetected.RemoveAllListeners(); } private void DetectorCallback(string message){ Debug.Log("Cheating Detected: " + message); if (_antiCheatUI != null) { _antiCheatUI.SetContext(new AntiCheatUI.Context { message = message, OnCloseButtonClicked = QuitGame, OnContactsButtonClicked = GoToSupport }).

ShowUI(); } } private void QuitGame() { Application.Quit(); } private void GoToSupport() { Application.OpenURL(" https://example.com/ "); } } }

Если мы разовьем эту идею и объединим ее с серверной частью, то сможем отправлять сообщения о чите модераторам, которые будут проверять честность/нечестность игры.

Но в идеале лучше хранить все данные на сервере и проверять их там.

А теперь немного теоретической части.



Детектор взлома скорости

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

Чтобы это исправить — мы сравниваем прошедшее время внутри игрового цикла Unity через Время.

deltaTime И время, прошедшее в системе .



Защита от читеров на примерах для Unity

Если это время не совпадает (в пределах определенной погрешности и с допустимым количеством пропусков), выдаем читерское событие.

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



Детектор взлома стен

Взлом стены - грубо говоря, проходя сквозь стены.

Его также можно включить в хаки NoClip. У объектов отключены некоторые (или все) коллайдеры.

Для защиты от этого мы создаем служебные объекты RB или Character Controller, с помощью которых мы постоянно проверяем возможность прохождения через стену с помощью служебного объекта стены.

Таким образом, с помощью служебных объектов (фейковых стен и фейковых игроков) мы проверяем работоспособность коллизий в игре.



Детектор взлома времени

Дополнительный метод защиты, проверяющий наличие хака по перемотке времени (вперед или назад) для быстрого фарма временных ресурсов.

Особенно это распространено в различного рода бездельниках, фермах и т. д.

Защита от читеров на примерах для Unity

Вы можете проверить время локально или через Интернет. Оба метода мы реализуем в нашей библиотеке.

В чем их смысл? Берем время из Интернета и местное время и через определенный промежуток времени сравниваем разницу между местным временем и временем из Интернета.

Если через 10 секунд мы получаем разницу во времени интернета в 10 секунд, то при перемотке времени на телефоне мы получаем разницу в 10 секунд + определенный промежуток времени, за который мы перематывали.

Таким образом мы можем вычислить перемотку времени и устранить ее, создав дополнительный уровень защиты.



Детектор впрыска сборки

Здесь все довольно просто - мы задаем белый список библиотек, которые можно включить в финальную сборку нашей игры, и если они не совпадают со списком при запуске игры, то это означает, что либо ее код был изменен (либо код .

dll-библиотек), или кто-то проник в нашу игру.



Защита от читеров на примерах для Unity

Опять же, для большей стабильности не забывайте обфусцировать свой код, а также использовать IL2CPP вместо среды Mono.

Детектор взлома памяти

Этот извещатель работает совместно с защищенными типами.

Защищенные типы хранят реальное значение и его зашифрованный хэш.

Если реальное значение меняется извне, то его хэш остаётся неизменным, а это значит, что к памяти обращались извне (например, меняли через Cheat Engine).



Защита от читеров на примерах для Unity

Таким образом, мы можем безопасно работать с нашими данными, используя защищенные типы для хранения значений.



Телепорт Взлом

Этот метод помогает частично избавиться как от некоторых видов спидхаков, так и от телепортационных хаков.

Суть ее проста — каждый определенный промежуток времени (например, раз в 10 секунд) мы проверяем расстояние между текущей позицией игрока и его новой позицией.

Если эта позиция меняется больше, чем разрешено, игрок телепортируется.



Защита от читеров на примерах для Unity

Здесь вы можете дополнительно использовать защищенные типы для шифрования векторов.



Защищенные типы

Идея проста — мы храним в них несколько значений.

Настоящие и зашифрованные.

Если они не совпадают, значит, их кто-то изменил извне.

И нам необходимо регулярно проверять эти изменения, что в нашем случае и делает детектор памяти.

Могут быть защищены как базовые типы (такие как float, int, string и т. д.), так и некоторые пользовательские (Vector2, Vector3, Color, Quaternion и т. д.).



Под стражей

Защита вашей игры, несомненно, важна.

И чтобы добиться этого максимально, нужно использовать несколько уровней защиты.

Однако всегда взвешивайте пользу и вред, ведь защита — это дополнительная нагрузка на устройства, а иногда и неудобства для конечного пользователя.

Второй вывод, хоть я и написал его во вводном разделе, все равно повторю.

Используйте клиент только для отображения ваших данных.

Реализовывать бизнес-логику и работать с данными на серверах, конечно, с учетом соотношения польза/вред. Спасибо за прочтение статьи.

Надеюсь, она оказалась для вас полезной, как и библиотека, которую я включил выше.

Удачи в ваших проектах.

И конечно, я буду рад с вами подискутировать.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Добавляете ли вы защиту в свои игры? 14.81% Локальный 4 25.93% Локальный + проверка на сервере 7 59.26% Нет 16 Проголосовали 27 пользователей.

23 пользователя воздержались.

Теги: #Разработка игр #разработка #unity #.

NET #шифрование #защита #защита данных #античат

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.