ВОССТАНОВЛЕНИЕ ПРОГРАММ (продолжение, начало в ZX Power'е#2) (С)1997 Александр Десятниченко _________________________________________ 6.Восстановление программ методом поиска адреса запуска. Конечно, найти старый загрузчик вовзломе и, пользуясь его данными, восста-новить игру достаточно просто. Но такоебывает достаточно редко, обычно только всамых старых играх. Более новые программыпосле загрузки занимают всю память от бу-фера принтера до последнего байта в 65535и, разумеется, никакого старого загрузчи-ка вы в них не обнаружите. Как же посту-пить в таком случае? Если вы уже давноковыряетесь по игровым программам то ли в
поисках бесконечной жизни, то ли в поис-
ках интересных алгоритмов, то, наверное,
вы уже заметили, что во многом программы
похожи друг на друга, я имею ввиду струк-
туру программирования. Обычно в одном
месте хранятся текстовые сообщения, в
другом - графика, в третьем - подпрограм-
мы, оканчивающиеся директивой RET, и, ко-
нечно же, где-то все эти подпрограммы вы-
зываются через CALL из, так сказать, ос-
новной, связывающей программы.Раз такая
программа есть, значит, где-то в ней есть
и начало, - адрес, с которого начинается
запуск игры после того, как вы перейдете
на него из бейсик-загрузчика по команде
RANDOMIZE USR. А если попытаться найти
самому это место и запустить с него прог-
рамму? Именно так чаще всего и приходится
восстанавливать некорректно взломанные
игры. Как же выглядит на языке ассемблера
начало программы? Обычно запуск любой иг-
ры начинается с запрета прерываний, уста-
новки машинного стека, очистки экрана и
установки цвета BORDER, затем идет вывод
на экран игрового меню, формирование таб-
лицы, установка IM 2, запуск мелодии и
т.д. Вот наглядные примеры:
DI
LD SP,32768
SUB A
OUT (#FE),A
Так начинается программа TURBO-BOAT
(как вы знаете, она запускается с адреса
32768). Примерно такое начало у
большинства восстанавливаемых программ.
Бывает также, что основная программа сра-
зу начинается с вызова подпрограмм через
многочисленные CALL, это сразу же броса-
ется в глаза. Не надо боятся эксперимен-
тировать, особенно если вы имеете возмож-
ность быстро многократно перезагружаться
с дисковода, - запишите все "подозри-
тельные" адреса и попробуйте со всех их
позапускать игру. Кроме того, что вы обя-
зательно найдете адрес запуска, вы еще
найдете и точки входа в различные
подпрограммы, которые вас смогут заинте-
ресовать с точки зрения реализации того
или другого интересного алгоритма и вы
потом сможете использовать это в
собственных программах. Этот метод, бе-
зусловно, неплохо подходит и для других
целей, например, для взлома сильно защи-
щенных программ. Зачем, собственно гово-
ря, взламывают загрузчики? Только для то-
го, чтобы узнать адреса загрузки и запус-
ка игры! Так ведь теперь можно вообще ос-
тавить загрузчик в покое и сразу загру-
зить сам кодовый файл и найти в нем адрес
его запуска! Вы скажете, адрес запуска
найдем, а как быть с адресом загрузки?
Поверьте, это тоже возможно. Вы видели
кассетную версию игры RAINBOW ISLANDS,
загрузчик которой отпугивает уже самой
только своей длиной! Это вам не что-ни-
будь, а почти полностью фирменный загруз-
чик фирмы OCEAN, была снята только защита
от копирования самого этого загрузчика.
Так вот, когда у меня еще не было диско-
вода, я, пропустив загрузчик, разобрался
с адресами просмотром самого кодового
файла буквально за полчаса. Ну а если вам
надо найти адрес загрузки кодов, находя-
щихся в MAGIC-файле на дисководе, то
здесь вообще проблем нет, - просматривая
его DISK DOCTOR'ом, STS'ом, можно сразу
определить, где в нем полезная информа-
ция, а где пустое место и соответственно
потом сделать выгрузку. Помочь найти ад-
рес запуска программы может и сам машин-
ный стек. Ведь, прежде чем быть взломан-
ной, программа успела запуститься и вы-
полнить определенные операции, поковыряв-
шись в стеке, можно попытаться опреде-
лить, какие именно и найти это место в
программе, после чего уже "плясать от не-
го". Кстати, некоторые игры распространи-
лись в полувосстановленном виде, напри-
мер, THE SCEPTRE. Если посмотреть, как
она запускается, то увидите, что в ре-
гистры процессора заносятся данные, взя-
тые хакером из стека, после чего он дела-
ет JP на адрес, определенный таким же об-
разом, то есть программа все равно запус-
кается не с начала, а с того места, где
была когда-то остановлена. И еще один
очень интересный момент, касающийся ре-
гистра R. Ведь он, как видите, нигде не
восстанавливается! Так вот, некоторые иг-
ры к нему достаточно чувствительны. Так,
например, если перед JP на адрес запуска
игры A.M.C. в регистр R занести большое
значение, то постоянно в ящиках вам будет
попадаться одно и то же, как следует из
"закона подлости", самое ненужное оружие.
Если же его обнулить, то все в порядке,-
в каждом ящике разное. Ну а в играх фирмы
OCEAN при большом значении в регистре R
перед запуском вообще врагов то нет сов-
сем, а то сразу они ходят толпами, анало-
гично и амуниция, - то не попадается во-
обще, а то вдруг сразу вся в одном месте.
Другими словами, если хотите, чтобы
восстановленная программа, в которой ход
игры задается случайным образом, то есть
в зависимости от значения регистра R (я
думаю, вы сами догадаетесь, как об этом
узнать,- несколько раз перезапустить иг-
ру, поиграть и посмотреть, всегда ли одно
и то же на том же месте, или каждый раз
по-разному), работала нормально, то перед
тем, как сделать JP на адрес старта, об-
нулите регистр R или же попробуйте занес-
ти в него разные значения. Некоторые ко-
деры могут сказать, что ведь с момента
старта и до того места, где в зависимости
от R строится ход игры, сам регистр может
пропрыгать не один десяток циклов... Ну
что ж, попробуйте сами поэкспериментиро-
вать и вы наверняка увидите немало инте-
ресного. По-видимому, авторы игр учли
все, кто его знает, может и ELITE никто
не может пройти из-за того, что в ре-
гистре R не то, что надо...
7.Восстановление программ с
помощью перевзлома.
Данный метод основан на известной на-
родной поговорке "маслом кашу не испор-
тишь". Выше уже был приведен пример того,
как игры многократно перевзламывались,
кочуя от одной системы к другой. Таким
образом, если вы еще раз нажмете на MAGIC
в том же самом месте, где когда-то нажи-
малась кнопка мультифейса, хуже ей вы уже
не сделаете, а вот себе работу значи-
тельно облегчите. Нужно только не забы-
вать, что эта кнопка портит несколько
ячеек в системных переменных, поэтому,
если там есть ценная информация, этот
факт нужно будет учесть. Такой перевзлом
иногда бывает просто незаменимым. Напри-
мер, при восстановлении игр HYPER ACTIVE
и SOLOMON'S KEY я попытался просмотреть
дизассемблером кодовые блоки, а там,
вместо привычных подпрограмм и текстовых
сообщений - сплошная абракадабра. Просто
при взломе этих программ мультифейсная
кнопка была нажата в тот момент, когда
игра уже была загружена, но фирменная
многоступенчатая защита (так называемая
"ксорка") еще не закончила процесс деко-
дировки основного кодового блока. Чтобы
не ломать голову над раскодировкой "вруч-
ную" (а это может быть и невозможным в
данном случае), пришлось загрузить некор-
ректно взломанную программу, дать ей воз-
можность полностью запуститься, а затем
воспользоваться услугами кнопки MAGIC. И
еще. Если для взлома 48К-программ ис-
пользуют 128К-машины с дисководом, то по-
чему бы не использовать эту технику и для
восстановления программ! Ведь в нашем
распоряжении есть прекрасный 128К-дизас-
семблер STS, который обладает большими
возможностями. С помощью этой программы
вы можете загружать MAGIC-файлы целиком в
память компьютера, просмотреть их и внес-
ти любые измeнения, после чего сохранить
на диске в любом нарезанном виде. Таким
образом отпадает необходимость в многок-
ратной загрузке-выгрузке и нарезке-склей-
ке основного кодового блока игры. Но мож-
но обойтись и 48К-машиной, если устано-
вить в нее прошивку с так называемым "те-
невым" монитором, об этом много говори-
лось последнее время. Восстанавливая та-
ким образом программы, вы рано или поздно
натолкнетесь на игру, которая занимает
всю память компьютера. Как выгрузить та-
кой блок и как его потом загрузить? По-
нятно, что пользуясь STS на 128К-машинах
у вас проблем с этим не будет, ну а если
кто-то будет мучиться с восстановлением
программ в пределах 48К, то ему придется
делать примерно так, как делали когда-то
польские хакеры, загружая-выгружая по от-
дельности длинный блок от CLEAR и выше и
короткий длиной 1204-2048 байт. Вы, на-
верное, видели, что многие из восстанов-
ленных программ загружают в конце в зак-
рашенную в черный цвет экранную область
небольшие кодовые блоки длиной 1704 или,
скажем, 1204 байта, а затем, с помощью
процедурки в машинных кодах перебрасывают
эти байты под адрес 23296. Можно и вам
для начала попробовать так сделать. Я
просил бы опытных хакеров и кодеров не
прикалываться с моих подробных разъясне-
ний таких элементарных, порой просто ла-
мерных вещей, ведь основной своей целью я
считаю приобщить многочисленных пользова-
телей к кодерству путем "от простого к
сложному", - сначала это простейший LDIR
в восстановленной игрушке, а затем, может
быть, человеку захочется попробовать и
самому написать... В свою же очередь, я
хотел бы напомнить им о том, что если вы
взялись за восстановление игры, то уж,
пожалуйста, уберите из этого взлома все
лишнее: засоренный стек, обрывки данных,
перенесенных на другое место с помощью
LDDR, старые загрузчики в конце памяти,
старые системные переменные и область
бейсика, значения стека, а то и сам стек
на картинке... Пусть уже восстановленная
вами игра выглядит по-фирменному и изнут-
ри, а то вдруг кто-нибудь захочет посмот-
реть, как вы ее восстановили. И очень уж
большая просьба не менять текстовые сооб-
щения, есть любители завысить год выпус-
ка, вместо имен авторов написать приветы,
извратить фирменный CHEAT.
8.Другие восстановления.
При восстановлении игр вы можете
столкнуться и с другими проблемами. Так,
просматривая листинг игры ELVEN WARRIOR,
можно обнаружить старый загрузчик, из ко-
торого следует, что игра загружалась тре-
мя блоками: заставка, основной блок и му-
зыка для сопроцессора. Ну, с заставкой и
музыкой все ясно, - в этом случае их не
восстановить, а вот саму игру можно поп-
робовать. Казалось бы, все просто, - вы-
тянуть из этого MAGIC-взлома блок длиной
32768 байт, начиная с адреса 24576, и за-
пустить с адреса 33024. Увы, не совсем
так. На экране много сбоев и игра не ра-
ботает. Посмотрим, что находится по адре-
су запуска. Да, здесь много "наворотов" с
преобразованием в памяти компьютера сразу
же после загрузки, - перед тем, как вы-
вести на экран игровое меню, программа
сама себя модифицирует в памяти, идет пе-
реброс кодов с одного места в другое, за-
несение данных в ячейки памяти и т.д.,
причем при этом затираются места програм-
мы, где перед этим находилась полезная
информация, уже переброшенная командами
LDIR в другие участки памяти. Конечно,
если теперь выгрузить файл вышеуказанной
длины и затем снова запустить его с места
старого старта, то она опять начнет вы-
полнять все эти преобразования, перебра-
сывая уже другую информацию в то же самое
место. Такие игры можно восстановить либо
разобравшись со всеми этими перебросами и
установив всю информацию на то место, где
она должна находиться перед стартом игры,
либо же выгрузив всю использованную па-
мять и убрав команды перебросов и преоб-
разований, симулируя, что они уже прои-
зошли. Кстати, вышеприведенный пример
можно использовать и для новой, ориги-
нальной защиты. Например, ваша программа
загружается, запускается и сразу же унич-
тожает часть самой себя, - ту часть, ко-
торая только что уже отработала и больше
не понадобится, теперь уже никто в вашей
программе концов не найдет. И еще по по-
воду ELVEN WARRIOR - меня сильно удручает
тот факт, что эта и некоторые другие игры
(SCEPTRE of BAGDAD, REBEL STAR 2 и т.д.)
были переведены на русский язык ... в не-
восстановленном(!) виде. Теперь немножко
о восстановлении графики. После восста-
новления игры CURRO JIMENEZ оказалось,
что все игровые действия развиваются в
средней части экрана, остальной экран был
черный, сам собой напрашивался вопрос о
том, что, вероятно, во время игры экран
обрамляла красивая статическая графика в
виде рамочки. Когда я тщательно изучил
имеющееся в обрывках игры игровое меню и
и загрузил его в экран без атрибутов
(6144 вместо 6912 байт), на экране отчет-
ливо вырисовалась черно-белая, тщательно
прорисованная рамочка. Осталось только
раскрасить ее и вывести на экран после
выбора управления. Испорченную статичес-
кую графику лечить достаточно просто.
Нужно найти то место в программе, где она
хранится (определить это можно, просмат-
ривая все перебросы, адресованные в эк-
ранную область), выгрузить, подправить в
графическом редакторе и поставить на мес-
то. По-другому обстоит дело со спрайтами,
особенно работающими по маске, для их
восстановления не обойтись без специ-
ального программного обеспечения типа SCE
или SPRITE TOOLS. О подгружаемых играх.
Многие из них взламывались уже тогда,
когда в память был загружен первый уро-
вень. После восстановления такая програм-
ма переходит сразу к игре, не требуя
подгрузки, так как она уже там есть, о
чем свидетельствуют внутренние системные
переменные самой игры. Так у нас появи-
лись RICK DANGEROUS 2, STRIDER и многие
другие игры, у которых первый уровень
представлен дважды: в самой игре и на
ленте или диске сразу за игрой. Ес-
тественно, если вы хотите восстановить
все, как было, то можно попытаться убрать
из памяти этот уровень и внести соот-
ветствующие изменения в системные пере-
менные программы. Нередки ошибки и в са-
мих уровнях, например, в содержащейся в
них графике. Больше всего же приходится
еще заниматься восстановлением режимов
48/128К. Ведь многие игры выпускались
универсальными, работающими с любым объе-
мом памяти. Причем определение типа
компьютера (48/128К) велось из загрузчи-
ка, и если это была 128К-машина, то к иг-
ре еще догружались дополнительные блоки с
музыкой, графикой, шрифтами и т.п. в дру-
гие страницы памяти. К тому же, в специ-
ально отведенную ячейку памяти заносилось
определенное значение. Во время работы
программа обращалась к этой ячейке и со-
ответственно строила свою работу. Конеч-
но, если такая игра была взломана в режи-
ме 128К, то она не может после взлома ра-
ботать на 48К-машине и наоборот. Особенно
это относится к играм фирмы CODEMASTERS.
Так, например, получили широкое
распространение такие игры как KAMIKAZE,
PANIC DIZZY, NINJA MASACRE, COLUMBUS JUM-
BO 1 & 2, SLIGHTLY MAGIC и другие, рабо-
тающие только на 128К-компьютерах, хотя
они выпускались универсальными. Так вот,
практически все фирменные загрузчики CO-
DEMASTERS имели проверку типа машины и
заносили в отдельно выделенную ячейку па-
мяти "отметку" об этом. Когда сама игра
запускается, она обращается к этим ячей-
кам, и если там занесено значение, соот-
ветствующее 128К, то разрешается обраще-
ние к другим страницам памяти и игра соп-
ровождается дополнительной музыкой и гра-
фикой; если же компьютер имеет только
48К, то все это игнорировалось и игра шла
в обычном режиме. Таким образом, если у
вас игра идет на 128К и отказывается ра-
ботать в режиме 48К, то, в первую оче-
редь, проверьте, к какой ячейке она обра-
щается и что там находится. Если такое
обращение есть, то вам останется только
организовать из загрузчика проверку типа
компьютера с занесением соответственного
значения в нужную ячейку памяти и, соот-
ветственно, загрузку или игнорирование
дополнительных блоков. Процедура проверки
может выглядеть примерно так:
XOR A ;заносим в основную
;страницу
LD (#C000),A;по адресу #С000 ноль
LD A,#17
LD BC,#7FFD
OUT (C),A ;пытаемся выбрать
;дополнительную
;страничку
LD (#C000),A;заносим в ячейку
;#C000 число #17
LD A,#10
OUT (C),A ;выбираем основную
;страницу
LD A,(#C000);читаем из #C000
CP #17 ;если здесь #17, у нас
;48 машина,а если 0,то
;это 128 машина
JR NZ,LOOP
XOR A ;обнуляем аккумулятор-
;это константа 48 Кб
JR LOOP1
LOOP LD A,#FF ;а это константа для
;128 Кб
LOOP1 LD (23627),A;заносим константу
;типа компьютера в
;системную переменную
RET
Теперь, когда данная подпрограмма от-
работает, основная программа будет, как и
предусматривалось ранее, находить в ячей-
ке 23627 число, соответствующее типу ма-
шины. Последнее время значительно добави-
лось работы у тех, кто занимается восста-
новлением именно этих режимов в играх,
так как некоторые хакеры, явно не счита-
ясь с интересами 48К-пользователей, пред-
намеренно превращают универсальные,
48/128К-игры (The FLINTSTONES, LED STORM,
YOGI BEAR GREAT ESCAPE и многие другие) в
128K ONLY. И еще хуже, когда из двух
48К-игр делают одну на 128K (PHANTOM F4,
MORTADELLO & FILEMON 2 и т.д.), либо до-
бавляют разной ерунды, дабы растянуть иг-
ру на все 128К, как было сделано с SATAN.
Очень убедительная просьба к этим товари-
щам не портить больше игры!
Продолжение следует...
_________________________________________