Подтвердить что ты не робот

Как предотвратить обман с помощью Gamecih?

Фон

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

Как они обманывают

Читеры используют приложение для корневых пользователей под названием Gamecih. Gamecih позволяет пользователям приостанавливать приложение, изменять значения переменных, а затем возобновлять приложение. Поэтому в моем случае они просто приостанавливают игру, меняют "здоровье" на 74 триллиона, а затем пинают дерьмо из всех в мультиплеере. Здесь видео, показывающее, как Gamecih используется для обмана в Fruit Ninja (а не в моей игре).

Рассматриваемые методы

  • Обфускация кода. Это не сработает, потому что обфускация не изменяет значения переменных, просто имена переменных. Это означает, что читеры все еще могут найти переменную, которая имеет то же значение, что и текущее состояние работоспособности, а затем изменить эту переменную.
  • Обфускация кода + изменение значения геттера и сеттера. Таким образом, здоровье не будет фактически представлять реальную ценность для здоровья. В методе геттера я бы сделал что-то вроде return health * 10; и в сеттере я бы сделал health = input/10; Это, конечно, может быть сложнее.

Что я хочу

Можно утверждать, что рассматриваемый метод nr 2 - это то, что я должен использовать, но опять же, это не мешает взлому, это просто усложняет его. В идеале, я хотел бы обнаружить, когда люди обманывают использование Gamecih, показывают всплывающее высказывание "Дарн вы, ваш противный хакер", а затем закройте приложение. Я не хочу зависящее от сервера решение, поскольку я бы хотел, чтобы мои игроки могли играть в автономном режиме. Если возможно, я также хотел бы избежать обфускации кода.

4b9b3361

Ответ 1

Вы можете хранить жизнь в X числе переменных, и реальное значение будет их суммой (всегда рассчитывается динамически). Вы произвольно выбираете, какой из них нужно обновить. Кроме того, вы можете добавить некоторую проверку согласованности, и для читера становится чрезвычайно сложно понять, что и как его изменить.

Проверка согласованности может быть простым правилом, что, например, 1, 2 и 3 переменные растут, а четвертый - самый маленький. Это займет время, чтобы понять это с помощью этого инструмента.

Yoy также может стать более креативным и смешать в некотором шифровании и т.д. (так, как вы упомянули). Тогда это становится вторым до невозможного, если у кого-то нет вашего кода.

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

Ответ 2

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

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

Например:

void incrementHealth(int amount) {
    health = health + amout;
    hiddenCheck.hasChanged = true;
    }

и в отдельном методе, который должен вызываться периодически:

void checkHealth() {
    if (hiddenCheck.hasChanged) {
        // change is valid
        hiddenCheck.hasChanged = false;
        hiddenCheck.lastKnownValue = health;
        } else {
            if (hiddenCheck.lastKnownValue != health) {
                // An illegal change has occured ! Punish the hacker !
                }
            }
        }
   }

Ответ 3

try{
    ApplicationInfo info = getPackageManager().
            getApplicationInfo("com.cih.gamecih", 0 );
    return true;
} catch( PackageManager.NameNotFoundException e ){
    return false;
}

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

Ответ 4

Динамически рассчитывать статистику по сохраненному значению.

private double getSaltedSqrt(int i){
    return Math.sqrt(i)+1337;
}

private int getTrueValue(double i){
    return (i-1337)*(i-1337);
}

Таким образом, ни один человек с регулярным мозгом не сможет найти ваши ценности из ОЗУ. У кого-то со 100 здоровьем будет значение здоровья 1347.0

Если кто-то наносит 10 урона тому игроку, вам просто нужно позвонить:

currentHealth = getSaltedSqrt(getTrueValue(currentHealth)-damage);

Однако самый безопасный способ сделать это - реализовать все эти изменения через сервер.

Ответ 5

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

Что бы вы сделали (поскольку GameCIH может обрабатывать только одну переменную за раз), есть две переменные, которые проверяются друг на друге.

  • Значение оригинала (или 11-назад)
  • Массив значений изменений с 1 по 10
  • Значение суммирования, отрицание. (Это полностью изменяет десятичное значение, которое вы можете видеть, и оно изменится иначе, чем исходное значение, когда в него будет загружена самая старая запись в журнале.)

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

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

Ответ 6

Люди, которые умеют обманывать игры, тоже читают эти форумы, и они знают все ваши маленькие секреты.

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

Ответ 7

Во избежание обмана памяти вы можете сделать одно из следующих действий:

  • Храните самые важные значения в массивах цифр, а не в переменные
  • Сохраняйте значение как строку, а также, когда вы изменяете он проверяет, соответствует ли она строке.
  • Взгляните на классы MochiDigits от Mochi (Actionscript 3) и придумайте порт Java. https://code.google.com/p/cunitescore/source/browse/trunk/as3/unitescore/mochi/MochiDigits.as?r=92

Ответ 8

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

Ответ 9

В играх Pokemon они использовали DMA. Вы можете получить аналогичный эффект, отключив таймер и активизируя обновление всех значений, в то время как игра приостанавливается на очень короткое время. Обновление добавило бы некоторую случайную сумму для всех переменных (включая ту, которую вы вычитаете для получения отдельных значений). Вы также можете попробовать иметь значения, хранящиеся в большом массиве, и изменить начальную позицию. Вместо абсолютного указателя, такого как GameState[121], у вас есть что-то вроде GameState[121+StartingPosition] и просто объедините значение-incrementor с рандомизатором местоположения. Модульная арифметика - ваш друг, в обоих случаях. Будьте осторожны с переполнением массива и ошибками "один за другим". Переполнение буфера не было бы хорошим.;)

Если это было Flash или Java-приложение: к сожалению, использование управления памятью для быстрого переназначения позиции в ОЗУ значений не так удобно, как в родном двоичном файле, например, в Gameboy Advance. Копирование всех переменных во второй набор в произвольном порядке, а затем удаление и сбор мусора исходных значений, вероятно, заставит вашу игру работать медленнее, как черт.

Ответ 10

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

В качестве альтернативы эта проверка может быть применена при входе в многопользовательский режим.

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