Как предотвратить обман в наших (многопользовательских) играх?

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

К сожалению, я думаю, что алгоритм Кадане не может найти все возможные решения, когда существует более одного решения.

Реализация на Java, я ее не тестировал:

public int[] kadanesAlgorithm (int[] array) {
        int start_old = 0;
        int start = 0;
        int end = 0;
        int found_max = 0;

        int max = array[0];

        for(int i = 0; i

33
задан 3 revs, 3 users 100% 4 August 2014 в 13:05
поделиться

3 ответа

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

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

1) По возможности, «Никогда не доверяйте клиенту» - ваш самый безопасный принцип. придерживаться. Все действия выполнять на сервере, и давать клиенту только столько знаний, сколько необходимо для визуализации того, что он должен видеть на экране в любой момент времени. т.е. если клиент не знает позицию игрока, который спрятан за стеной, взлом стены не принесет пользователю никакой пользы. Для высокоскоростных экшн-игр это может быть чрезвычайно сложно - особенно сейчас, когда тени в реальном времени и тому подобное стало нормой, когда пользователю может потребоваться возможность видеть тень, даже если тело игрока видно - но она всегда должна быть вверху ваших опций. Также чрезвычайно сложно сделать в одноранговых играх, но есть способы ограничить знания между участниками. Только когда производительность становится недопустимой или выходит за рамки вашего бюджета времени / денег, следует учитывать следующие моменты.

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

3) Сделайте то же самое, подключив различные функции эмуляции мыши и клавиатуры. Это предотвратит появление множества аймботов и других типов роботов автоматизации.

4) Подключитесь к функциям VirtualProtectEx / VirtualAllocEx / etc в собственном процессе вашей игры и отслеживайте, какие модули меняют уровни защиты или выделяют новые блоки памяти. Вы должны быть хитрыми с этим, чтобы предотвратить чрезмерную загрузку процессора, когда ваша игра делает много распределений, но это можно сделать.

5) Подключитесь к функциям LoadLibrary и отслеживайте любые загружаемые библиотеки DLL динамически, чтобы предотвратить внедрение DLL.

6) Используйте легкую полиморфную кодировку для ваших игровых подключений.

7) Используйте некоторые методы защиты от отладки, чтобы предотвратить подключение отладчиков к вашим процессам. Google противодействует отладке, и вы сможете найти много чего.

8) Используйте специальный собственный PE-упаковщик, чтобы предотвратить полезную дизассемблировку вашей игры.

9) Подключите свои функции и методы OpenGL или Direct3D, которые имеют дело с прозрачностью и альфа-смешиванием.

10) При использовании шейдеров, контрольная сумма шейдеров и значений констант шейдера.

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

7) Используйте некоторые методы защиты от отладки, чтобы предотвратить подключение отладчиков к вашим процессам. Google противодействует отладке, и вы сможете найти много чего.

8) Используйте специальный собственный PE-упаковщик, чтобы предотвратить полезную дизассемблировку вашей игры.

9) Подключите свои функции и методы OpenGL или Direct3D, которые имеют дело с прозрачностью и альфа-смешиванием.

10) При использовании шейдеров, контрольная сумма шейдеров и значений констант шейдера.

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

7) Используйте некоторые методы защиты от отладки, чтобы предотвратить подключение отладчиков к вашим процессам. Google противодействует отладке, и вы сможете найти много чего.

8) Используйте специальный собственный PE-упаковщик, чтобы предотвратить полезную дизассемблировку вашей игры.

9) Подключите свои функции и методы OpenGL или Direct3D, которые имеют дело с прозрачностью и альфа-смешиванием.

10) При использовании шейдеров, контрольная сумма шейдеров и значений констант шейдера.

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

8) Используйте собственный запатентованный PE-упаковщик, чтобы предотвратить полезную разборку вашей игры.

9) Подключите свои функции и методы OpenGL или Direct3D, которые имеют дело с прозрачностью и альфа-смешением.

10) При использовании шейдеров, контрольная сумма ваших шейдеров и значения констант шейдера.

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

8) Используйте собственный запатентованный PE-упаковщик, чтобы предотвратить полезную разборку вашей игры.

9) Подключите свои функции и методы OpenGL или Direct3D, которые имеют дело с прозрачностью и альфа-смешением.

10) При использовании шейдеров, контрольная сумма ваших шейдеров и значения констант шейдера.

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

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

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

55
ответ дан 27 November 2019 в 17:55
поделиться

Вы можете найти эту статью о Cheat Proof Game Protocols интересной. Все они являются вариациями одной и той же идеи: использование хэшей в качестве обещания, а затем раскрыть значение хешированного обещания, как только будут выполнены условия поведения других игроков. Это сложно и влияет на производительность, но некоторые идеи могут быть полезны, особенно для одноранговых игр.

16
ответ дан 27 November 2019 в 17:55
поделиться

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

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

Это не только снизит вероятность обмана, но и уменьшит трафик, вызванный вашим протоколом, то есть повысит эффективность.

Это метод, который сам по себе давно известен и применяется в играх / индустрия моделирования для повышения эффективности при визуализации больших 3D-сцен.

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

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

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

5
ответ дан 27 November 2019 в 17:55
поделиться