ZX Power #03
31 декабря 1997

Ликбез - Восстановление программ методом поиска адреса пуска, с помощью перевзлома.

ВОССТАНОВЛЕНИЕ ПРОГРАММ   (продолжение, начало в 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.
Очень убедительная просьба к этим товари-
щам не портить больше игры!

         Продолжение следует... 
_________________________________________




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - стой, стрелять буду!
Обзорчик - Обзор игровых программ: Bedlam, Xevious, Eric and the Floaters, Crazy Cars 1 & 2.
Разное - "бывали такие времена, когда я был готов не задумываясь променять на Dendy".

В этот день...   24 сентября