Вопрос

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

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

  1. Используйте ОС для блокировки всех файлов ресурсов для записи, когда процесс запускается, поэтому никакие другие процессы не могут перезаписать файлы после факта.
  2. Рассчитайте суммы MD5 каждого файла ресурсов.
  3. Подключитесь к серверу HTTPS, требуя проверки против определенного подписанного сертификата, хранящегося в исполняемости клиента.
  4. Загрузите файл через HTTPS, содержащие «правильные» хеши, хранящие его в RAM (не на диск).
  5. Сравните вычисленные хеши к полученным через HTTPS.
  6. Выйдите, если хэши не совпадают.

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

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

Теперь, предоставило, что я только что описал два параграфа назад, как потенциально атаковать схему, которую я разработал: есть ли способ, кроме того, что я описал, чтобы атаковать эту схему?

Мой второй вопрос в том, что является бесплатным (как в библиотеке бесплатной или свободы), которую можно назвать от Win32 C ++ (Compiler Visual Studio 2010) для выполнения этих задач? Могут ли они быть сделаны со встроенным API для Windows или требуется третье решение?

Таким образом, в резюме вопросов: 1. Является ли схема, которую я предложил достаточно крепко, чтобы перегореть большинство скриптов детей; и 2. Какие зависимости или библиотеки я буду использовать для его реализации?

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

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

Спасибо!

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

Решение

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

Библиотеки Win32 наиболее подходят для вашей задачи, являются Windows Crypto API. для хеширования. Он также поддерживает SHA-1, что я бы порекомендовал (поскольку MD5 считается уязвимым и трещительным в эти дни). Вы также можете посмотреть с использованием HMAC с SHA1, так что рассчитанный хэш включает в себя секретный ключ (встроенный в код).

Винил это подходящая библиотека для скачивания. Я считаю, что он поддерживает HTTPS с проверкой сертификата.

API Windows Createfile. Для открытия файла можно по сути блокировать файлы содержимого. Просто откройте все файлы, не указав файл_share_ * flags.

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

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

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

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

bool IsContentValid()
{
   // compare the local hash with the hash returned from the https response
   return (0 == memcmp(local_hash, network_hash, sizeof(HASH)));
}

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

Один очевидный обходной путь состоит в том, чтобы иметь разные варианты этой функции, связанной с различными областями игрового кода и периодически называются во время игры. Реализуйте эту проверку с помощью макроса #define C вместо функции. Реализуйте 10 различных вариантов кода как 10 различных макросов. Назовите эти макросы в 50 различных местах кода - так, что хакер должен найти их все (и исправлять их), чтобы добиться успеха. Сделайте так, что если контент считается недействительным, игра ведет себя багги. Например, если его файлы содержимого недействительны, здравоохранение игрока и боеприпасы и боеприпасы игрока случайно отправляются в нулю, что он просто убить!

2) Захватываю игру чаще (каждые несколько месяцев), даже если нет никаких причин для других, чем для генерации новых хэшей контента, и новая макет EXE - это другая защита, которая покупает время. Представьте себе каждый месяц, который вы исправляете игру и просто обновите алгоритм хеширования Crypto и несколько небольших настроек к контенту. Хакер, который выпустил оригинальную трещину, должен начать снова. Это займет его время и больше времени, чтобы распространять его обновленную трещину, если он снова успешен.

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

4) Еще один Cheyzy Hack Time Time: проверьте хеш Exe, а также содержимого (как локально, так и в сети).

5) Используйте еще один хеш контента и exe, чтобы быть простым ключом Crypto для цифровой подписи всех сетевых сообщений на сервер. Вы можете просто добавить в сетевое сообщение: your_simple_fash_hash (content_hash, exe_hash, network_message). Сервер делает то же самое для всех полученных сетевых сообщений. Реализуйте разные версии этого кода HASH / Signature для различных типов сетевых сообщений. Посмотрите Шармур как быстрый хеш-функция пример. Теперь хакер должен взломать сетевой код тоже!

6) Хакеру усердно разбирать свой игровой код, используя Softice или любой другой отладчик ядра. Любые переменные, используемые для хранения хэшей проверки контента (или любых клавиш Crypto), также должны быть зашифрованы. Один Cheezy Protection - XOR все важные переменные с 0xAAAAAAAAA (или какой-то другой шум) при хранении их в оперативной памяти. Когда вам необходимо использовать эти значения, XOR обратно в TEMP VAR, используйте их Approprait, затем отбрасывают результат, как только вы закончите с вычислением. В дополнение к содержимому файловые хэши, переменные для игроков здоровья, топлива и боеприпасов и боеприпасов.

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

Хорошо, это мозг свалка. Больше, чем я люблю писать для кого-то, что имеет только 1 пункт репутации на Stackoverflow. Я надеюсь, что это помогает.

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