Перейти к содержанию

Взлом Doom III


Гость

Рекомендуемые сообщения

Всем привет. Данная статья будет адресована в основном новичкам, поскольку все то, что я здесь опишу старички и так давно знают )). Ну что же меньше слов – больше дела. Взламывать мы с тобой будем игру от моей любимой студии id Software – Doom 3. Для взлома нам понадобятся следующие инструменты:

1. Cheat Engine 5.4 (Далее по тексту просто CE)

2. The MinimizoR ver. 1.8a для сворачивания окна игры.

3. Калькулятор в инженерном режиме.

4. Наличие небольшого кол-ва серого вещества и прямых рук обязательно.

Теперь расскажу немного о игре, для чего нам нужен минимизатор, спросишь ты. Дело в том окно игры нельзя свернуть привычным Alt+Tab, следовательно, ты не сможешь переключиться на окно CE и приступить к взлому. Я выбрал минимизатор от Guru.eXe поскольку он мне нравиться больше всех остальных ), Guru.eXe тебе привет от меня. Ну что же, можно начинать. Для начала я советую запустить MinimizatorR и назначить в нем удобный для тебя hot-key. Я выбрал F10, теперь можно запустить игру и загрузить сейв.

После того как ты загрузил свой сейв, ставь игру на паузу и жми F10 (или ту кнопку которую ты назначил в минимизаторе). Теперь можешь запустить СЕ и выбрать процесс игры.

Здоровье:

Предлагаю для начала найти адрес здоровья главного игрока, что бы в последствии тебе было легче играть ну и взламывать остальные значения ))). Итак у моего игрока здоровье полное и равно 100. Значит, тебе необходимо искать именно это значение вводи в СЕ в поле Value свое значение здоровья и жми Find Scan.

У меня СЕ нашел не так уж и много адресов, всего ~25000. Теперь можешь возвращаться в игру и изменить значение здоровья. После того как ты изменил кол-во здоровья игрока возвращайся в CE вводи свое кол-во здоровья в поле Value и жми на кнопку Next Scan.

Ну что я могу сказать у меня после отсева остался всего один адрес, который и является адресом здоровья для нашего игрока, но могу сразу тебе сказать, что этот адрес динамический, т.е. после перезапуска игры он будет для нас бесполезен, значить будем ставить бряк на запись на данный адрес и искать адрес инструкции, которая отвечает за жизни игрока. Для того чтобы поставить бряк на запись необходимо нажать правой кнопкой мыши на найденном адресе и выбрать пункт меню – “Find out what writes to this address”.

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

Теперь вернись в игру и измени значение жизней, затем вернись в СЕ и ты сможешь увидеть инструкции которые всплыли после записи в адрес жизней. Вот какие инструкции всплыли у меня, методом научного тыка я установил, что инструкция, которая отвечает за изменение кол-ва жизней в этом списке предпоследняя.

Вот собственно инструкция отвечающая за изменение жизней игрока, давайте её проанализируем:

101E4AF1 - 89 96 bc 00 00 00          - mov [esi+000000bc],edx

Этой инструкцией в [esi+000000bc] помещается значение находящееся в регистре edx. Ради интереса можешь сложить значение регистра esi c 000000bc и в итоге ты получишь адрес наших жизней. Давай прикинем как нам поступить с найденным адресом, можно конечно его занопить (nop) и мы станем бессмертными, но такой подход мне не нравится по одной простой причине игра может попросту упасть, я предлагаю создать code cave и вписать в регистр edx наше значение, так мы избежим падения игры да и взлом будет выглядеть элегантнее ;). В окне с инструкция можешь нажать Stop а затем Close, поскольку пока нам это окно не нужно. Я надеюсь что ты уже перешел в окно отладчика CE ))).

Для того чтобы создать code cave нам необходимо найти свободное место в адресном пространстве игры, для этого ты можешь воспользоваться сторонними тулзами или использовать встроенный в СЕ сканер. Мы с тобой используем последний. Нажми Ctrl+Alt+C или иди в Tools -> Scan for code caves и в появившемся окне в поле Size of cave введи размер cave в байтах нажми Scan, я буду искать кейв с запасом для остальных опций размером в 50 байт, этого я думаю, нам будет достаточно. Я выбрал самый первый адрес – 00400308.

Теперь после того, как мы нашли адрес для кейва возвращаемся в окно Memory Viewer’а и по нашей инструкции жмем правой кнопкой мыши и выбираем пункт “Create jump and initialize Code-Cave”. После чего тебе будет необходимо ввести адрес для нашего кейва и указать кол-во байт для него. Нам хватит 20 байт.

После всех этих манипуляций СЕ вместо нашей инструкции вставит прыжок на кейв и перенесет нашу инструкцию в сам кейв. Вот какой код появится на месте нашей инструкции:

101E4AF1 - e9 12 b8 21 f0      - jmp 00400308 //Прыжок на кейв
101E4AF6 - 90 - nop

Теперь можешь отправляться по адресу нашего кейва, для чего вызываем правой кнопкой мыши контекстное меню и выбираем пункт “Go to address” и вводим адрес кейва, после чего жмем ОК. Как ты теперь можешь видеть в кейве пока у нас лежит наша старая инструкция. Теперь немного пошаманим с кодом, впишем в регистр edx наше значение и затем запишем его куда нужно. В результате у тебя должен получится следующий код:

00400308 - ba ff 00 00 00             - mov edx,000000ff //Помещаем в edx жизни
0040030D - 89 96 bc 00 00 00 - mov [esi+000000bc],edx //записываем
00400313 - e9 de 47 de 0f - jmp getgameapi+3ed46 //возвращаемся

Теперь можешь вернуться в игру и посмотреть на результат. Как ты видишь мы бессмертные с 255 единицами здоровья. Мы добились того чего хотели, теперь для полного счастья доломаем Броню, Амуницию и Стамину. Следующие шаги будут идентичны уже проделанным нами, так что я буду описывать происходящее менее детально.

Броня:

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

101E4812 - 29 be a8 12 00 00          - sub [esi+000012a8],edi

Сразу оговорюсь, что можно было бы найти инструкцию по типу той, которую мы нашли для адреса здоровья, но поскольку мне это делать лень ), то я выберу эту инструкцию и продолжу работать именно с ней. Итак, давай для начала посмотрим на инструкцию, как я писал ранее инструкция отвечает за вычитание кол-во урона от общего кол-ва брони, можно в принципе изменить sub на add, в результате чего, кол-во брони будет увеличиваться после каждого выстрела, но тут может быть такая проблема, что при переходе на новый уровень кол-во брони сбросится на 0, что не есть хорошо. Здесь я предлагаю поступить так же как и со здоровьем, создать кейв, записать наш код и радоваться жизни. Итак нажимай правой кнопкой, и жми на пункт создать кейв. Далее вписывай этот адрес 00400318, поскольку так ты создашь новый кейв, сразу за прошлым, что согласись будет выглядеть в разы лучше чем если бы наши кейвы были разбросаны по всему адресному пространству игры ;). Нам также как и в прошлый раз хватит 20 байт для кейва. Вот что в итоге получилось у меня на месте нашей инструкции:

101E4812 - e9 01 bb 21 f0      - jmp 00400318
101E4817 - 90 - nop

Теперь переходим на адрес 00400318 и начинаем править наш код на следующий:

00400318 - bf ff 00 00 00             - mov edi,000000ff //edi = 255
0040031D - 89 be a8 12 00 00 - mov [esi+000012a8],edi
00400323 - e9 ef 44 de 0f - jmp getgameapi+3ea67

Т.е. смотри, мы заменили инструкцию вычитания на mov – копирование, и теперь после выстрела в адрес жизней запишется значение 255 и так и останется, как мне кажется, так намного лучше, чем простой nop или замена sub на add. Теперь можешь вернуться в игру и посмотреть на результат нашей махинации. У меня все работает отлично, думаю у тебя тоже все в порядке.

Амуниция:

Ну что же, мы с тобой прошли половину этого туториала, с чем я тебя и поздравляю. Сейчас мы с тобой дадим главному герою бесконечный бое запас, ну а на десерт мы с тобой сломаем полоску стамины – сделаем из нашего героя бегуна на длинные дистанции )). Ну что же, поехали. Метод нахождение значения патрон аналогичен тому, как мы находили значения жизней и брони. Начнем с пистолета. Сразу хочу заметить, что с поиском патронов у тебя могут быть проблемы, но чтобы их не возникло, перед тем как начать поиск выбери в Memory Scan Options пункт All. Теперь можно начинать.

После того как нашел адрес, ставь на него бряк и смотри какие инструкции обращаются к этому адресу. В итоге я вышел на этот адрес:

0F89CA52 - 89 44 b1 14                - mov [ecx+esi*4+14],eax

Теперь давай создадим кейв и продолжим шаманить над нашей инструкцией. Адрес для кейва я выбрал следующий 00400328, данный кейв я сделал в 30 байт, поскольку помимо нашей инструкции придется захватить в кейв еще одну, т.к. для создания прыжка необходимо 5 байт, а наша инструкция длинной всего в 4 байта. После того как кейв создан у тебя не месте старой инструкции будет следующий код:

0F89CA52 - e9 d1 38 b6 f0      - jmp 00400328
0F89CA57 - 90 - nop
0F89CA58 - 90 - nop
0F89CA59 - 90 - nop
0F89CA5A - 90 - nop

Теперь перейдем в наш кейв и дадим нашему герою бесконечных патронов. Вот что у меня в итоге получилось:

00400328 - b8 ff 00 00 00       - mov eax,000000ff
0040032D - 89 44 b1 14 - mov [ecx+esi*4+14],eax
00400331 - a1 d4 d2 c6 0f - mov eax,[getgameapi+407524] : 002D6320
00400336 - e9 1c c7 49 0f - jmp getgameapi+36ca7
0040033B - 90 - nop

В итоге вернувшись в игру, ты увидишь, что у игрока стало 255 патронов в целом, т.е. патроны в запасе + патроны в обойме = 255 единиц. Постреляй из пистолета и перезарядись и ты увидишь, что кол-во патронов постоянное и я думаю, что можно остановиться на этом, так как эти 255 единиц будут постоянны для всех типов оружия.

Стамина:

Что такое стамина – это полоска, которая находится непосредственно под счетчиком жизней главного героя и которая отвечает за выносливость, т.е. взломать стамину игрок сможет постоянно бежать, причем без передышек ;) этим мы и займемся. Сейчас ты узнаешь как взламывать полоски, поскольку я уверен на все 255 единиц здоровья, что умение взламывать полоски тебе пригодится в будущем. Итак, ты возможно спросишь как мы сможем взломать стамину, если мы не знаем чему равно значение полоски. На самом деле все не так сложно как может показаться. Начни новый поиск в CE и в поле “Scan type” выбери пункт “Unknown initial value”, после чего нажми на кнопку “First Scan”. Теперь вернись в игру и немного побегай, для того чтобы уменьшить значение стамины, после чего вернись в СЕ поле “Scan type” выбери пункт “Decreased value” и нажми “Next Scan”. После чего вернись в игру и постой на месте для того чтобы кол-во стамины увеличилось. Теперь снова вернись в СЕ и проделай обратное действие предыдущему, т.е. в поле “Scan type” выбери пункт “Increased value” и нажми “Next Scan”. Теперь проделай эти действия до тех пор, пока СЕ не оставит ~15 значений или менее.

Не знаю как у тебя но, у меня после 10 отсевов осталось всего 20 адресов, среди которых, при помощи научного тыка, я нашел свой адрес стамины. Теперь ставь на найденный адрес бряк и вернувшись в игру побегай для того чтобы изменить значение стамины. Теперь вернись в СЕ и посмотри какие инструкции всплыли у тебя. Сразу облегчу тебя задачу сказав что инструкция отвечающая за стамину – это:

0F8A3190 - d9 9e 5c 14 00 00          - fstp dword ptr [esi+0000145c]

Если мне не веришь, то посмотри в Memory Viewer на одну инструкцию вверх, там ты увидишь инструкцию вычитания. Ну что я могу тебе сказать, на моих часах уже 1:11 ))) и я дико хочу спать, поэтому давай просто занопим эту инструкцию, авось не упадет ;).

Заключение:

Ну вот ты и закончил прочтение данной статьи ))), надеюсь что тебе понравилось, и самое главное, надеюсь, что ты смог вынести из этой статьи что-то для тебя полезное. Как ты мог видеть взлом игр это не такое уж и сложное занятие, главное понять основные принципы, и кое-что запомнить, к примеру как взламывать полоски, после чего ты сможешь с легкостью взламывать игры и писать для них трейнеры. На этом мы с тобой прощаемся, надеюсь что не надолго, так как в ближайшее время я планирую написать еще одну статью. Успехов тебе в геймхаке и спасибо что ты дочитал весь этот бред до конца. :D

(с) g-l-u-k 2008

Ссылка на комментарий
Поделиться на другие сайты

Отличная статья.

Кое-что нашим пользователям.

1. Полезно и всегда проще сканировать память, когда игра находится в оконном режиме. Тем более если выполнять пошаговую отладку.

На нашем форуме написаны статьи как ставить оконный режим.

Я в olly нопил все вызовы

LONG ChangeDisplaySettings(

LPDEVMODE lpDevMode, // графический режим

DWORD dwflags // параметры графического режима

);

Затем я сохранял исполняемый файл и получал оконный режим, размер которого задаёте в настройках. Не рассчитывайте что начиная с Vista (Windows 7) всегда можно сделать оконный режим. Пример тому игра Руссич 13 век.

2. Учитывая, недавнюю "новинку" - поиск адреса внедрения по проверочным байтам, а также не 100% cтабильность работы с код-кейвами, рекомендуется внедрять чит-код в выделенную память и пользоваться проверочными байтами, которые генерируются в 4 бете CE RUS.

3. Существует некоторые количество вариантов написания скриптов по внедрению тела чит-кода. Читайте статьи, изучайте скрипты на нашем форуме и на форуме Cheat Engine.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.