• Как писать читы: №2 От значения в памяти, к коду игры



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

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

    Возникает вопрос "Как? У меня нет ее исходных кодов!?". Очень и очень просто. Исходные коды высокоуровневого языка программирования нам иметь не обязательно. ЛЮБАЯ программа, это так называемый байт-код, он не понятен человеку (за исключением особенно продвинутых кодеров-реверсеров), НО, он понятен дизассемблерам и отладчикам, и точно так же как и значене которое мы нашли раньше, этот байт-код, загружен в память процесса, а значит мы его можем найти, и исправить!!!

    Cheat Engine имеет встроенный отладчик, который для начала нам вполне хватит, почему для начала? Потому что есть вещи, которых он видеть не умеет, например регистры ST используемые для операций с числами с плавающей точкой, 3D Now регистры, ну да мало ли еще чего не умеет... В конце урока мы перейдем к более продвинутому отладчику.

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

    После проделанной работы, жмем по отобранному нами адресу памяти левой кнопкой мыши,
    и выбираем в меню "Find out what writes to this addres.." (перевод: выяснить что записывает в этот адрес). Поскольку разбираемая нами игра, как мы упоминали уменьшает с течением времени наш счет, то просто подождем немного и у нас появляется в окошке новое значение.
    Кликнем на него один раз левой кнопкой мыши, чтоб он выделился, и нажимаем кнопку "Show disassembler" (пер: показать в дизассемблере)

    В моем случае вышел результат (010030b8 - 89 46 30 - mov [esi+30],eax ), у вас он может быть другой, т.к. могут быть разными системы, версии игр, и даже загруженные и работающие в системе процессы, службы и приложения.
    Снимок экрана Cheat Engine поиск процесса

    Небольшое отступление
    Расшифрую немного то что написано в скобочках, для начала понимания. Там получается следующее: по адресу 010030b8, находится байт-код (последовательность байт в шестнадцатиричных числах) 89 46 30, на языке ассемблера эта инструкция выглядит mov [esi+30], eax (поместить в ячейку с адресом значение которой получается как число в регистре ESI + 30 (внимание! 30 это шестнадцатиричное число, на ассемблере мы почти всегда будем сталкиваться с шестнадцатиричной системой счисления), число равное регистру EAX). Но подробнее об этом позже.
    После нажатия на кнопку Show disassembler, видим новое окно. Мы попали в окно отладчика, курсор стоит сейчас именно на той инструкции, которая выполнила запись в ячейку памяти уменьшив наш счет. Поскольку отладчик встроенный в Cheat Engine не полностью удовлетворяет своим функционалом, то особенно мы заморачиваться на нем не будем, хотя в нем есть пара интересных фишек, но это не столь важно. Т.е. в будущем, мы перейдем к другому отладчику, мы ведь выяснили что за инструкция пишет, но как ее найти в другом отладчике? По последовательности байт-кода не совсем вариант, поскольку такая последовательность может и повторяться еще где-нибудь, но при этом будет совершенно другую функцию выполнять. Нам нужно выяснить относительный адрес этой инструкции, т.е. как далеко от начала программы (от 1го байта байт-кода) находится эта инструкция.

    Сделать это очень легко, в этом окошке жмем Ctrl+M или заходим в меню View -> Show module addresses, и видим что первая колонка у нас изменилась. Вместо адреса (колонка Address) вида 01234567, видим адрес вида sol.exe+30b8, вот 30b8 это и есть относительный адрес (другими словами смещение) от начала модуля sol.exe (базового адреса), программы "Косынка".
    Запишите себе этот относительный адрес, на бумажку он нам пригодится в дальнейшем, когда перейдем к работе в другом отладчике, более мощном.

    Ну а теперь проверим, что будет если эту инструкцию убрать. Убрать ее очень просто.
    В окне дизассемблера, жмем на правой кнопкой на строку которая выполняет уменьшение, и выбираем "Replace with code that does nothing" (пер: заменить кодом, который делает ничего)
    В новом окне просто нажимаем на ОК. У меня в колонках вышло такое значение:

    Адрес sol.exe+30B8 \ Байт 90 \ Opcode nop

    Cheat Engine скриншот ввод нужного кода

    Все после этого заходим в игру, и видим что как бы мы не старались поднять очки, у нас нечего не выходит =)
    Что при выполнении действия, программа ничего не перезаписывает в эту ячейку памяти.
    Значит мы сделали все правильно, и найти нужное нам значение мы смогли. И теперь мы можем над ним издеваться как хотим. К примеру бесконечные аптечки. =)
    Эта статья изначально была опубликована в теме форума: Как писать читы: №2 От значения в памяти, к коду игры автор темы GTX7 Посмотреть оригинальное сообщение
    Комментарии 1 Комментарий
    1. Аватар для herus
      у меня версия 6.1 не могу взломать world of tanks я подумал может быть скачать версию 6.0? а когда я взламывал то деньги были много. но версия не совпала может попробывать?
  • Архив

    Сентябрь   2019
    Вс Пн Вт Ср Чт Пт Сб
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30