Безопасные онлайн-списки рекордов для несетевых игр

StackOverflow https://stackoverflow.com/questions/25999

  •  09-06-2019
  •  | 
  •  

Вопрос

Я играю в нативную (не веб-) однопользовательскую игру, которую пишу, и мне пришло в голову, что наличие ежедневной/еженедельной/постоянной онлайн-список рекордов (подумайте о таблице лидеров Xbox Live) сделало бы игру намного интереснее, добавив некоторое (небольшое) количество сообщества и конкуренции.Однако боюсь, что люди увидят такую ​​функцию, как приглашение на взлом, что будет отпугивать постоянных игроков из-за невозможно высоких результатов.

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

Вы когда-нибудь создавали онлайн-список рекордов или таблицу лидеров?Нашли ли вы достаточно защищенный от хакеров способ реализовать это?Если да, то как вы это сделали?Каков ваш опыт попыток взлома?

Это было полезно?

Решение

В конце концов, вы полагаетесь на доверие клиента.Если клиент отправляет повторы на сервер, достаточно легко воспроизвести или изменить успешное прохождение и отправить его на сервер.

Лучше всего поднять планку мошенничества выше той, которую игрок считает стоящей преодолеть.Чтобы сделать это, вы можете использовать ряд проверенных (но часто не упоминаемых) методов:

  1. Оставьте мошенников из черного списка в приманке.Они могут видеть свои собственные результаты, но никто другой не может.Если они не подтвердят это, войдя в систему под другой учетной записью, они будут считать, что успешно взломали вашу игру.
  2. Если кого-то помечают как мошенника, отложите любые последствия для учетной записи до определенного момента в будущем.Сделайте эту точку случайной, в течение одного-трех дней.Обычно мошенник пробует несколько методов и в конечном итоге добивается успеха.Откладывая отзыв о статусе аккаунта на более поздний срок, они не понимают, что их поймало.
  3. Захватывайте все пользовательские команды игры и отправляйте их на сервер.Сверьте их с другими оценками в пределах данной дельты.Например, если игрок использовал действие броска 200 раз, но набрал 200 000 очков, но соседние игроки в игре выстрелили 5 000 раз, чтобы получить 210 000 очков, это может активировать порог, который помечает человека для дальнейших или человеческих действий. расследование.
  4. Повысьте ценность и постоянство своих учетных записей пользователей.Если в ваших учетных записях есть возможности, которые можно разблокировать для вашей игры, или если ваша игра требует покупки, вес запрета будет выше, поскольку пользователь не может восстановить свой предыдущий статус учетной записи, просто создав новую учетную запись через веб-прокси.

Другие советы

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

  • Отправьте дополнительную информацию вместе с запросами на высокий балл для проверки на стороне сервера.Если вы получаете 5 очков за каждый X, а игра содержит только 10 X, то у вас есть несколько дополнительных препятствий, через которые хакер должен пройти, чтобы его результат был принят как действительный.
  • Пусть сервер отправит случайный запрос, который должен быть встречен несколькими байтами двоичного файла игры от этого смещения.Это означает, что хакер должен хранить нетронутую копию двоичного файла (еще немного больше проблем).
  • Если у вас есть лицензионные ключи, потребуйте для их включения высоких баллов, чтобы вы могли заблокировать людей, уличенных во взломе системы.Это также позволяет отслеживать недействительные попытки, как определено выше, чтобы запретить людям тестировать протокол еще до того, как они представят действительный результат.

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

Честно говоря, я не думаю, что это возможно.

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

Есть некоторые довольно грустные люди, которые также оказываются довольно умными, если вы не сможете их всех уложить, это безнадежное дело.

Если в вашей игре есть встроенная система повторов, вы можете отправить повторы на сервер, и сервер подсчитает счет на основе повтора.

Этот метод не идеален, вы все равно можете схитрить, замедлив игру (если она основана на действиях) или написав бота.

Кое-что из этого я проделывал со своими флеш-играми, и на самом деле это проигрышная битва.Особенно для ActionScript, который можно без особых усилий декомпилировать в более читаемый код.

Я использую довольно традиционный подход: счет и имя игрока отправляются в виде обычного текста, а затем их хэша (правильно соленого).Очень немногие люди достаточно решительны, чтобы приложить усилия, чтобы понять это, а те немногие, кто есть, все равно сделают это, сведя на нет все время, которое вы потратили на это.

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

Одна вещь, которая может быть весьма эффективной, — это заставить игру отправлять счет на сервер несколько раз во время игры, каждый раз отправляя немного игровой информации, позволяя вам проверить, является ли счет «реалистичным».Но на самом деле это может быть немного чересчур.

Это действительно сложный вопрос.

Я никогда не реализовал такую ​​вещь, но вот простое приближение.

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

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

Шифрование не поможет решить проблему.Видите ли, шифрование помогает защитить данные в пути, но оно не защищает ни одну из сторон транзакции до того, как данные будут зашифрованы (в этом и может быть основная уязвимость).Поэтому, если вы зашифруете данные, данные останутся конфиденциальными, но не будут в безопасности.

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

  1. Допустим, счет равен некоторому числу m.
  2. Вычислите какую-нибудь проверку оценки (например, CRC или любую другую систему, которую вы видите.На самом деле, если его просто изобрести, то каким бы убогим он ни был, он будет работать лучше)
  3. Получите закрытый ключ пользователя (D) со своего удаленного сервера (очевидно, через защищенное соединение).Ты единственный, кто знает этот ключ.
  4. Вычислите X=m^D mod n (n — открытый модуль вашего алгоритма открытого/закрытого ключа) (то есть зашифруйте его: P)

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

Если вы используете это в сочетании с обфускацией, я бы сказал, что взломать это будет сложно.Тем не менее, даже это можно реализовать методом обратного проектирования, все зависит от интереса и способностей хакера, но...серьезно, какой урод затрачивает столько усилий, чтобы изменить свои результаты в игре?(Если только это не WoW или что-то в этом роде)

Последнее замечание

Обфускатор для .NET

Обфускатор для Delphi/C++.

Обфускатор для ассемблера (x86)

Как говорится в другом ответе, вы вынуждены доверять потенциально вредоносному клиенту, и для небольшой игры будет достаточно простого сдерживающего фактора и небольшого человеческого контроля.

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

В конце концов, речь по-прежнему идет о том, чтобы сделать его достаточно дорогим, чтобы препятствовать мошенничеству на табло.Вам нужна система, в которой вы всегда можете улучшить (более простой в обновлении) серверный код, чтобы противостоять любым новым атакам на вашу систему проверки.

@Мартин.

Я считаю, что именно так работает Mario Kart Wii.Дополнительным бонусом является то, что вы можете позволить всем остальным игрокам посмотреть, как обладатель рекорда получил высокий балл.Самое смешное, что если вы проверите самый быстрый "Ворчун Вулкан" Проследив время, вы увидите, что кто-то нашел ярлык, позволяющий пропустить 95% трека.Я не уверен, что они до сих пор считают это самым быстрым временем.

Вы не можете сделать это на недоверенной клиентской платформе.На практике можно победить даже некоторые «доверенные» платформы.

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

Другие методы, описанные выше, могут помочь, но не решают основную проблему работы на недоверенной платформе.


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

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

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

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

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

Если что-то не может найти античит-система, пользователи это найдут.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top