Скачал DLC Инстинкт истребления к Atomic Heart и там невоспитанный гусь начал ругаться, обзывался даже пиздоблядской хлаёбиной . При этом догнать его и дать люлей не получилось. После этого на время была потеряна воля к написанию новых постов, но потом я вспомнил, что примерно так же мы называли читеров, которые атаковали один из наших проектов.
В общем будет несколько постов про античит меры, кратко расскажу какие есть способы и что от чего помогает. Тема громадная, поэтому какие-то моменты я буду опускать, но если что велком в комментарии с вопросами.
Главное, что нужно понимать и с чем сложно смириться — серебряной пули нет, все равно любую систему можно взломать. Единственное на что мы можем влиять — это сложность, на сколько игра или приложение устойчиво к взлому. Таким образом можно сильно сужать круг хацкеров, чтобы вам докучали только самые мотивированные и прокаченные по технической части оппоненты.
Почему вообще стоит бороться с хакерами? Потому, что они создают читы, активно их распространяют и которыми пользуются обычные игроки, превращаясь из платящих в не платящих или в целом не дают стать платящим игроком. Убытки от этого могут быть огромными.
Стоит ли в свою игру сходу имплементировать все, что мы обсудим — нет, только некоторые штуки. В новом проекте стоит же организовать некоторые вещи таким образом, чтобы потом было возможно накрутить нужный функционал. Конкретика будет походу.
И так, нас интересует две области — локальные меры в билде и защита сетевого трафика. Начнем с второго.
Незашифрованный запрос можно перехватить, подменить в нем данные и передать игре. Исходящие запросы тоже самое. Таким образом прощупывая чувствительную информацию можно влиять на поведение игры и сервера. Что можно сделать?
- Валидация запросов — здесь все понятно, это база, останавливаться на этом не будем.
- Шифрование запросов. Если у вас их много, то лучше шифровать часть запросов, которые содержат чувствительные данные. Делается это асимметричным способом, например, с помощью RSA. Сервер шифрует данные публичным ключом, клиент расшифровывает приватным и читает данные. В обратную сторону аналогично.
Тут возникает 2 проблемы:
1. Что если запросы очень объемные? Ассиметричные способы шифрования имеют свой минус — ими можно шифровать небольшие объемы. Тот же RSA ключ 2048 бит сможет зашифровать максимум 245 байт. Таким способом историю покупок не передать. Поэтому в подобных случаях нужно использовать гибридный способ шифрования. Данные шифруются симметричным алгоритмом, например, AES. Ключ от AES шифруется с помощью RSA и все передается в запросе. Чтобы расшифровать такой запрос, сначала распаковывается ключ с помощью RSA, затем с помощью AES расшифровывается контентная часть.
2. Где хранить приватный ключ в клиенте, чтобы его не нашли? Об этом в следующем посте, потому что речь в целом пойдет о локальной части игры.
Замечу в начале, что наиболее надежный способ защиты — это дублирование логики на сервере. До клиента добраться гораздо проще чем до сервера. Поэтому важную логику там нужно дублировать. Это относится к тому, что лучше делать в начале нового проекта и сразу выстраивать архитектуру соответсвенно. Если у вас так, то большая часть проблем вас не коснется.
#техничка@cat_and_code
В общем будет несколько постов про античит меры, кратко расскажу какие есть способы и что от чего помогает. Тема громадная, поэтому какие-то моменты я буду опускать, но если что велком в комментарии с вопросами.
Главное, что нужно понимать и с чем сложно смириться — серебряной пули нет, все равно любую систему можно взломать. Единственное на что мы можем влиять — это сложность, на сколько игра или приложение устойчиво к взлому. Таким образом можно сильно сужать круг хацкеров, чтобы вам докучали только самые мотивированные и прокаченные по технической части оппоненты.
Почему вообще стоит бороться с хакерами? Потому, что они создают читы, активно их распространяют и которыми пользуются обычные игроки, превращаясь из платящих в не платящих или в целом не дают стать платящим игроком. Убытки от этого могут быть огромными.
Стоит ли в свою игру сходу имплементировать все, что мы обсудим — нет, только некоторые штуки. В новом проекте стоит же организовать некоторые вещи таким образом, чтобы потом было возможно накрутить нужный функционал. Конкретика будет походу.
И так, нас интересует две области — локальные меры в билде и защита сетевого трафика. Начнем с второго.
Незашифрованный запрос можно перехватить, подменить в нем данные и передать игре. Исходящие запросы тоже самое. Таким образом прощупывая чувствительную информацию можно влиять на поведение игры и сервера. Что можно сделать?
- Валидация запросов — здесь все понятно, это база, останавливаться на этом не будем.
- Шифрование запросов. Если у вас их много, то лучше шифровать часть запросов, которые содержат чувствительные данные. Делается это асимметричным способом, например, с помощью RSA. Сервер шифрует данные публичным ключом, клиент расшифровывает приватным и читает данные. В обратную сторону аналогично.
Тут возникает 2 проблемы:
1. Что если запросы очень объемные? Ассиметричные способы шифрования имеют свой минус — ими можно шифровать небольшие объемы. Тот же RSA ключ 2048 бит сможет зашифровать максимум 245 байт. Таким способом историю покупок не передать. Поэтому в подобных случаях нужно использовать гибридный способ шифрования. Данные шифруются симметричным алгоритмом, например, AES. Ключ от AES шифруется с помощью RSA и все передается в запросе. Чтобы расшифровать такой запрос, сначала распаковывается ключ с помощью RSA, затем с помощью AES расшифровывается контентная часть.
2. Где хранить приватный ключ в клиенте, чтобы его не нашли? Об этом в следующем посте, потому что речь в целом пойдет о локальной части игры.
Замечу в начале, что наиболее надежный способ защиты — это дублирование логики на сервере. До клиента добраться гораздо проще чем до сервера. Поэтому важную логику там нужно дублировать. Это относится к тому, что лучше делать в начале нового проекта и сразу выстраивать архитектуру соответсвенно. Если у вас так, то большая часть проблем вас не коснется.
#техничка@cat_and_code
5🔥10👍2
А вы видели анонс третей части Мора? "Мор. Утопия."
Наконец-то можно будет обчисть все урны в городе за Данковского.
https://youtu.be/Zb0C2WYUjkI?si=1qZDqiLT57wsC3A_
Наконец-то можно будет обчисть все урны в городе за Данковского.
https://youtu.be/Zb0C2WYUjkI?si=1qZDqiLT57wsC3A_
YouTube
Pathologic 3 Announce Trailer
Pathologic 3. Coming 2025. Wishlist Now:
https://store.steampowered.com/app/3199650/
https://store.steampowered.com/app/3199650/
😁3
Мы небольшой командой работаем над артхаусным проектом о девочке, которая в силу обстоятельств подменяет маму на почте и разносит письма по деревне, называется А Горюшко вслед собакою… Действие игры проходит в военное время, но в мирной деревни в дали от фронта. История основана на реальных воспоминаниях главной героини. Проект уже давно томится и наверное мог бы потерять актуальность, если бы не был таким необычным по визуальному стилю и сюжету.
Даже странно писать это, но игра выйдет до нового года, Стим уже апрувнул билд, осталось только дочинить самыесамые-самые последние баги.
За время разработки проект по сто раз откладывался и вытаскивался из ящика. Бывало, что в ящик кладет один член команды, а чуть позже достает другой и продолжает пилить. Так вот и сейчас Николай допиливает баги, а другой тиммейт пишет посты в бложек и делает мотивирующие локальные мемы, чтобы поддержать команду.
Если игра понравится — добавьте в желаемое, нам это важно. Игра в Steam
#девлог
Даже странно писать это, но игра выйдет до нового года, Стим уже апрувнул билд, осталось только дочинить самые
За время разработки проект по сто раз откладывался и вытаскивался из ящика. Бывало, что в ящик кладет один член команды, а чуть позже достает другой и продолжает пилить. Так вот и сейчас Николай допиливает баги, а другой тиммейт пишет посты в бложек и делает мотивирующие локальные мемы, чтобы поддержать команду.
Если игра понравится — добавьте в желаемое, нам это важно. Игра в Steam
#девлог
11🔥12❤5👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Приятная викторина незадолго до Нового Года. Мы решили разыграть ключики от А Горюшко вслед собакою... на Steam. А также хотим познакомить вас с нашими каналами. Перешлите этот пост друзьям, которым будет интересно поучаствовать.
Разыгрываем 3 ключа, бот случайно выберет 3х участников, итоги будут тут на канале 28 декабря в 15:00.
Для участия подписаться на:
1. Кот и Код - здесь про разработку игр
2. Сволоч и Борщ - здесь про геймдизайн
3. Клик на кнопку “Участвовать”
Разыгрываем 3 ключа, бот случайно выберет 3х участников, итоги будут тут на канале 28 декабря в 15:00.
Для участия подписаться на:
1. Кот и Код - здесь про разработку игр
2. Сволоч и Борщ - здесь про геймдизайн
3. Клик на кнопку “Участвовать”
🔥9
Листал ленту, захотел поделиться каналом @tochno_kesha Автор сильно изворачивается с стилизацией под PS1 и пикселизацию припудрив щепоткой крипоты.
Ну и в целом не боится экспериментов, в подборке скринов на последних 2х, он распечатал uv-карту, затем раскрасил цветными карандашами и отсканировал обратно. Результат вау. Сколько всего интересного можно так сделать. Взял себе на вооружение, воспользуюсь когда захочется сделать что-то еще вроде нашего Марево
Ну и в целом не боится экспериментов, в подборке скринов на последних 2х, он распечатал uv-карту, затем раскрасил цветными карандашами и отсканировал обратно. Результат вау. Сколько всего интересного можно так сделать. Взял себе на вооружение, воспользуюсь когда захочется сделать что-то еще вроде нашего Марево
🔥9 1
Под конец года сделал на заказ достаточно интересного telegram-бота. Можно потыкать тут, запущен пока в тестовом режиме: @hot_workshop_bot
Примечательно, что боты это такая интересная помесь сервисов, сайтов и массы упрощений. Например, в данном боте воплощены некоторые стандартные для сайтов механизмы: время сессии, хранение обезличенной инфы во время сессии, отправка формы, выгрузка из бота файлов, мониторинг работы бота, баг репорты админам, а также "админка". То есть кроме пользовательского меню — есть еще одно админское, где можно заменить PDFку для скачивания и отредактировать информационные разделы.
По функционалу получается что-то вроде малюсенького корпоративного сайта, но прямо тут в мессенджере. Жесткое упрощение на верстку и все пляски с размещением сайта. Даже сервер необязателен (хотя в данном случае он есть). Все готовое.
Примечательно, что боты это такая интересная помесь сервисов, сайтов и массы упрощений. Например, в данном боте воплощены некоторые стандартные для сайтов механизмы: время сессии, хранение обезличенной инфы во время сессии, отправка формы, выгрузка из бота файлов, мониторинг работы бота, баг репорты админам, а также "админка". То есть кроме пользовательского меню — есть еще одно админское, где можно заменить PDFку для скачивания и отредактировать информационные разделы.
По функционалу получается что-то вроде малюсенького корпоративного сайта, но прямо тут в мессенджере. Жесткое упрощение на верстку и все пляски с размещением сайта. Даже сервер необязателен (хотя в данном случае он есть). Все готовое.
Кот и код
Приятная викторина незадолго до Нового Года. Мы решили разыграть ключики от А Горюшко вслед собакою... на Steam. А также хотим познакомить вас с нашими каналами. Перешлите этот пост друзьям, которым будет интересно поучаствовать. Разыгрываем 3 ключа, бот…
🎉 Результаты розыгрыша:
Победители:
1. Васс (@gvassel)
2. Андрей (@korka451)
3. Leonid (@savidiy)
Проверить результаты
Победители:
1. Васс (@gvassel)
2. Андрей (@korka451)
3. Leonid (@savidiy)
Проверить результаты
🎉7❤2🦄1
Кот и код
🎉 Результаты розыгрыша: Победители: 1. Васс (@gvassel) 2. Андрей (@korka451) 3. Leonid (@savidiy) Проверить результаты
И так, друзья, викторина состоялась. Поздравляем победителей, я напишу вам в личку.
Забавно, что я тоже тыкнул «Участвовать», чтобы проверить как оно работает вообще. Но я настолько никогда не выигрываю в викторинах, что не выиграл даже в своей викторине на 30 человек. С другой стороны хорошо, не пришлось объясняться как устроитель конкурса в нем же и победил🌚
Забавно, что я тоже тыкнул «Участвовать», чтобы проверить как оно работает вообще. Но я настолько никогда не выигрываю в викторинах, что не выиграл даже в своей викторине на 30 человек. С другой стороны хорошо, не пришлось объясняться как устроитель конкурса в нем же и победил
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11👾1
Спасибо всем, кто поддерживает посты реакциями. Отдельное спасибо тем, кто кидается звездами ⭐️
Telegram такая площадка, что нативного трафика тут нет, поэтому общение в постах происходит практический в том же узком кругу из треда в тред. Многих уже знаю по никам и аватаркам. Хочу узнать ваше мнение.
Мы тут на разные темы общаемся. Киньте в тред, что вам наиболее интересно в блоге? Например, технические посты из серии #техничка , #девлог, а может заметки про #игры или неважно что, просто интересно как кто-то живет своей технической жизнью. Почему вам вообще интересны такие микроблоги типа моего? Технические посты бывают занимают много времени на формулировки и написание, есть у меня ощущение, что может они нафиг не нужны.
Всех с наступающим, всем желаю понятных ошибок в коде в Новом году.🎄
Telegram такая площадка, что нативного трафика тут нет, поэтому общение в постах происходит практический в том же узком кругу из треда в тред. Многих уже знаю по никам и аватаркам. Хочу узнать ваше мнение.
Мы тут на разные темы общаемся. Киньте в тред, что вам наиболее интересно в блоге? Например, технические посты из серии #техничка , #девлог, а может заметки про #игры или неважно что, просто интересно как кто-то живет своей технической жизнью. Почему вам вообще интересны такие микроблоги типа моего? Технические посты бывают занимают много времени на формулировки и написание, есть у меня ощущение, что может они нафиг не нужны.
Всех с наступающим, всем желаю понятных ошибок в коде в Новом году.
Please open Telegram to view this post
VIEW IN TELEGRAM
74 16👍4❤2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Новогоднее настроение на любителя🎄
Потом расскажу, что за заяц такой
7🎄9❤1
Простых Telegram-ботов я делаю обычно в виде консольных приложений, потому, что им не нужны возможности WEB API. Чтобы потом такой консольный бот работал в линуксе в фоне, то нужно сделать service-файл для systemd - он отвязывает приложение от консоли и позволяет управлять им через systemctl. Так вот, когда в режиме написания драфта, чтобы приложение не вылетало по завершению, пишешь в Program.cs что-то вроде такой порнографии:
Такая конструкция способна загрузить незамысловатый проц на 100%, а например, Intel i7 11th Gen — процентов на 30%. Вот такая вот мелочь. Правильно делать выход через ивенты от системы, прокидывать токен для отмены в главные модули вашей программы:
Мораль — прибирайтесь вовремя, плохо не пишите, пишите хорошо.
#техничка
while (true)
{
var result = Console.ReadLine();
if (result != null && result.ToLower() == EXIT_COMMAND)
Environment.Exit(0);
}
Такая конструкция способна загрузить незамысловатый проц на 100%, а например, Intel i7 11th Gen — процентов на 30%. Вот такая вот мелочь. Правильно делать выход через ивенты от системы, прокидывать токен для отмены в главные модули вашей программы:
using var cts = new CancellationTokenSource();
AppDomain.CurrentDomain.ProcessExit += (_, _) =>
{
if (!cts.IsCancellationRequested)
cts.Cancel();
};
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cts.Cancel();
};
Мораль — прибирайтесь вовремя, плохо не пишите, пишите хорошо.
#техничка
👍13 2🤔1🫡1
Планирую сходить на митап Индикатор Шрёдингера.
Проходит в Москве 18.01 (суббота) рядом с метро Преображенская площадь. Мне нравятся такие небольшие мероприятия, тут все сразу - нетворкинг, лекции и мое любимое — шоукейсы-плейтесты. В том числе можно залететь спикером или со своей игрой, подробнее что где как: https://news.1rj.ru/str/gamedev_moscow/619
Интересно, есть ли кто-то из присутствующих в МСК и может пойдет? Отпишите в комментах)
#события@cat_and_code
Проходит в Москве 18.01 (суббота) рядом с метро Преображенская площадь. Мне нравятся такие небольшие мероприятия, тут все сразу - нетворкинг, лекции и мое любимое — шоукейсы-плейтесты. В том числе можно залететь спикером или со своей игрой, подробнее что где как: https://news.1rj.ru/str/gamedev_moscow/619
Интересно, есть ли кто-то из присутствующих в МСК и может пойдет? Отпишите в комментах)
#события@cat_and_code
Telegram
Индикатор Шрёдингера (Москва)
Первый митап в 2025 году!
Приглашаем всех на мероприятие!
18 января в 14:00 встретимся для нетворкинга и обмена опытом по адресу Большая Черкизовская улица, 4к1, РГБМ • Библиотека для молодёжи.
Вас ждут:
• Лекции о геймдеве;
• Плейтесты;
• Круглый стол…
Приглашаем всех на мероприятие!
18 января в 14:00 встретимся для нетворкинга и обмена опытом по адресу Большая Черкизовская улица, 4к1, РГБМ • Библиотека для молодёжи.
Вас ждут:
• Лекции о геймдеве;
• Плейтесты;
• Круглый стол…
🔥8👍1
Media is too big
VIEW IN TELEGRAM
Если бы в 1994 году плейстейшен 1 придумали бы в России, то возможно, игры на ней были бы какие-то такие.
«Неясное» — настоящая панельная хтонь, симулятор ходьбы. Проходить его тленно и угарно одновременно. По сюжету, вы сможете сгонять в центр из своего панельного спальника и обратно. Вам предстоит зайти в аптеку, кебаб, дискотеку, выставку, книжный магазин и некоторые другие места (стоит исследовать локации). Много классных диалогов и максимально всратая озвучка, которая подходит просто прекраснои немного напоминает переводы от Фаргуса. Скриншотов тут бы не хватило, сделал небольшую нарезку с прохождения, возможны спойлеры.
Cкобки ( . . . ) { . . . } — это текстовые облака. Интересно, почему мне заходят такие опусы, когда есть нормальные игры? Пусть живет на канале по тегу #игры@cat_and_code
«Неясное» — настоящая панельная хтонь, симулятор ходьбы. Проходить его тленно и угарно одновременно. По сюжету, вы сможете сгонять в центр из своего панельного спальника и обратно. Вам предстоит зайти в аптеку, кебаб, дискотеку, выставку, книжный магазин и некоторые другие места (стоит исследовать локации). Много классных диалогов и максимально всратая озвучка, которая подходит просто прекрасно
Cкобки ( . . . ) { . . . } — это текстовые облака. Интересно, почему мне заходят такие опусы, когда есть нормальные игры? Пусть живет на канале по тегу #игры@cat_and_code
10🔥10 7❤5👍1
Задача на работе навеяла мысли о том, что не плохо было бы продолжить тему про античиты. Первая часть — тут.
Читерские трейнеры работают по принципу: "сделай действие → проанализируй данные → повторяй для уточнения данных". Современные читерские инструменты стали достаточно умными: они умеют анализировать код игры в оперативной памяти, распознавать операции шифрования, находить закономерности и эксплуатировать их. Вот таким штукам мы противостоим. Наша задача — создать непредсказуемые механизмы, которые усложнят процесс взлома.
Важно понимать, 100% способа защититься локально нет. Но можно накрутить разные уловки, которые будут усложнять взлом игры и таким образом повысить шансы хакера-энтузиаста сдуться раньше чем он достигнет успеха. И так, вот какие механизмы есть:
- Обфускация билда затрудняет декомпиляцию и анализ, делая код непонятным даже после распаковки. Имена классов, методов и полей заменяются на случайные символы. В код вставляются ложные зависимости, "мусорные" функции и некоторые другие вещи для усложнения анализа.
- Также в коде нужно избегать названия классов, свойств, полей итд, которые могут как-то отсылать к системе дешифрования и другим важным данным. Например, названия типа "RSAPrivateKey". Почему это важно? Потому, что даже у обфусцированного билда можно прочитать данные из оперативки во время выполнения.
- Хранить важные данные в зашифрованном виде. Например, если вы храните в билде ключ RSA — он имеет свою сигнатуру, его можно найти по ней. Поэтому ключ можно хранить в виде пропущенном через другую функцию шифрования и под солью 🤔
- Чтобы помешать трейнерам понять, что и как у вас происходит — нужен механизм который который будет обеспечивать отсутствие немедленного отклика на изменение данных. Это задержки и динамическая криптография. Сделать систему, которая не будет напрямую зависеть от действий пользователя, но будет делать дешифровку и шифрование важных данных новыми ключами достаточно часто. Тут важно чтобы ключи были каждый раз новые, и чтобы это происходило в непредсказуемые моменты времени. Это относится и к хранению и приватного ключа. Он как бы хранится в оперативной памяти, но все время перешифровывается и перемещается по ней. Таким образом, даже если злоумышленник "заморозил" память, ключ перестанет быть актуальным через несколько секунд.
#техничка@cat_and_code
Читерские трейнеры работают по принципу: "сделай действие → проанализируй данные → повторяй для уточнения данных". Современные читерские инструменты стали достаточно умными: они умеют анализировать код игры в оперативной памяти, распознавать операции шифрования, находить закономерности и эксплуатировать их. Вот таким штукам мы противостоим. Наша задача — создать непредсказуемые механизмы, которые усложнят процесс взлома.
Важно понимать, 100% способа защититься локально нет. Но можно накрутить разные уловки, которые будут усложнять взлом игры и таким образом повысить шансы хакера-энтузиаста сдуться раньше чем он достигнет успеха. И так, вот какие механизмы есть:
- Обфускация билда затрудняет декомпиляцию и анализ, делая код непонятным даже после распаковки. Имена классов, методов и полей заменяются на случайные символы. В код вставляются ложные зависимости, "мусорные" функции и некоторые другие вещи для усложнения анализа.
- Также в коде нужно избегать названия классов, свойств, полей итд, которые могут как-то отсылать к системе дешифрования и другим важным данным. Например, названия типа "RSAPrivateKey". Почему это важно? Потому, что даже у обфусцированного билда можно прочитать данные из оперативки во время выполнения.
- Хранить важные данные в зашифрованном виде. Например, если вы храните в билде ключ RSA — он имеет свою сигнатуру, его можно найти по ней. Поэтому ключ можно хранить в виде пропущенном через другую функцию шифрования
- Чтобы помешать трейнерам понять, что и как у вас происходит — нужен механизм который который будет обеспечивать отсутствие немедленного отклика на изменение данных. Это задержки и динамическая криптография. Сделать систему, которая не будет напрямую зависеть от действий пользователя, но будет делать дешифровку и шифрование важных данных новыми ключами достаточно часто. Тут важно чтобы ключи были каждый раз новые, и чтобы это происходило в непредсказуемые моменты времени. Это относится и к хранению и приватного ключа. Он как бы хранится в оперативной памяти, но все время перешифровывается и перемещается по ней. Таким образом, даже если злоумышленник "заморозил" память, ключ перестанет быть актуальным через несколько секунд.
#техничка@cat_and_code
Please open Telegram to view this post
VIEW IN TELEGRAM
🍓8 5❤3🔥3😁1