Сведения о вопросе

krutoi

18:46, 16th August, 2020

Теги

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

Просмотров: 466   Ответов: 10

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

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

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



  Сведения об ответе

VCe znayu

10:04, 15th August, 2020

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

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

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


  Сведения об ответе

lesha

22:14, 29th August, 2020

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

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

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


  Сведения об ответе

SKY

23:54, 3rd August, 2020

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

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

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


  Сведения об ответе

piter

10:15, 29th August, 2020

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

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


  Сведения об ответе

nYU

22:55, 10th August, 2020

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

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

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

Одна вещь, которая может быть довольно эффективной, - это то, что игра отправляет счет на сервер несколько раз, когда вы играете, отправляя каждый раз немного информации о геймплее, позволяя вам проверить, является ли счет "realistic". Но это может быть немного over-the-top на самом деле.


  Сведения об ответе

KOMP

17:50, 23rd August, 2020

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

Я никогда не реализовывал такую вещь, но вот простой пример.

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

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

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

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

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

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

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

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

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

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

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


  Сведения об ответе

DAAA

08:14, 4th August, 2020

@Martin.

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


  Сведения об ответе

SEEYOU

11:55, 5th August, 2020

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

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

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


  Сведения об ответе

screen

09:45, 9th August, 2020

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

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

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


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


  Сведения об ответе

LAST

05:22, 11th August, 2020

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться