Идем дальше. Мы уже знаем как находить нужные нам в памяти значения, в данном случае это был счет балов в игре "Косынка". Задумаемся дальше. Мы можем прописать нужное нам в память значение, заморозить его с помощью Cheat Engine, но такой метод подходит далеко не всегда, особенно он слаб перед сетевыми играми, когда какие-то данные приходят с сервера, и уж точно не катит тогда, когда мы хотим помочь кому-то и сделать чит.
Для этого нужно копнуть гораздо глубже чем заниматься шалостями с хранимым в памяти значением. Нужно изменить выполнение самой игры так, чтобы она делала то, что мы от нее хотим. Т.е. частично перепрограммировать ее.
Возникает вопрос "Как? У меня нет ее исходных кодов!?". Очень и очень просто. Исходные коды высокоуровневого языка программирования нам иметь не обязательно. ЛЮБАЯ программа, это так называемый байт-код, он не понятен человеку (за исключением особенно продвинутых кодеров-реверсеров), НО, он понятен дизассемблерам и отладчикам, и точно так же как и значене которое мы нашли раньше, этот байт-код, загружен в память процесса, а значит мы его можем найти, и исправить!!!
Cheat Engine имеет встроенный отладчик, который для начала нам вполне хватит, почему для начала? Потому что есть вещи, которых он видеть не умеет, например регистры ST используемые для операций с числами с плавающей точкой, 3D Now регистры, ну да мало ли еще чего не умеет... В конце урока мы перейдем к более продвинутому отладчику.
Итак, дальше мы попробуем сделать так, чтобы игра, забыла о том, как этот счет вести. Для этого, сначала, мы найдем участок кода, который собственно в найденную нами ячейку памяти прописывает количество очей в игре.
После проделанной работы, жмем по отобранному нами адресу памяти левой кнопкой мыши,
и выбираем в меню "Find out what writes to this addres.." (перевод: выяснить что записывает в этот адрес). Поскольку разбираемая нами игра, как мы упоминали уменьшает с течением времени наш счет, то просто подождем немного и у нас появляется в окошке новое значение.
Кликнем на него один раз левой кнопкой мыши, чтоб он выделился, и нажимаем кнопку "Show disassembler" (пер: показать в дизассемблере)
В моем случае вышел результат (010030b8 - 89 46 30 - mov [esi+30],eax ), у вас он может быть другой, т.к. могут быть разными системы, версии игр, и даже загруженные и работающие в системе процессы, службы и приложения.
Небольшое отступление
Расшифрую немного то что написано в скобочках, для начала понимания. Там получается следующее: по адресу 010030b8, находится байт-код (последовательность байт в шестнадцатиричных числах) 89 46 30, на языке ассемблера эта инструкция выглядит mov [esi+30], eax (поместить в ячейку с адресом значение которой получается как число в регистре ESI + 30 (внимание! 30 это шестнадцатиричное число, на ассемблере мы почти всегда будем сталкиваться с шестнадцатиричной системой счисления), число равное регистру EAX). Но подробнее об этом позже.
Сделать это очень легко, в этом окошке жмем 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
Все после этого заходим в игру, и видим что как бы мы не старались поднять очки, у нас нечего не выходит =)
Что при выполнении действия, программа ничего не перезаписывает в эту ячейку памяти.
Значит мы сделали все правильно, и найти нужное нам значение мы смогли. И теперь мы можем над ним издеваться как хотим. К примеру бесконечные аптечки. =)