Взлом TR-DOS по-читерски: руководство от Gasman / RA

Subliminal Extacy #03
Cheat's Guide To TR-DOS Cracking: An Incomprehensible Techy
                   Article By Gasman / RA

В других разделах этого журнала развернулись горячие дебаты по поводу использования собственных (кастомных) загрузчиков в TR-DOS демках, и я не собираюсь продолжать их здесь. Разумеется, было бы просто замечательно, если бы авторы демо выпускали свои релизы в двух вариантах: с быстрым кастомным TR-DOS загрузчиком и в портабельной версии с загрузчиком на Бейсике. Но произойдет ли это в ближайшем будущем или нет, мы все равно останемся с огромным запасом старых демок, существующих исключительно под TR-DOS.

Чтобы справиться с этим по всем правилам, нам пришлось бы досконально изучить все тонкости и трюки системы TR-DOS, затем дизассемблировать загрузчик каждого демо, извлечь все блоки кода и переписать загрузчик на BASIC.

Или же мы можем считерить.

Для начала вот список того, что вам понадобится — во всяком случае то, чем пользуюсь я: несколько демок в формате TRD, эмулятор R80, эмулятор WinZ80 (незарегистрированной shareware-версии вполне должно хватить), эмулятор Z80 и утилита Bintap от Lee 'Blood' Tonks. Вполне возможно, что существует гораздо более простой способ сделать все это без постоянных прыжков между тремя разными эмуляторами. Просто мне очень нравится отладчик, встроенный в WinZ80, вот и все.

Итак, приступим. По сути, нам нужно получить копию демо, находящуюся в памяти в тот момент, когда весь код уже загружен, но сама демка еще не стартовала. Кстати говоря, этот метод работает только с теми демами, которые загружаются за один прием: многофайловые мультилоадеры потребуют некоторых манипуляций с загрузчиком, а в это мне лезть пока не хочется, пока я, кхм, сам не попробую.

Чтобы вычислить точку старта демо, ее можно просто угадать. Программисты любят красивые круглые числа, поэтому демка почти наверняка запускается с 24576 (#6000), 25000 (#61A8), 26000 (#6590), 32768 (#8000) или, если вам совсем не повезло, с 23296 (#5B00), что является, пожалуй, самым неудобным местом во всей памяти. Итак, запускаем R80 и с помощью встроенного монитора вешаем точки останова (breakpoints) на эти адреса. Затем загружаем демо из TRD-файла, и, если повезет, оно остановится на одном из брейкпоинтов. Однако в этот момент вы еще не знаете, завершилась ли загрузка всего кода, поэтому нужно проверить: делаем снимок памяти (снапшот) и загружаем его в другой эмулятор, например в WinZ80. Если демо запускается без проблем — вы нашли верную точку. Если нет — возвращайтесь в R80 и ждите срабатывания следующего брейкпоинта.

Небольшое примечание: R80 не позволяет сохранять снапшоты прямо из монитора. Это ограничение можно обойти следующим образом. Допустим, демо остановилось по адресу #6000. Запишите первые несколько инструкций ассемблера в этом месте, а затем перейдите в редактор памяти и замените байты по адресу #6000 на шестнадцатеричные коды 18 FE. Это не что иное, как команда JR -2, то есть наш старый знакомый — бесконечный цикл. Теперь можно спокойно вернуться в эмулятор: программа надежно зависнет на месте, и вы сможете снять нормальный snapshot. Загрузите его в WinZ80 и восстановите через отладчик оригинальный код на место (ну, тот фрагмент, который вы предварительно записали на бумажке).

Итак, теперь у вас должен быть рабочий снапшот в WinZ80. Настало время для самой занудной части! Пролистайте память и выпишите все адреса, содержащие данные. Там обязательно будет какой-то мусор — например, код самого загрузчика, так что попробуйте затирать подозрительные участки (удобно ввести в отладчике команду asm nop и зажать Enter, пока не перепишете все ненужное) и проверять, продолжает ли демо работать. Да, это означает метод проб и ошибок в чистом виде. Хуже того: помните, что если это демо под 128K — а какие они сегодня еще бывают? — вам придется перелопатить вообще все страницы памяти. Чтобы добраться до дополнительных страниц, поместите по адресу #6000 (или в любое другое место) следующий код:

LD BC,#7FFD
LD A,page     ; это номер страницы, от #10 до #17
OUT (C),A

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

Следующий шаг — сохранить найденные блоки данных по отдельности. Похоже, в WinZ80 нет простого способа сделать это, так что пора пересаживаться на очередной эмулятор — Z80 (DOS-версию). Если загрузить снапшот комбинацией клавиш F10, а затем L (вместо привычной F3), вы попадете в главное меню Z80, откуда по нажатию клавиши X можно сохранить нужные блоки памяти на диск. Теперь у вас есть сырые блоки данных — прогоните их через утилиту Bintap, чтобы получить прекрасные файлы формата TAP.

Вот, собственно, и все... почти! Если загрузить все блоки по правильным адресам, а затем выполнить RANDOMIZE USR 'start', демка должна успешно запуститься. Конечно, довольно глупо держать ее в виде десятка миллионов мелких кусочков, поэтому, если делать работу на совесть, стоит собрать все воедино с помощью приличного компрессора и добавить небольшой загрузочный код, который расставит данные по нужным местам. Но это уже совсем другая история...

gasman

Поделитесь вашим мнением о статье