[recovery mode] Как защитить игру от Artmoney?

В далеком 2002 году, когда я был еще школьником, ко мне в руки попала чудо программа Artmoney, которая «помогала» пройти любую компьютерную игру, давая неограниченные возможности в игре. Программа ArtMoney предназначена для редактирования параметров в компьютерных играх, для получения бесконечных денег, жизней, патронов и т.п. Она умеет сканировать память или файлы игры для поиска каких-то определенных значений (деньги, ресурсы и т.д.). Таких значений может быть много и надо выбрать нужные, поэтому поиск разделяется на два этапа — поиск значений и отсев ненужных значений. В более поздних версиях появились более сложные алгоритмы, но они тоже сводятся к поиску и отсеву. Со временем игроделы стали бороться с данной утилитой. Однажды, я тоже задался вопросом, как защитить данные игры от взлома Artmoney. Обычно защита сводиться к тому, что игра отказывается запускаться при запущенном Artmoney, это решение показалась мне не слишком изящным. Я решил найти свой способ.

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

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

Вместо одной переменной

var life: byte; заводим две переменные var life, key: byte; при этом реальное значение переменной жизни равно life xor key (можно использовать любой другой алгоритм шифрования).Чтобы отсев не работал нужно постоянно менять ключ шифрования и перешифровывать переменную (например, поставить таймер, который через каждые 100 млсекунд меняет ключ) tmp:=key; //сохраняем старый ключ key:=random (255);//генерируем новый ключ life:=(life xor tmp) xor key; //расшифровываем старым ключом и зашифровываем новым ключом Изменение значения происходит почти по тому же алгоритму. tmp:=key; //сохраняем старый ключ key:=random (255);//генерируем новый ключ life:=((life xor tmp) + i) xor key; //расшифровываем старым ключом, меняем значение и зашифровываем новым ключом Данная методика защиты может быть реализована на любых языках программирования. Главное придерживаться принципа: постоянно менять ключ шифрования.

© Habrahabr.ru