Найти в Дзене
Adr Asd

x64Dbg и мелкий взлом "Star Defender 3"

Привет. А не крякнуть ли нам аркадку "Star Defender 3" , считаю крякнуть и крякать будем счётчик боеприпасов, отучим его уменьшаться ;-)

В конце статьи - ссылки на архивы с курсами по отладке от Рикардо Нарвахи, а это - ссылка на онлайн учебник: Введение в реверсинг с нуля используя IDA PRO (Рикардо Нарваха)

Решил описать не сложный процесс взлома иры с помощью отладчика x64Debugger. Искать место сохранения количества боеприпасов в игре будем с помощью CheatEngine, для удобства. Скачиваем по ссылкам отладчик, CheatEngine ( gitHub ) и игру и устанавливаем.

Запускаем игру и в настройках указываем "режим в окне", для более удобного переключения между прогами, начнём новую игру и сразу остановим.

Оранжевым обведён счётчик боеприпасов, адреса его хранения мы сейчас и найдём с помощью CheatEngine, запустим его от имени администратора.

-2

Щёлкаем по значку "выбор процесса" в меню и выбираем процесс StarDefender3.

-3

И в верхней строке CheatEngine появляется имя процесса игры.

Напишем в поле "Значение" текущее значение боеприпасов, на скриншоте игры это 10 и нажмём кнопку "Поиск". В основном окне отобразится много найденных результатов, пока игнорируем их.

-4

Вернёмся в игру, сделаем один выстрел правой кнопкой мыши и снова остановим её. Теперь на счётчике 8.

-5

Меняем в поле "Значение" - на 8, отмечаем галочку "Сравнить с первым поиском" и нажимаем кнопку "Отсев".

-6

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

Итак, у нас два результата, запишем их в блокнот. У меня текущие адреса: 05DDA158, 05DEFA68 и при перезапуске игры они будут другими. Конечно, мы можем щёлкнуть мышкой по строкам с результатами в CheatEngine, после чего они отобразятся в нижнем поле, где мы установив галочки слева от них - заморозим значения.

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

-7

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

В блокноте сохранены найденные адреса, CheatEngin можно закрыть и запустим X64Dbg от имени администратора, а точнее ..\ x64dbg\release\x32\ x32dbg.exe так как игра x32 битная. Идём в меню Файл->Присоединится

-8

и в окне процессов выбираем нашу игру.

-9

Открывается окно отладчика X64Dbg (x32Dbg) с загруженной в него игрой, которая продолжает работу но уже под отладкой.

Те - кто только решил изучать взлом и отладку в Windows, лучше начать с курса по OllyDbg от Рикардо Нарвахи на wasm.ru и продолжить курсом по IdaPro от него же.

Коротко об отладчике:

-10

Поле 1 обозначенное как CPU - содержит ассемблерный код текущего отлаживаемого модуля, в данном случае одна из dll учавствующих в работе.

Поле 2 Дамп, отображает шестнадцатеричное представление данных в различных адресах памяти , адреса в левой колонке.

Поле 3 отображает текущие значения регистров процессора и флагов.

Поле 4 Стёк, изучите курс от Рикардо Нарвахи и узнаете - что это ;-)

Возьмём первый сохранённый в блокноте адрес (у меня 05DDA158), щёлкнем мышью в поле дампа (№2) и нажмём клавиши Ctrl+G, появится маленькое окно для ввода адреса, вставим адрес и нажмём ОК

-11

В дампе отобразится содержимое по нашему адресу и оно равно текущему количеству боеприпасов.

-12

Для того что бы выяснить, где происходит изменение этого числа, нужно попросить отладчик остановится при попытке его изменить, то есть установить "брейкпоинт" (он же бряк) на изменение этого числа. Размер, тип значения 4 байта, он же dword , показывал нам CheatEngine. Выделяем в дампе левой кнопкой мыши 4 байта по нашему адресу, и щёлкаем по выделению правой кнопкой мыши. В контекстном меню выбираем Точка останова -> Аппаратная, Запись -> Dword (бряки на память почему то не работают, что весьма меня озадачило). Точка останова - она же бряк.

-13

То же проделаем и со вторым адресом. В итоге имеем две точки останова на изменение значений по двум адресам. Убедимся в этом н вкладке "Точки останова".

-14

Если процесс игры в статус строке отладчика оказался "Приостановлен", то запускаем его кнопкой "Выполнить" или клавишу F9.

-15

Если процесс игры в статус строке отладчика оказался "Приостановлен" при попытке исключения , то идём в меню Параметры ->Параметры и в окне параметров на вкладке Исключения щёлкаем по кнопке "Пропустить последнее" , а в диалоге подтверждения нажимаем Yes. Далее по кнопке Сохранить.

-16

И снова нажимаем кнопку "Выполнить". С другими исключениями поступаем так же. Вернёмся в игру и сразу отладчик останавливается на одном из бряков, после выполнения записи, на 004C6B60 . Зелёная подсветка - это текущая позиция, на которой остановлено выполнение, а нижней стрелкой я отметил место, где выполнилась запись по одному из наших адресов.

-17

004C6B5E mov dword ptr ds:[ecx],eax <-- запись здесь
004C6B60 | mov al,1 <-- остановка здесь

Так как остановка происходит после, значит запись происходит в предыдущей команде по адресу 004C6B5E. Она означает: взять значение в регистре eax и записать по адресу находящемуся в ecx.

-18

В ecx у нас второй из найденных в CheatEngine адресов (у меня это 05DEFA68). Запомним это место установив на него бряк клавишей F2, красная подсветка означает точку останова (бряк),

-19

а на вкладке "Точки останова" - деактивируем его, выделим и нажмём пробел. Оставим его как метку, для быстрого перемещения сюда если вдруг понадобится.

-20

Теперь определим место изменения для первого из адресов (05DDA158 у меня). Для этого на вкладке "Точки останова" , выделим строку со вторым адресом и нажмём клавишу "Пробел".

-21

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

-22
-23

Строкой выше (00468CF1), происходит сохранение числа из регистра edx по адресу находящемуся в eax, скорее всего - числа боеприпасов , а ещё выше, по адресу 00468CEB - видим подозрительное вычитание чего то из edx , который в строке 00468CF1 и сохраняется по адресу в eax.

00468CEB sub edx,dword ptr ds:[ecx+34] <-- вычитание из edx ..
00468CEE mov eax,dword ptr ss:[ebp-14]
00468CF1 mov dword ptr ds:[eax],edx <-- сохранение из edx в [eax]
00468CF3 mov esp,ebp <-- остановка

Что бы посмотреть, что вычитается из edx, установим бряк на 00468CEB,

-24

а остальные отключим на вкладке "Точки останова"

-25

Нажимаем "Выполнить" или F9, возвращаемся в игру и делаем выстрел правой кнопкой мыши. Происходит остановка на нашем бряке по адресу 00468CEB И тут мы видим, как отладчик в строке подсказок сообщает, что ecx+34 - это адрес 05DD76A4 и значение его равно 2.

-26

То есть в строке по адресу 00468CEB, из edx равного 6 , будет вычтено число находящееся по адресу 05DD76A4 равное 2. Проверим это сделав один шаг с помощью клавиши F7. И в результате edx =4

-27

Далее по адресу 00468CEE в eax помещается наш адрес хранящий число боеприпасов 00468CEE mov eax,dword ptr ss:[ebp-14]
и в следующей строке по этому адресу сохраняется
число из edx
00468CF1 mov dword ptr ds:[eax],edx

То есть, мы нашли место в коде игры, где изменяется число боеприпасов:
00468CEB sub edx,dword ptr ds:[ecx+34]

И мы можем изменить код на нужный нам. Выделяем строку по адресу 00468CEB и нажимаем "Пробел".

-28

В этом маленьком окне изменяем код, на sub edx, 0 и нажимаем ОК и закрываем окно.

-29

И теперь изменённый код у нас такой:

-30

Отключаем последнюю точку останова на вкладке "Точки останова" пробелом и нажимаем кнопку "Выполнить" или F9 . Возвращаемся в игру и если всё сделано правильно, наблюдаем как счётчик боеприпасов перестал уменьшаться, а увеличиваться не разучился ;-)

Остаётся последний штрих, сохранить наши изменения. Щёлкаем правой кнопкой мыши по строке 00468CEB и в контекстном меню по строке "Исправления"

-31

и в следующем окне по кнопке "Исправить файл". В диалоговом окне задаём другое имя файла

-32

И сохраняем изменения.

-33

Нажимаем кнопку "Закрыть" в отладчике и игра закрывается.

-34

Закрываем отладчик, запускаем нашу изменённую игру

-35

и наш счётчик боеприпасов работает только на пополнение. Вроде всё. Буду рад справедливой критике.

Вот, кому нужно - курсы от Рикардо Нарвахи в формате html в архивах:

Учебник OllyDbg Рикардо Нарваха Zip.

Учебник IdaPro Рикардо Нарваха Rar (пароль 123).

Всем удачи.

-36

Далее --> Взлом игр ковыряем Night of the Dead v2.0.5.7.