Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Взлом игры под DOS - MagicLand Dizzy (Dizzy 4)
Автор: Fess

Жизнь-игра. Задумана хреново, но графика обалденная.

Target: Dizzy 4 File: magic.exe Type: DOS Game Difficulity: Easy

Tools:

  • Some Brain
  • DeGlucker( dg.com )
  • UNPack 4.11
  • Hex-editor (QView, Hiew, в DosNavigator)

Ну так приступим, сломать досовый гамес, это в основном легче легкого (95 % гамесов).

Сделаем все по плану (а не накурившись плана).

1) Проверим не запакован ли файл чем-то, для этого запускаем из коммандной строки UNPack. Строка такая: unp.exe magic.exe И мы видим...


UNP 4.12с Executable file restore utility, written by Ben Castricum, 08/27/95

processing file : MAGIC.EXE
DOS file size   : 155382
file-structure  : executable (EXE)
EXE part sizes  : header 96 bytes, image 155286 bytes, overlay 0 bytes
processed with  : PKLITE V1.15 -e
action          : decompressing... done
new file size   : 446215
writing to file : MAGIC.EXE

О-о-о, да он запакован PKLITE V1.15. Но теперь все Ок - он распакован в файл magic.exe. Запускаем эту строку еще раз и видим, что больше паковщиков на файле не висит.

2) Теперь все просто. Выходим в ДОС, запускаем dg.com с параметром magic.exe. И вываливаемся в окне ДеГлюкера нажимаем кнопочку F9, т.е запустим программу.

3) Найдем где можно запороть жизнь, но не запорем ее (в этой игре это можно сделать справа, у привидений). Нажимаем Pause - по этой кнопке вызывается ДеГлюкер. Смотрим состояние регистра DS, запоминаем. У меня DS=1C7A. Переходим с помощью Tab к окну кодов (в самом внизу). Нажимаем Alt-S. Нас просят указать сегмент и смещение для начала дампа. Пишем DS:0, нажимаем Enter. Вводим длинну дампа FFFF, нажимаем Enter. Вводим имя файла: кол-во_оставшихся_жизней.dmp (3.dmp). Нажимаем F9.

4) Повторяем пункт 3, раза три четыре, только запарывая жизни. И состояние регистра DS должно быть одинаковым, как в 1 раз.

5) Нажимаем Pause. Нажимаем Alt-X, т.е выходим из программы. Теперь у нас появились файлы 3.dmp, 2.dmp, 1.dmp.

6) Запускаем ДОСовую программу fc.exe такими строками:


fc 3.dmp 2.dmp /b>32.res
fc 2.dmp 1.dmp /b>21.res

У нас появились два файла 32.res и 21.res, заглянув в них мы увидим, что это побитовое сравнение.

7) Значит в первом файле у нас кол-во жизней изменялось с 3 на 2. Ищем строку "03 02" или, если такой не найдено можно попробовать "04 03".

У меня строка "03 02" нашлась на таких строках


0000338B: 03 02
00003F61: 03 02
00003F79: 03 02

Теперь ищем во втором файле строку "02 01".

У меня она нашлась только на строке

Уау, рулез. Мне жутко кажется, что номера 338B одинаковы, значит по этому адресу памяти храниться запись о жизнях.

8) Опять запускаем dg.com magic.exe. Нажимаем F9. Идем туда где можно запороть жизнь. Нажимаем Pause. Переходим в окно данных (где уже были). Нажимаем Ctrl+G. Набираем ds:338B, если все хорошо, т.к. DS - тот же, и мы угадали, то по этому адресу должно находиться текущее кол-во жизней. У нас этот так и есть. Нажимаем F2 (ставим бряк на этот адрес). Затем нажимаем 1, т.к. нам надо только на запись. Запарываем жизнь, и вываливаемя в ДеГлюкере. Переходим в окно кода (основное большое окно), поднимаемся на одну команду вверх и мы видим строку.


CS:0F40:  01068B33    add [338B],ax

Т.е к нашему байту с жизнями добавляется число, если взглянуть на ax увидим FFFF можно понять, что это -1. Значит надо, чтоб эта строка никогда не выполнялась, т.е. забить nop'ами (код 90).

9) Запускаем любой hex-редактор, я обычно пользуюсь встроенным в DosNavigator, там нужно нажать F3, на файле magic.exe, пару раз F4. Нажать F7. И в окне ввода hex-строки вписать 01068B33, нажать Enter. Строка найдена по адресу 1140, нажимаем Ctrl+L(повтор поиска) чтобы удостовериться, что такая строка единственная. У нас это так. Тогда вместо этих чисел вписываем 90909090 (если была бы не одна пришлось бы исправлять несколько раз). Сохраняем файл.

10) Запускаем файл magic.exe. Теряем жизнь, но ее не убрали, работает!!!!!

Вот и все, что сегодня хотел рассказать.

Статья написана исключительно в учебных целях. За любое ее использование автор ответственности не несет.

Все ругательства отправлять в null
Все остальное на lomovskih@yandex.ru

З.Ы. Возможны ошибки. Взлом игры 3 минуты. Написание статьи 50 минут, видите как старался.

With best wishes Fess

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay