Форум : Флейм

Название : Идеальная защита от мапхака, если б я писал варкрафт

© 2005 www.runcms.org
https://www.war2.ru

URL этой темы
https://www.war2.ru/modules/newbb_plus/viewtopic.php?topic_id=2384&forum=13


 il :

21.3.19 01:00
 Выложу сюда свои мысли по тому, как бы я защищал игру наподобие варкрафта от мапхака, если бы я был ее разработчиком:
Не секрет, что владелец компьютера может залезть в память любого процесса на своем компьютере и подсмотреть любые данные. В том числе, данные обо всем, что "знает" его компьютер о других игроках.

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

Как это сделать:
1. Gолучается, самый простой вариант защиты от мапхака - толстый клиент.
Когда все игровые процессы выполняются на сервере, а на клиентах только картинка рисуется.
2. А самый правильный вариант если самим делать игру - получается с сервером-посредником:
каждый клиент передает данные о том что он делает не другим клиентам, а серверу. А сервер уже выдает клиентам только те данные о других клиентах, которые они в данный могут видеть. Фактически как вариант 1, только тонкий клиент.

А если делать обмен данными с защитой от мапхака без посредников то схема придумалась, но получается большой объем данных: Но теоретическое решение существует.
Упрощенная задача к которой сводится наша:
допустим, у нас игровое поле размером N клеток, мы хотим узнать у противника, что находится на k-й клетке. Т.е. мы ее разведываем. Надо чтобы противник:
1. не узнал что мы разведываем именно k-ю клетку. Иначе понятно что мы именно там находимся,
2. хотя бы в конце игры он узнал что k-ю клетку мы разведывали по праву. Т.е. что мы действительно там были или что-то туда кастанули, а не обманули его, чтобы он нам нам показал ту клетку, которую мы просмотреть не могли.
Мысль такая:
- генерируем пары ключей - N пар, по одной паре на каждую из клеток поля.
- По массиву закрытых ключей строим хеш и отправляем его противнику. В конце игры мы отправим ему этот массив закрытых ключей чтобы он с помощью этого хеша проверил что мы не жульничали а именно эти ключи использовали.
- чтобы узнать содержимое k-й клетки, отправляем ему открытый ключ для k-й клетки, но для какой именно клетки не говорим. Он этим ключом шифрует все N клеток и весь массив отправляет нам. Мы можем расшифровать только содержимое k-й клетки, поскольку наш закрытый ключ подходит только к ней. Остальные данные для нас - мусор.

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

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

Конечно, этот вариант гораздо хуже и затратнее по трафику, чем способ используемый в вар2: там передаются только изменения. Т.е, фактически, только действия игроков в данный момент.
В моем же алгоритме приходится передавать просто огромный объем данных: например для карты 256x256 приходится передавать 65536 зашифрованных пакетов, и это - на каждом цикле синхронизации! Не говоря уж про то, что для этого приходится производить 65536 операций шифрования. И как это оптимизировать. я не знаю.
Но теоретически, такой вариант есть.
А вы что думаете по этому поводу?

[ Редактировано il в 21.3.19 00:06 ]

© 2005 www.runcms.org
https://www.war2.ru

URL этой темы
https://www.war2.ru/modules/newbb_plus/viewtopic.php?topic_id=2384&forum=13