Як захистити свою гру за допомогою ключа / серійного номера CD?


25

Тому я вирішив, що хочу захистити піратські копії моєї гри XNA від доступу до офіційних ігрових серверів (які модеруються, щоб люди, які заплатили за гру, отримають найкращий досвід), відключаючи клієнтів із неправильним або генерованим, дублюючим чи забороненим CD клавіші (або серійні номери, оскільки гра є цифровою, а компакт-дисків взагалі немає).

Як отримати цю систему захисту серійних номерів у свою гру (як клієнти, так і основний сервер автентифікації), тому це не так легко зламати?


Зауважте, що я не маю досвіду створення гарного захисту такого типу програмного забезпечення.

Я ніколи цього не робив, але розумію основи. Я бачу, чому я не можу перевірити ключ перевірки клієнта, тому мені добре використовувати автентифікацію входу / проходу з одноразовим введенням ключа.

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

Оскільки зламати клієнта занадто просто, я збираюся захистити лише процедури первинної реєстрації (і, можливо, аутентифікації на стороні сервера), тому ніхто не може вкрасти ключі під час їх передачі.


Дивись також:

Як мультиплеєрні ігри мають поводитися з аутентифікацією?


Якщо хтось заперечує, я очікую принаймні коментар про те, що не так у питанні. Хлопці, справді, я хочу, щоб моє запитання було добре і допомагало більше людей, а не тільки мені.
користувач1306322

4
Я здогадуюсь, що це була автоматична реакція на додавання DRM. Цей тип не особливо поганий, але багато з нас мають поганий досвід з ним - наприклад, коли Spore замурував мою установку Windows.
Ізката

Замість ключа CD ви розглядали підхід, схожий на MMO / Minecraft, як вимагати ім’я користувача / пароля для входу в систему та використовувати його для автентифікації користувачів?
Тетрад

4
Хочете DRM в додатку .NET !? Зрештою, це не вдасться з такими інструментами, як Reflector. Погляньте на Terraria. Розвиток припинився через піратство (і чималий дохід ...). Мені подобається ідея, заснована на аутентифікації @ Tetrad, оскільки вона заважає людям просто не робити латку функції перевірки. Зберігайте всі дані на своєму сервері, і коли їх вхід буде успішним, подайте їм свої дані. Якщо ви зберігаєте дані локально, вони можуть просто виправити функцію аутентифікації.

2
@Anko це було посиланням на відому цитату "Нам потрібно більше корисних копалин" . І я маю на увазі факти та експертизу. Можливо, навіть докладно. Я б не знав, коли важливій проблемі було приділено достатньо уваги, я просто відчув, що є що додати, і відвідувачі сайту можуть вважати цю тему цікавою (і, можливо, стати новими користувачами), тому я підняв щедрості.
user1306322

Відповіді:


24

В основному у вас є три вимоги:

  1. використовувати один ключ для декількох екземплярів клієнта не повинно бути просто,
  2. генерувати нові дійсні ключі не повинно бути просто
  3. викрасти ключ законного клієнта не повинно.

Перша частина повинна бути досить простою: просто не дозволяйте двом гравцям одночасно входити в один сервер одним ключем. Ви також можете змусити сервери обмінюватися інформацією про зареєстрованих користувачів або звертатися до спільного сервера автоматизації, так що навіть використання одного і того ж ключа для різних гравців на різних серверах одночасно не вдасться. Ви також, ймовірно, захочете шукати підозрілі зразки використання ключів, і, якщо визначите, що ключ просочився, додайте його до списку заборонених ключів.


У другій частині один із способів - просто підтримувати базу даних усіх дійсних виданих ключів. Поки ключі досить довгі (скажімо, 128 біт або більше) та вибрані випадковим чином (використовуючи захищений RNG), шанси тих, хто вдається вгадати дійсний ключ, по суті дорівнюють нулю. (Навіть набагато більш короткі клавіші можуть бути безпечними, якщо ви використовуєте якесь обмеження швидкості для невдалої спроби входу, щоб зупинити спроби знайти дійсні ключі грубою силою.)

Крім того, ви можете генерувати ключі, взявши будь-який унікальний ідентифікатор і додавши до нього код автентифікації повідомлення (наприклад, HMAC ), обчислений за допомогою секретного головного ключа. Знову ж таки, поки MAC достатньо довгий, шанси кожного, хто не знає, що головний ключ зможе вгадати дійсний MAC для будь-якого ідентифікатора, незначний. Однією з переваг цього методу, крім усунення потреби в базі даних ключів, є те, що ідентифікатором може бути будь-яка унікальна рядок і може кодувати інформацію про клієнта, для якого був виданий ключ.

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


У третій частині, один підхід полягає в тому, щоб переконатися, що клієнт не надсилатиме свій ключ нікому, не перевіряючи, що одержувач справді є законним офіційним сервером. Наприклад, ви можете використовувати SSL / TLS (або DTLS ) для процесу входу, видавати спеціальні сертифікати для своїх ігрових серверів і лише видавати клієнтські довірені сертифікати. Зручно, використання TLS також захищатиме клієнтські ключі (та будь-які інші дані про автоматизацію) від підслуховувачів, наприклад, у загальнодоступних локальних мережах.

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

Крім того, ви можете видавати своїм клієнтам справжні сертифікати клієнта або щось подібне до них. Ви можете або використовувати існуючий протокол (наприклад, TLS), який підтримує автентифікацію клієнтських сертифікатів (рекомендується), або реалізувати свій власний, наприклад, такий:

  • Клієнтський сертифікат складається з довільної рядка ідентифікатора, пари відкритого / приватного ключів та цифрового підпису ідентифікатора та відкритого ключа за допомогою головного ключа.
  • Для входу в систему клієнт надсилає свої посвідчення особи, відкритий ключ та підпис. Сервер відповідає за допомогою унікальної рядка виклику (бажано, включаючи ідентифікатор сервера та часову позначку, яку клієнт повинен перевірити), яку клієнт підписує приватним ключем (щоб довести, що він знає ключ) та відправляє підпис серверу.
  • Сервер перевіряє обидві підписи, доводячи, що відкритий ключ ID + утворює законний клієнтський ключ (оскільки вони були підписані головним ключем) і що клієнтський ключ фактично належить клієнту (оскільки клієнт може підписати виклик сервера приватним ключ).

(Цей протокол можна додатково спростити, змусивши клієнта створити "виклик", що складається з ідентифікатора сервера та часової позначки, і підписати його. Звичайно, сервер повинен перевірити, чи є ідентифікатор і часова мітка дійсними. Також зауважте, що цей простий протокол, сам по собі, не перешкоджає зловмиснику не мати змоги захопити клієнтський сеанс, хоча це заважатиме їм отримати приватний ключ клієнта, необхідний для майбутніх входів.)


2
Один незначний момент - хоча абсолютно випадковий ключ забезпечує максимальне простір клавіш (і цілком працездатний, якщо ви перевіряєте базу даних виданих ключів), це не є зручним для користувачів. Покладіть деяку перевірку в сам ключ, щоб більшість помилок потрапили перед тим, як спробувати потрапити на сервер.
Лорен Печтел

Думаю, у @LorenPechtel є сильний момент щодо зручності використання ключа, і платний користувач випадково набрав і надіслав на сервер "неправильно введений / помилковий помилку" (помилку написання) на сервер.
Вишну

@Vishnu Я знаю, як користувач, який вводить ключі, я б вважав за краще мати інформацію про перевірку для кожної групи, навіть якщо це означало введення більш тривалого ключа.
Лорен Печтел

16

На 100% економії немає, але ви можете почати з досить простого підходу:

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

  • Необов’язково (але рекомендується) існуватиме серверна база даних, яка б підтверджувала ключі з базою даних усіх виданих ключів, щоб ви не могли генерувати ключі, навіть якщо у вас є алгоритм (ігноруйте грубе посилення).

Звідти ви можете мати два різних підходи, але в будь-якому випадку щось дуже важливе:

  • Не підтверджуйте ключ на стороні клієнта. Це дуже важливо, оскільки насправді досить легко декомпілювати матеріали, написані на .net / XNA. Якщо вам потрібно попросити ключ або передати його (логін або реєстрація) хеш-ключ (з доданою сіллю тощо) та надішліть його на сервер.

Що стосується фактичних шляхів:

  • Потрібно надіслати хешований ключ (див. Вище) під час процедури автентифікації / входу.

  • Як альтернатива (IMO - кращий, хоча багатьом не подобається такий тип "DRM"): Не використовуйте ключ у клієнті взагалі. Натомість вимагайте, щоб користувач увійшов до облікового запису та вимагав дійсний ключ CD (для цього потрібна база даних, згадана вище) для створення облікових записів. Так справляються з цим сучасні ігри, наприклад, будь-які MMORPG з оплатою.

Особисто я хотів би скористатися підходом до облікового запису через просту причину: Зрештою, ви не можете утримати людей від крадіжок ключів компакт-дисків (грубої сили, зворотної інженерії чи шахрайства). Як такі люди могли просто створити новий ключ, щоб продовжувати грати або виключати інших із гри. За допомогою ключів, прив'язаних до облікового запису, ніхто не може нічого робити з ключем, який вже використовується. Якщо хтось придбав ключ, який створив хтось інший, ви все одно можете передати право власності на акаунт, вважаючи, що для цього є достатній доказ.


2
Замість стандартних контрольних сум вам слід використовувати криптографічно захищений алгоритм хешування. Ви можете зберігати приватний ключ на сервері і давати клієнту відкритий ключ, і тоді ви знаєте, що без доступу до сервера система захищена.
Адам

@Adam: Використання криптографічно захищеного алгоритму хешування забезпечить зловмисникам не змогу генерувати дійсні ключі, але проблема не менш вирішена органом, відповідальним за роздачу законних ключів. Незважаючи на те, що проста контрольна сума не є надто безпечною, односторонні функції в цьому контексті нежиттєздатні.
Маркс Томас

Ну, ви можете комбінувати і те, і інше, наприклад, зробивши першу частину ключа випадковою комбінацією символів, а другу половину хешами. Кожен, хто продає гру, не міг би використовувати keygen (хіба що існує спосіб запобігти зіткненням / конфліктам, як-от "ідентифікатор постачальника" як частина ключа).
Маріо

1

Pangea Software - творець кількох ігор Mac - написав тему про захист від копіювання у своїй (зараз безкоштовній) книзі з розвитку ігор. Книга також пояснює, як поводитися з піратськими ключами та іншими хаками, якими користуються люди. Книга зосереджена на розробці ігор Mac, але ідеї все ще можуть бути корисні для інших платформ. До книги додається вихідний код для кожної глави, частина завантаження нижче. Також є вихідний код (написаний на С), пов'язаний із захистом від копіювання.

Книгу можна завантажити тут .


Я не зміг знайти нічого корисного в цих книгах.
користувач1306322

Особисто я хоч у главі 16 мав кілька приємних порад, але YMMV.
Вольфганг Шрьорс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.