Безопасные списки рекордов онлайн для не-веб-игр - PullRequest
24 голосов
/ 25 августа 2008

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

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

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

Ответы [ 10 ]

39 голосов
/ 28 сентября 2008

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

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

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

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

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

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

6 голосов
/ 25 августа 2008

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

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

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

5 голосов
/ 29 августа 2008

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

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

5 голосов
/ 25 августа 2008

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

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

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

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

3 голосов
/ 25 августа 2008

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

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

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

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 28 сентября 2008

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

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

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


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

2 голосов
/ 29 августа 2008

@ Martin.

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

2 голосов
/ 25 августа 2008

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

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

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

1 голос
/ 23 декабря 2012

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

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

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

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

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

...