Как вы можете препятствовать появлению фиктивных высоких баллов в глобальном списке высоких баллов?

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

Мой вопрос сводится к следующему: как вы можете помешать кому-то подавать фиктивные высокие баллы? Или, заявив другим способом, как глобальный сервер с высоким рейтингом может быть уверен, что представленный балл действительно был создан запустить игру?

Чем больше я думал об этом, тем больше думаю, что это может быть неразрешимой проблемой.

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

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

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

Ответ 1

Для ПК-игры, где оценка создается клиентом, это не проблема, так как клиент по своей сути недостоверен.

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

Некоторые мысли:

  • Защитите оценку в памяти. Вы можете использовать API, например CryptProtectMemory, чтобы скрыть счет в памяти - простая запись в память не будет работать. Однако с прикрепленным отладчиком или путем ввода кода в ваш процесс они все равно могут изменить оценку. Вы можете изучить различные схемы для попыток победить отладчиков.

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

  • Подтвердите счет в службе. Мне было бы жалко этого делать, кроме очень простых проверок. Ошибка здесь приведет к тому, что вы отклоните действительные баллы. Невозможно провести различие между читерами и сильными игроками.

На этом этапе вам действительно нужно спросить себя, если инженерные усилия действительно того стоят. Что делать, если кто-то публикует неверный балл? Что вы на самом деле теряете? Я бы сделал минимум, чтобы защитить ребенка от простого script. I.e., не должны быть представлены ваши оценки:

http://myservice.com/submitscore.aspx?PlayerName=Michael&Score=999999999

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

Ответ 2

"Еще один вариант - отправить повтор игры с игроком... Это не решит проблему",

Действительно? Почему бы и нет?

"вам также нужно создать очень сложный повтор, который" доказывает "[счет]."

Вы предлагаете, чтобы кто-то мог подделать повтор? Выясните решение супер-высокого балла, фактически не играя в игру? Подделывать отметки времени и все такое? Потяните Дональд Кроухерст?

Почему бы не просто сыграть в игру, а попытаться подделать журнал игры?

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

Подумайте об этом так. Выберите любую игру или спорт. Кто-то говорит, что, скажем, Швейцария обыграла Новую Зеландию на гонке яхт. Вы бросили бы им вызов, пытаясь найти подробные сведения о месте проведения, лодках, командах и отдельных гонках, чтобы убедить себя, что это правда. Конечно, они могли подделать его, но если у них будет богатый набор деталей, охватывающих гонку, то... как это не "доказательство"?

Ответ 3

Насколько мне известно, это неразрешимо.

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

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

Ответ 4

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

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

Ответ 5

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

Проверьте исходный код Quake III Arena. Их версия была совершенно безупречной. К сожалению, я не помню ссылку сейчас.