Всем привет, сегодня дедушка Ваня расскажет вам о программе Cheat Engine (кратко CE), объяснит основные моменты программы и детальное прохождение крайнего шага учебного руководства к этой программе. Поехали!
Введение
Первым делом сразу оговорюсь, что цель этой статьи: не сделать из вас супер-пупер хакеров, а рассказать о возможностях продукта, представленного в данной статье, научить им пользоваться, объяснить некоторые особенности, немного ознакомить с ассемблером. Ссылка на официальный сайт: Cheat Engine. Почему я выбрал эту программу, а не, например, ArtMoney? Причины:
- Бесплатный продукт, открытый исходный код
- Возможность русификации (необходимые файлы есть на официальном сайте)
- Хорошее сопровождение программы, большое число сайтов и форумов.
Основные возможности
Итак, вы скачали, установили и русифицировали CE. Теперь перед вами такое окно:
Что дальше? Открываем одно из учебных руководств, в зависимости от разрядности вашей системы.
Небольшое отступление. Хочу рассказать вам об антирандомайзере и редакторе памяти (отладчике), так как в учебном руководстве о них мало говорится. Сколько бы я не использовал антирандомайзер, он мне ни разу не помог на практике. В настройках CE можно настроить число, которое будет возвращено вместо псевдослучайного, но... Даже простую, написанную мною на турбо паскале программу антирандомайзер не одолел (не нашёл алгоритм создания псевдослучайного числа). Правда, это было около 4 лет назад, но с тех пор я его не использовал. Отладчик считывает регион памяти процесса и переводит байт-код (как известно, данные в компьютере хранятся в виде нулей и единиц. Переведите каждые 8 разрядов нулей и единиц в шестнадцатеричную систему, и получите байт-код) в команды ассемблера (31 D2 - это xor edx,edx). Инструкцию в отладчике можно изменить на вашу, для этого по ней нужно кликнуть два раза и в открывшемся окне написать свою.
Итак, во всех заданиях записан строгий порядок действий для обучающегося, кроме... 9 шага. Здесь уже нужно разрабатывать свою идею. Не получается? Попробуйте нажать на лампочку в верхнем правом углу (на предыдущих этапах я вам рекомендую не использовать эту подсказку).
Вы перейдёте по ссылке на видео с решением (на английском). Однако, здесь я опишу свой метод. Он не претендует на оптимальный, но является в меру простым, без использования инъекции кода🙂. Анализ данных и структур я рекомендую использовать только тогда, когда вы знаете, за что отвечает параметр, который отсеивает "наших" и "врагов". Ведь если вы этого не знаете, то или параметр может измениться, или найдётся ещё кто-то с таким же.
Прохождение 9-ого шага
Пока посмотрим, как задача решается на 64-битной версии. Первым делом, найдём инструкцию, которая изменяет значение здоровья у всех игроков. Можете проверить, то есть занопить (заменить nopами) найденную инструкцию и нажать "Случайная игра". Здоровье у игроков не изменится. А теперь понаблюдаем, как именно меняется значение здоровья у "наших" и "врагов" в процессе игры (когда наступает конец игры, мы видим, что у "наших" наверняка вычиталось больше, чем у "врагов"). Для этого ставим брейкпоинт на нашу инструкцию, запускаем случайную игру и нажимаем кнопку на верхней панели "Шаг с выходом" до тех пор, пока здоровье наших героев не изменится (То есть с выходом из процедуры, в которой мы сейчас находимся. "Шаг с проходом" - не входим в процедуры, то есть они выполняются без отладки. "Шаг с заходом" - выполняем инструкции шаг за шагом). Получилось 8 раз? Вы видели, как брейкпоинт повторился 4 раза? Предлагаю вам подумать самим, почему здоровье всех игроков изменилось на экране одновременно, а не по очереди, после изменения значений каждого, и написать ваш ответ в комментариях.
Попробуйте ещё понажимать "Шаг с выходом". У "наших" вычитается всегда больше 1, а у "врагов" - ровно 1. Понятно, что это уже отличительный признак, но можно ли как-то сделать так, чтобы это большее число для нас принесло пользу? Можно! Например, заменить вычитание умножением, а затем опять вернуть вычитание, когда здоровье "наших" будет большИм. Только при выполнении умножения нужно поставить брейкпоинт, чтобы здоровье не вышло за максимально допустимую границу. А теперь посмотрим на код, который находится выше инструкции, изменяющей здоровье.
Теперь объясняю по-простому, что здесь происходит.
- movss, movaps - копируют значение (вещественное) из регистра после запятой (на втором месте) в регистр до запятой (на первом месте)
- subss - аналог sub, только работает с вещественными значениями.
Регистр - это как переменная, в которой хранится какое-то число.
Таким образом, значение здоровья копируется в xmm1, потом из него вычитается xmm0. Затем здоровье из xmm1 копируется в xmm0 и записывается по адресу, из которого взялось первоначально.
У вас ещё стоит брейкпоинт? Хорошо, замените subss на mulss и понажимайте "Шаг с выходом" до тех пор, пока здоровье не изменится.
Теперь меняем mulss на subss обратно (только не забудьте, как я 😅), удаляем брейкпоинт и нажимаем зелёный треугольник (выполнить).
Краткое пояснение по версии 32-бит. Там всё аналогично, только другие команды работы с вещественными числами. Изучите их самостоятельно. Скажу сразу, fsubr нужно заменить на fmul.
Теперь, если вы нажмёте кнопку "Далее", откроется игровое учебное руководство. Аналогично предыдущему, здесь есть лампочка. Нужна помощь? Пишите, спрашивайте, внучата, подписывайтесь, ставьте лайки! Всем пока!