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. Очень убедительная просьба к этим товари- щам не портить больше игры! Продолжение следует... _________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября