Запобігання багатокористувацького обману


10

Я майже закінчую розробку невеликої багатокористувацької гри в стилі Інді. Хоча я маю намір дозволити людям обманювати в одиночному гравці, це, очевидно, неприйнятно для багатокористувацьких гравців. Хтось знає якісь способи допомогти зупинити середнього Джо від використання чогось типу Cheat-Engine для зміни частин гри? В даний час я планую, щоб клієнт завантажував хеш MD5 кожного файлу налаштувань, який гра використовує (зберігається як XML) на ігровий сервер для перевірки кожні кілька секунд, але чи можу я щось зробити, щоб зупинити такі речі, як редактори пам'яті тощо ?


2
Я рекомендую цю статтю, Створення мультиплеєрних ігор - Безпека написана для деяких мультиплеєрних API, але ідеї хороші і все ще застосовуються
Cyral

Відповіді:


8

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

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

Отже, питання в тому, як середній "середній Джо"? Ви вже згадували редагування коду та редактори пам'яті. Це вище того, що я б особисто вважав середнім рівнем, і якщо ви хочете турбуватися про цей рівень, тоді потрібен окремий надійний сервер, який виконує всі важкі підйоми, і клієнт перейде до фактично просто пристроїв відображення та введення даних.


2
@ user185812: Зазвичай, корисно почекати принаймні кілька годин, перш ніж відмітити прийняту відповідь. Хоча особисто я вважаю, що моя відповідь є досить великою (я упереджена), інші, ймовірно, матимуть більше вкладів, хоча бачення прийнятої відповіді досить часто є стримуючим фактором для відповіді.
Меттью Шарлі

@MatthewScharley - ніяких турбот. ;)
Мартін Сойка

11

Клієнт перебуває в руках ворога. ( Закони онлайн-дизайну світу )

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

Це не зупинить автоматизацію, і це не зупинить пасивний збір та аналіз інформації, але ви можете спроектувати свою гру такою, щоб вона не мала суттєвого впливу.

Це не зупинить людей, що хамуть один одного за допомогою неправильно сформованих повідомлень, на які покладається сервер - ваш клієнт повинен захищати від повідомлень із сервера так само, як ви б захищали ваші веб-сайти від атак ін'єкцій SQL.

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

Пропоноване читання:


2

У базовій багатокористувацькій грі обман у роді Cheat-Engine просто не буде працювати. Клієнти лише надсилають дані та ті дії, які ви їх створили. Зазвичай це не набагато більше, ніж те, що гравець "зробив", наприклад, в якому напрямку він бігає, якщо стріляє і так далі. Тож зміни, які він вносить до пам'яті, вплинуть лише на його власну гру, але інші гравці не побачать змін, так званий десинк. Більшість ігор виявляє подібні дезинки та видаляє бажаного гравця з гри.

Зараз також існують інші способи обману, але це все про те, як створена ваша гра.

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

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


Я не погоджуюсь із хаками про видимість. Чи не можна було запобігти цьому, не надавши клієнтові інформацію, доки їх персонаж не дізнається про це? Не зрозумійте мене неправильно, це може бути не гарний дизайн. Але це відрізняється від неможливості запобігти.
xuincherguixe

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

1

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

Наприклад, у мене 245 GOLD ... за допомогою Cheat Engine я шукаю 245 і знаходжу багато місць пам'яті. Потім я граю ще трохи і підношу золото до 314, потім шукаю попередній результат пошуку для значення 314 і легко знаходжу місце пам'яті, де зберігається GOLD.

Спосіб запобігти цьому - ніколи не зберігати реальне значення в пам'яті. Наприклад, я зберігаю значення в об'єкті, який повинен обчислити реальне значення за потребою, коли воно вимагається. Тож скажемо, що у гравця 245 ЗОЛОТИ. Якщо вони роблять пошук місця пам'яті зі значенням 245, вони можуть знайти багато, але жодне з них не буде місцем пам'яті, де фактично зберігається значення золота, тобто тому, що ви не зберігаєте значення 245 для золота. Коли грі потрібно знати, скільки золота, вона запитає предмет, який утримує для неї значення, який обчислить її на вимогу.

Отже, питання тепер: як саме ви зберігаєте значення таким чином, щоб не розкривати його? Це стає трохи хитро і потворно, і я впевнений, що існує багато способів, як це можна зробити. Що я люблю робити - це зберігати булівський масив (або байтовий масив). Довжина масиву може бути будь-якою, але скажімо, вона дорівнює 13. Тоді у вас є лічильник, який представляє, скільки разів 13 переходить у це фактичне значення. Отже, якщо ми хочемо представити 245, то лічильник мав би значення 18. Тепер у масиві буде всі булеві значення встановлені на істинне для решти 245/13 ... в основному модуль. У цьому випадку це 11, тому перші 11 булевих масивів у масиві будуть встановлені на true, а решта - на false. Щоб отримати значення, все, що вам потрібно зробити, - помножити лічильник на довжину масиву, а потім додати 1 для кожного булевого набору на true (зупиняючись на першому false). Тепер число 245 ніде не зберігатиметься, і важко буде знайти місце пам'яті, яке потрібно маніпулювати, щоб змінити кількість золота. Ви можете встановити довжину масиву на різні розміри (можливо, випадковим чином обрати число між деяким розумним діапазоном), коли цей об’єкт створений.

EDIT: Це корисно для багатокористувацьких та одиночних гравців. Існує обман, який також можна зробити в мультиплеєрі, де значення в пакетах можуть бути змінені. Для цього потрібні різні методи запобігання, як-от підписання кожного пакету.


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

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

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

1
Щоб уникнути цього, ви дозволяєте серверу оновити нове життя, а потім надсилати нове життя клієнту. Все розраховується на сервері, і нехай клієнти просто будуть "тупими терміналами" для всіх важливих речей: клієнт буде нести відповідальність за захоплення вхідних даних від програвача ("натиснув на x, y в момент T", "хіт кнопка X в момент T "), відправка їх на сервер і отримання нового стану від сервера (" гравець зараз знаходиться в положенні X, Y "," у гравця є життя ZZZ ") і показ його гравцеві.
Vaillancourt

1
З цим шахрай (людина в середині) може зіпсувати все, що хоче, з пакетами, це не змінить стан гри на сервері, оскільки сервер переконається, що введення є дійсним ("хм клієнт натиснув в п'яти різних місцях протягом останніх 0,03 секунд, це не нормально, давайте відхиляємо ці кліки ") і запускаємо все саме моделювання.
Vaillancourt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.