ЗАЩИТА ПРОГРАММ
Продолжение.
(Начало: 9-16, 53-60,97-104, 141-146)
3.2 Работа со встроенными машинными кодами.
В предыдущей статье мы с Вами рассмотрели, как блокировать действие защитных управляющих кодов. (Для этих целей была использована специальная программа, существуют и другие способы просмотра, которым будет посвящена следующая статья данного пособия). Однако просмотра содержимого одного лишь Бейсика бывает явно недостаточно для анализа принципа работы программы в целом и становится необходимым изучение встроенных в Бейсик машиннокодовых процедур. Именно этому вопросу и посвящен данный раздел.
Прежде, чем приступать к работе, нам необходимо определиться с целью, которую вы преследуете при вскрытии процедуры в машинных кодах. Если Вы хотите осуществить какие-либо изменения, то Вам необходимо достаточно кропотливое изучение каждого программного блока. В том случае, если Вы просто изучаете принципы программирования тех или иных авторов, то на первое место по степени приоритетности выступает анализ общей структуры программы.
Здесь мы постараемся рассмотреть оба подхода с тем, чтобы иметь представление о каждом из них. Многие из Вас, уважаемые читатели, наверняка сталкивались с программами, вскрытыми хаккерами. Наиболее известным из них является BILL GILBERT, поскольку программы, вскрытые им, получили наибольшее распространение. И многие из Вас наверняка пытались пробраться сквозь дебри его защиты, чтобы попытаться изменить что-либо, или же просто понять ее принцип действия.
Возможно, что это удалось не всем. Однако, не огорчайтесь. Сегодняшний пример мы построим на исследовании программы, вскрытой этим хаккером, а в последующих выпусках исследуем приемы этого взломщика еще более подробно.
В этой статье мы рассмотрим применение процедур в машинных кодах для защиты программ на примере игры GAME OVER (IMAGINE/DINAMIC). Судя по дате, проставленной хаккером, эта программа была взломана им в 1987 году.
Для того, чтобы с наименьшими усилиями вскрывать программы Билла Гилберта, необходимо уяснить несколько деталей его специфической защиты. В будущем это может очень сильно пригодиться. Так, практически все программы, вскрытые этим хаккером, не имеют защиты от BREAK, т.е. программу можно остановить, нажав клавишу BREAK.
Второе - почти все программы в связи с отсутствием защиты от BREAK, имеют мощную защиту от листинга. В большинстве случаев используются защитные POKES совместно с методом зануления и совместно со встроенными процедурами в машинных кодах. Причем, во многих случаях бывает невозможно работать с программой, не блокировав защитные POKES.
И третье - буквально все программы, вскрытые им, имеют защиту от MERGE, аналогичную описанной Главе 3 первого тома.
Защита от MERGE необходима для того, чтобы не удалось достаточно легко блокировать систему защитных POKES.
Зная эти три особенности, будем грамотно осуществлять взлом, не оставляя без внимания ни одну из них. Наиболее разумным методом ввода первого Бейсик-файла в компьютер является ввод его через программу блокировки автозапуска, рассмотренную в разделе 2.3 второго тома. Тогда защитные POKES ни оказали бы никакого влияния на просмотр листинга данной программы. Однако, можно ввести данный Бейсик-файл и просто подав команду LOAD "" . После его загрузки остановить работу программы нажатием клавиши break. Теперь весь экран окрасился в черный цвет, а немного ниже середины экрана в прямоугольной рамке можно увидеть надпись:
CRACKED BY BILL GILBERT © 1987
Естественно, что после загрузки данного Бейсик файла с помощью программы блокировки автозапуска надпись в прямоугольной рамке не появится, поскольку ни одна Бейсик-команда не запустилась на выполнение. Для нас это положение выгодное, поэтому в случае загрузки с использованием LOAD "" нам необходимо наверстать упущенное. Когда это будет сделано, Вам будет сообщено дополнительно.
Во первых, сразу после загрузки, желательно подать команду BORDER 7. Это позволит Вам видеть все команды вводимые с клавиатуры. Желательно еще привести в порядок цвета INK и PAPER, подав команды:
INK 0: PAPER 7
Теперь, подав команду LIST, вы столкнетесь с первичной защитой Билла Гилберта. В данном случае в качестве защиты использована системная переменная 23570. Ее действие немного рассмотрено в Главе 1 первого тома и достаточно основательно в "ZX-РЕВЮ" N10,1991 (стр. 211). Характерным признаком, свидетельствующим об использовании этой системной переменной, является выползание текста снизу вверх вместо раскрутки его сверху вниз, а также появление сообщения: 5 OUT OF SCREEN
(вне экрана) - во время Ваших попыток автоматического листинга. Как Вам уже вероятно известно, подобный эффект достигается после подачи команды
POKE 23570,16
Нормальным состоянием данной системной переменной является наличие там числа 6. Поэтому защиту можно блокировать, подав с клавиатуры команду:
POKE 23570,6.
Только теперь, изменив цвета INK, PAPER и BORDER, а также блокировав действие защитной системной переменной, мы достигли того эффекта, который был получен при использовании для загрузки программы блокировки автостарта. Поскольку все эти изменения осуществила данная программа в ходе своей работы, изменение цветовых атрибутов осуществилось из встроенной подпрограммы в машинных кодах, a POKES, блокирующий защиту, был установлен прямо в Бейсике.
Теперь настало время подробно изучить структуру Бейсик-файла, чтобы через него выйти на программу в машинных кодах - основную цель нашего исследования. Для этих целей используем программу блокировки действия управляющих кодов. Ввиду того, что данный Бейсик-файл имеет значительный объем, необходимо расширить область обработки моей программы. Для этого, после загрузки ее с адреса 62030, необходимо подать команду с клавиатуры:
POKE 62032,1
Если в будущем Вам и этого окажется недостаточно, можно увеличить это число, либо использовать более точный метод, описанный в предыдущем разделе данной главы. Программа действует очень быстро и после команды
RANDOMIZE USR 62030
практически сразу появляется сообщение O.K.
Теперь, после подачи команды LIST, Вы увидите приблизительно такую картину:
0>REM FORMAT *BG19 87 !REM NOT
CONTINUE GO SUB VAL NOT PNOT !NEW NOT "[CODE 22HvPIa! RESTORE STEP ATN 'STORE CODE OPEN #RETURN >STEP ! 'PLOT 'XCOPY "[>x2> 2" STEP INT $ STEP INT $ STEP INT $ COPY STEP INT $!X'INK <> COPY 1111AND ))/<>:BCBB^P^LIST LLIST > = %CHR$
""CHR$
PPFPP^LIST rem J*FOR BRIGHT RUN DATA POKE > t c<
0>REM ! @ GO SUB VAL ICOPY NOT @! VAL К "SAVE GO SUB VAL NOT l#
0>GO TO USR (PEEK VAL "23635"+VAL "2 56"*PEEK VAL "23636"+ VAL "17")
1 POKE VAL "23 570", VAL "16": LOAD "GAME OVER$"CODE VAL "5E4": CLS: RANDOMIZE USR VAL "5E4"
2 LOAD "Game over1 "CODE: LOAD "Game Over2"CODE: CLS: LOAD "Game OVER3" CODE: RANDOMIZE USR VAL "24100"
Здесь первые две строки с нулевыми номерами - это встроенные процедуры в машинных кодах. Третья строка, имеющая номер 0, запускает машинный код на выполнение командой:
GO TO USR
Если вы вызовите эту строку командой EDIT для редактирования и замените GO TO USR оператором PRINT, стерев предварительно номер строки, то получите, что Вы просите компьютер напечатать адрес старта процедуры в кодах. После нажатия клавиши ENTER вы получите число 23772. Это и есть адрес запуска встроенной процедуры в кодах. Именно туда идет реальное обращение Бейсик-программы, т.к. это первая реально выполняющаяся строка, ввиду того, что все предыдущие начинались командой REM.
Для того, продисассемблировать данный машинный код, необходимо воспользоваться специальной системной программой, предназначенной для этих целей. Я использовал программу MONITOR 48, причем открыл в ней дополнительный режим, намного упростивший работу в данном конкретном случае, а в принципе он упрощает процесс изучения и отладки любых программ в машинных кодах.
ПРИМЕЧАНИЕ
В большинстве справочной литературы к программе MONITOR 48, данный режим работы этой программы не описан. Отсутствует эта информация и в фирменной инструкции, перевод которой был подготовлен "ИНФОРКОМом". Поэтому сегодня в конце раздела приведена специальная статья с описанием этого нового режима работы.
Поскольку сегодня мы работаем с программой, вскрытой Биллом Гилбертом, то надо указать на одну из особенностей его программирования встроенных в Бейсик машиннокодовых процедур. Перед началом работы, вся подпрограмма в машинных кодах переносится в область памяти, начиная с 50000 и лишь потом она начинает работать уже в этой области оперативной памяти.
Не является исключением и наш случай, программа в машинных кодах начинается следующими командами:
5CDC LD HL,5CEA
5CDE LD DE,C350
5СЕ2 LD BC, 03E8
5СЕ5 LDIR
5СЕ7 JP C350
5СЕА LD HL, C3E6
Как видно из приведенной выше распечатки, строки 5CDC - 5СЕ2 подготавливают регистры процессора для переноса блока памяти командой LDIR. После этого осуществляется безусловный переход на начальный адрес уже перемещенного блока, т.е. 50000 (С350Н). Строка 5СЕА дана для того, чтобы Вы имели представление о точке, с которой начинается перенос кодов на новое место
Необходимый для понимания принципа работы программы дисассемблер приведен ниже уже для новых адресов.
С350 |
21Е6С3 |
|
LD HL,LC3E6 |
|
С353 |
227В5С |
|
LD (#5С7В),HL |
С356 |
AF |
|
XOR A |
|
С357 |
328D5C |
|
LD (#5C8D),А |
|
С35А |
32485C |
|
LD (#5С48),А |
|
C35D |
76 |
|
HALT |
|
С35Е |
01А761 |
|
LD ВС,#61А7 |
|
С361 |
210313 |
|
LD HL,#1303 |
|
C364 |
Е5 |
|
PUSH HL |
|
C365 |
CDB71E |
|
CALL #1EB7 |
|
C368 |
21761B |
|
LD HL,#1B76 |
|
С36В |
E5 |
|
PUSH HL |
|
C36C |
AF |
|
XOR A |
|
C36D |
D3FE |
|
OUT (#FE),A |
|
C36F |
3E02 |
|
LD A, #02 |
|
C371 |
CD0116 |
|
CALL #1601 |
|
C374 |
21C9C3 |
|
LD HL, C3C9 |
|
C377 |
7E |
LC377 |
LD A,(HL) |
|
C378 |
FEFF |
|
CP #FF |
|
C37A |
CA81C3 |
|
JP Z,LC381 |
|
C37D |
D7 |
|
RST #10 |
|
C37E |
23 |
|
INC HL |
|
C37F |
18F6 |
|
JR LC377 |
|
C381 |
2158FF |
LC381 |
LD HL,#FF58 |
|
C381 |
227BC5 |
|
LD (#5C7B),HL |
C387 |
3E78 |
|
LD A,#78 |
|
C389 |
3E905C |
|
LD (#5C90),A |
|
C38C |
3E20 |
|
LD A,#20 |
|
С38Е |
32915С |
|
LD (#5C91),A |
|
C391 |
0E36 |
|
LD C,#36 |
|
C393 |
060E |
|
LD B,#0E |
|
C395 |
CDE522 |
|
CALL #22E5 |
|
C398 |
0E9B |
|
LD C,#9B |
|
C39A |
0600 |
|
LD B,#00 |
|
C39C |
1E01 |
|
LD E,#01 |
|
C39E |
1600 |
|
LD E,#00 |
|
C3AO |
CDBA24 |
|
CALL #24BA |
|
C3A3 |
0E00 |
|
LD C,#00 |
|
C3A5 |
060B |
|
LD B,#0B |
|
C3A7 |
1E00 |
|
LD E,#00 |
|
C3A9 |
1601 |
|
LD D,#01 |
|
C3AB |
CDBA24 |
|
CALL #24BA |
|
СЗАЕ |
0Е9В |
|
LD C,#98 |
|
C3B0 |
0600 |
|
LD B,#00 |
|
C3B2 |
1EFF |
|
LD E,#FF |
|
C3B4 |
1600 |
|
LD D,#00 |
|
C3B6 |
CDBA24 |
|
CALL #24BA |
|
C3B9 |
0E00 |
|
LD C,#00 |
|
СЗВВ |
060В |
|
LD B,#0B |
|
C3BD |
1E00 |
|
LD E,#00 |
|
C3BF |
16FF |
|
LD D,#FF |
|
C3C1 |
CDBA24 |
|
CALL #24ВА |
|
C3C4 |
215827 |
|
LD HL, #2758 |
|
C3C7 |
D9 |
|
EXX |
|
C3C8 |
C9 |
|
RET |
|
C3C9 |
161307 |
LC3C9 |
DEFB #16,#13, |
#07 |
C3CC |
110210 |
|
DEFB #11,#02, |
#10 |
C3CF |
071301 |
|
DEFB #07,#13, |
#01 |
C3D8 |
909192 |
|
DEFB #90,#91, |
#92 |
C3D5 |
939495 |
DEFB |
#93 |
#94 |
#95 |
C3D8 |
969798 |
DEFB |
#96 |
#97 |
#96 |
C3DB |
999A9B |
DEFB |
#99 |
#9A |
#9B |
C3DF |
9C9D9E |
DEFB |
#9C |
#9D |
#9E |
C3E1 |
9FAOA1 |
DEFB |
#9F |
#A0 |
#A1 |
C3E4 |
A2FF |
DEFB |
#A2 |
#FF |
|
C3E6 |
000000 |
LC3E6 DEFB |
#00, |
#00, |
#00 |
C3E9 |
000000 |
DEFB |
#00 |
#00 |
#00 |
C3EC |
000000 |
DEFB |
#00 |
#00 |
#00 |
C3EF |
1D2121 |
DEFB |
#1D |
,I, |
,I, |
C3F2 |
21211D |
DEFB |
,, I ,, |
,I, |
#1D |
C3F5 |
0000C6 |
DEFB |
#00 |
#00 |
#C6 |
C3F8 |
29292F |
DEFB |
) |
) |
|
C3FB |
C92900 |
DEFB |
#C9 |
|
',#00 |
C3FE |
003A |
DEFB |
#00 |
|
|
Если Вы внимательно изучите приведенный дисассемблированный код, то достаточно быстро поймете, что это не вершина программирования в машинных кодах. Хотя следует признать, что подход, примененный в этой программе достаточно оригинален. Я не буду подробно излагать здесь описание данной процедуры, а лишь немного расскажу о ней, чтобы Вы имели обшее представление о принципах ее работы.
После необходимых подготовительных процедур осуществляется печать текстовой информации. Причем любопытен сам метод формирования этой текстовой информации. Данный текст сформирован с помощью UDG графических символов пользователя. Именно в них содержится надпись CRACKED BY BILL GILBERT. Это объясняет и необычно мелкий шрифт данного сообщения. Кроме того, данный прием позволяет обойти попытки будущих взломщиков найти, где находится этот текст с помощью средств поиска заданной символьной строки, которые есть в любой отладочной программе.
Теперь Вы имеете доступ к изменению данного сообщения (разумеется, исключительно из чистого любопытства). Причем, следует отметить, что банки UDG символов не переносятся в верхние области памяти, а всего лишь изменяется значение системной переменной, указывающей на месторасположение этих символов.
После распечатки текста идут процедуры вычерчивания линий. Поскольку это прямоугольная рамка, то линий достаточно 4. Эти процедуры легко обнаружить, как четыре почти однотипных блока.
Как видите, нет ничего сложного. Я надеюсь, что приведенная информация развеет миф о надежности защиты Билла Гилберта. Хочется также надеяться, что наши уважаемые читатели не будут злоупотреблять полученной информацией (об этом мы уже писали в Главе 2 первого тома).
В заключение надо добавить, что здесь рассмотрен лишь один из по меньшей мере трех известных автору способов защиты информации, практикуемых Биллом Гилбертом. Практически аналогичные приемы применены во вскрытых им EXOLON, DEATH WISH 3 и др. А в программах EAGLES NEST и SAS, вскрытых этим хаккером, реализован уже совершенно иной принцип защиты, несмотря на схожесть картинки с сообщением. К более подробному рассмотрению типов защиты программ у Била Гилберта мы еще вернемся.
Глава 4. Изучение блоков в машинных кодах.
4.1 Введение.
Как Вы уже вероятно догадались, данный раздел посвящен вскрытию блоков, целиком записанных в машинном коде. Наши читатели по-видимому понимают, что за изучением блоков машинного кода последует самостоятельное программирование в машинном коде, а это уже приципиально новый уровень Вашей работы с компьютером. Только поднявшись до этого уровня Вы сможете полностью почувствовать всю мощь и быстродействие Вашей машины, только здесь Вы сможете полностью использовать все ее возможности.
При изучении программирования в машинных кодах, вам обязательно захочется исследовать какие-либо фирменные программные разработки, чтобы узнать новые приемы в программировании и обогатить свой арсенал. Но большинство программ имеют
высококлассную защиту, обойти которую не так просто.
А вот еще одна более реальная ситуация. Предположим, Вы открываете "ZX-РЕВЮ" или другую специальную литературу и видите POKES, т. е. информацию о том, как ввести в игру бессмертие, изменить количеству оружия и пр. Но во многихслучаях первые попытки ввести POKES в программу ничего не дают.
Почему? Да потому, что большинство программ, в которые приятно поиграть на досуге, имеют высококлассные загрузчики в машинных кодах, которые и запускают загруженную программу. А Ваши попытки изменить содержимое ячеек, в которые впоследствии будет загружаться программа, естественно, ни к чему не приведут. И в этом случае нельзя винить авторов, давших POKES. Они изложили всю необходимую информацию, а теперь вашей задачей является правильно ею воспользоваться.
Данная статья имеет среди прочих и цель научить вас, уважаемые читатели, самостоятельно пользоваться необходимой информацией как для изучения новых приемов программирования, так и для установки необходимых POKES. Причем последний вопрос настолько актуален сейчас, что мы рассмотрим два примера предлагаемых POKES непосредственно из "ZX-РЕВЮ".
4.2 Адаптация фирменных программ под индивидуальный вкус.
4.2.1 Адаптация программы GREEN BERET.
Если Вы внимательно читаете "ZX-РЕВЮ", то вам должно быть известно, что такое POKES и для чего они применяются. Однако, если Вы внимательно изучите таблицы POKES, то обратите внимание, что в большинстве случаев предложено лишь значение ячейки памяти и ее содержимое. Собственно говоря, больше Вам ничего знать и не понадобится за одним исключением - необходимо знать как осуществить изменение содержимого указанных ячеек памяти на необходимые значения.
Проблема эта возникает в связи с тем, что почти все хорошие программы имеют загрузчик в машинных кодах и с помощью функции Бейсика РОКЕ Вам ничего достичь не удастся. Не всегда помогает и COPY COPY, поскольку не все программы имеют начальный адрес загрузки 23896, а чтобы узнать этот начальный адрес опять-таки необходимо изучать загрузчик в кодах. Конечно, хорошо бы иметь DISK-MONITOR, позволяющий прервать работу программы и, осуществив необходимые изменения, вновь возвратиться в нее. Однако не у всех читателей он есть и не все собираются в перспективе его устанавливать.
Итак, рассмотрим в качестве примера программу GREEN BERET, одну из лучших "стрелялок" для "ZX SPECTRUM", которая несмотря на некоторую политическую окраску достаточно популярна и у нас в стране. Однако многим читателям явно не хватает предоставленных игрой трех жизней и трех выстрелов из огнемета. Казалось бы, если изменить хотя бы один из этих параметров, то игру удастся одолеть без труда, не говоря уже о том случае, когда удастся изменить их оба сразу. Причем, что самое любопытное - вся необходимая для этой цели информация есть в "ZX-РЕВЮ" (см. N7,8,10 - 1991). Остается лишь изменить содержимое указанных там ячеек, но именно здесь и возникает проблема, поскольку в программе применен собственный загрузчик в машинных кодах, который и осуществляет потом загрузку и запуск программы.
Для того, чтобы правильно вести работу, Вам в первую очередь понадобится узнать структуру всей программы. Это можно осуществить, загрузив ее в один из копировщиков, например ZX COPY 87, TF COPY и т. д. Информация для GREEN BERET, полученная таким образом на копировщике ZX COPY 87:
01 GREENBERET BASIC 10 67
02 67
03 Т.Р.15006 CODE 33475 794
04 794
05 17
06 6912
07 10303
08 30832
Здесь Вы видите, что небольшая Бейсик-программа загружает и запускает загрузчик в машинных кодах, который и осуществляет дальнейшую загрузку файлов, а в конце концов их запуск. Причем, как видим, файлы, загружавшиеся после загрузчика, идут без хэдера, т. е. правильная загрузка их без "родного" загрузчика практически невозможна, поскольку именно он знает адрес памяти, с которого необходимо осуществить загрузку.
Любопытна судьба блока кодов длиной 17 байтов, идущего сразу после загрузчика. Если Вы внимательно изучите программу-загрузчик, то достаточно быстро поймете, что этот коротенький файл в перспективе затирается более мощным программным блоком. Т.е. фактически для работы программы он не нужен. Кроме того, если Вы обратили внимание, он загружается вызовом специальной подпрограммы, загружаемой вместе с загрузчиком. Я думаю, что это не случайно, как не случаен и тот факт, что длина этого блока совладает с видимой длиной "хэдера". По моим предположениям этот блок служил для защиты от копирования, поскольку некоторые версии копировщиков принимали его за "хэдер", после чего не могли правильно интерпретировать его содержимое и копирование становилось невозможным. Однако появившиеся в последние годы польские копировщики ZX COPY 87, TF COPY, TF COPY-2 свели на нет данный метод защиты, отголоски которого мы можем наблюдать в этой программе, однако вернемся к ее более подробному исследованию, поскольку именно оно поможет нам осуществить желаемые изменения.
Ниже представлен листинг Бейсика данной программы. (Сразу следует оговориться, что версий программы GREEN BERET, распространенных в нашей стране по-видимому несколько. Здесь рассматривается версия, вскрытая TOMI & DALI. Об этом свидетельствует надпись слева на картинке CRACKED BY TOMI & DALI.
GREEN BERET LLIST
10 BORDER 0: PAPER 0: INK 0: CLEAR 65535 20 LOAD ""CODE: RANDOMIZE USR 34132
Как видим, данная программа на Бейсике достаточно проста и не имеет никакой защиты. Это может объясняться тем, что используется загрузчик в машинных кодах и авторы настолько уверены в психологическом барьере, отпугивающем пользователей от машинных кодов, что не потрудились даже установить какую-либо защиту.
С другой стороны, возможно, что защита БЕЙСИКа все же была, но ее уже снял кто-то из взломщиков.
Наиболее ценной информацией, которую мы почерпнули из данной Бейсик-программы является то, что загрузчик в машинных кодах запускается с адреса 34132.
Рассмотрим теперь дисассемблер загрузчика, начиная со стартового адреса. Необходимо сразу предупредить читателя, что встроенный загрузчик не рассматривается здесь как таковой, а исследуется лишь как подпрограмма, к которой осуществляется обращение. Нам необходимо знать, в какой последовательности загружаются программные файлы и благодаря этой информации найти в программе место, с которого осуществляется запуск программы на выполнение.
Правильная адаптация программы и предполагает именно проведение всей загрузки, а перед самим запуском внесение изменений в машинный код, т.е. исполнение POKES.
На этом пути Вас ждут многие проблемы, но основные среди них - поиск точки запуска программы и правильное внесение изменений, сопряженное с программированием в машинном коде.
Программа-загрузчик использует для своей работы две процедуры - встроенную в ПЗУ и загружаемую в компьютер. Имея перед собой информацию, полученную из копировщика, Вы легко разберетесь, как работает программа.
Фальшхэдер загружается специальной процедурой программы загрузчика. Больше данная процедура нигде не используется. За это отвечают строки 34147 - 34157.
Как видим, данная процедура мало чем отличается от стандартной. Она загружает 17 байтов, начиная с ячейки памяти 36864, о чем свидетельствуют значения, загружаемые в регистры DE и IX соответственно.
Следующий блок программы 34160 - 34174 осуществляет загрузку экрана. Об этом свидетельствует длина файла 6912 и начало загрузки с адреса 16384.
После этого исполнение программы "передается" на адрес 33639 (информация о дисассемблере данной области приведена ниже).
Здесь осуществляется загрузка третьего и четвертого блоков кодов с использованием встроенной процедуры, расположенной в ПЗУ по адресу 1366.
Далее в строках 33665-33670 изменяется содержимое одной из ячеек памяти, после чего управление возвращается на 34180.
После включения прерывания командой IM 1 осуществляется корректировка содержимого памяти, т.е. перенос содержимого ячеек из одной области в другую. Это осуществляется с использованием команды LDIR. по всей видимости, это тоже один из видов защиты.
Далее идут команды изменения содержимого отдельных ячеек памяти и, наконец, переход JP 32768.
Это и есть переход в программу для запуска игры, поскольку все блоки кодов уже загружены, и кроме этого осуществлены необходимые защитные корректировки. Здесь этот безусловный переход осуществляется в "новую" область, т.е. в один из блоков загруженной программы. Однако, не всегда это может оказаться так. Чтобы быть уверенным в достоверности полученной информации, Вам необходимо проверить свое предположение на практике. Проверка показала, что высказанное здесь предположение с успехом подтвердилось.
34132 |
F3 |
DI |
34133 |
31FFFF |
LD SP,65535 |
34136 |
310058 |
LD HL, 22528 |
34139 |
010300 |
LD ВС, 00003 |
34148 |
3600 |
L855E LD (HL),#00 |
34144 |
23 |
INC HL |
34145 |
10FB |
DJNZ L855E |
34147 |
37 |
SCF |
34148 |
3EFF |
LD A,#FF |
34150 |
DD210090 |
LD IX,36864 |
34154 |
111100 |
LD DE,00017 |
34157 |
CDE684 |
CALL 34082 |
3416O |
DD210040 |
LD IX,16384 |
34164 |
37 |
SCF |
34165 |
11001B |
LD DE,06912 |
34168 |
215884 |
LD HL,33860 |
34171 |
225684 |
LD (33878),HL |
34174 |
CD5605 |
CALL 01366 |
34177 |
C36783 |
JP 33639 |
34180 |
B7 |
OR A |
34181 |
00 |
NOP |
34182 |
00 |
NOP |
34183 |
00 |
NOP |
34184 |
ED47 |
LD I,A |
34186 |
215827 |
LD HL,10072 |
34189 |
D9 |
EXX |
34190 |
FD213A5C |
LD IY,23610 |
34194 |
ED56 |
IM 1 |
34196 |
2I4O83 |
LD HL,33600 |
34199 |
1141S3 |
LD DE,22601 |
34202 |
015402 |
LD ВС,00596 |
34205 |
3600 |
LD (HL),#00 |
34207 |
EDB0 |
LDIR |
34209 |
AF |
XOR A |
34210 |
320A80 |
LD (32778),A |
34213 |
320B80 |
LD (32779),A |
34216 |
C30080 |
JP 32768 |
34219 |
D1 POP |
DE |
34220 |
7C LD |
A,H |
34221 |
FE01 |
CP #01 |
34223 |
F5 |
|
PUSH AF |
34224 |
AF |
|
XOR A |
34225 |
E638 |
|
AND #38 |
34227 |
0F |
|
RRCA |
3422B |
0F |
|
RRCA |
34229 |
0F |
|
RRCA |
34230 |
D3FE |
|
OUT (#FE),A |
23232 |
F1 |
|
POP AF |
34233 |
D8 |
|
RET C |
34234 |
C34083 |
|
JP 33600 |
34237 |
14 |
|
INC D |
34238 |
282A |
|
JR Z,34282 |
34240 |
1EFF |
|
LD E, #FF |
34242 |
1A |
|
LD A,(DE) |
34243 |
1000 |
|
DJNZ L85C5 |
34245 |
5B |
L85C3 |
LD E,E |
34246 |
3F |
|
CCF |
34247 |
2810 |
|
R Z,L85D9 |
34249 |
00 |
|
NOP |
34250 |
88 |
|
ADC A,B |
34251 |
1F |
|
RRA |
34252 |
4E |
|
LD C,(HL) |
34253 |
00 |
|
NOP |
34254 |
00 |
|
NOP |
34255 |
00 |
|
NOP |
3425E |
27 |
|
DAA |
34257 |
23 |
|
INC HL |
34258 |
00 |
|
NOP |
34259 |
00 |
|
NOP |
34260 |
00 |
|
NOP |
34261 |
00 |
|
NOP |
34262 |
00 |
|
NOP |
34263 |
00 |
|
NOP |
34264 |
D0 |
|
NOP |
34265 |
00 |
L85D9 |
NOP |
34266 |
00 |
|
NOP |
33639 |
DD21005B |
|
LD IX,23296 |
33643 |
113F28 |
|
LD DE,10303 |
33646 |
37 |
|
SCF |
33647 |
3EFF |
|
LD A,#FF |
33649 |
CD5605 |
|
CALL 01366 |
33652 |
DD21DD85 |
|
LD IX,34269 |
33656 |
11147A |
|
LD DE,31252 |
33659 |
37 |
|
SCF |
33660 |
3EFF |
|
LD A,#FF |
33662 |
CD5605 |
|
CALL 01366 |
33655 |
3E00 |
|
LD A,#00 |
33667 |
323385 |
|
LD (34099),A |
33670 |
3A3385 |
|
LD A,(34099) |
33673 |
C38485 |
|
JP 34180 |
Ниже приведены изменения, которые необходимо сделать, чтобы осуществить одновременное изменение количества жизней и оружия. Рассмотрим эту информацию
более подробно.
34216 |
03CB85 |
JP L85CD |
34219 |
D1 |
POP DE |
34220 |
7C |
LD A,H |
34221 |
FE01 |
CP #01 |
34223 |
F5 |
PUSH AF |
34224 |
AF |
XOR A |
34225 |
Е638 |
AND #38 |
34237 |
0F |
RRCA |
34228 |
0F |
RRCA |
34229 |
0F |
RRCA |
34230 |
D3FE |
OUT (#FE),A |
34232 |
F1 |
|
POP AF |
34233 |
D6 |
|
RET C |
34234 |
C340B3 |
|
JP 33600 |
34237 |
14 |
|
INC D |
342338 282А |
|
JR Z,34282 |
34240 |
1EFF |
|
LD E,#FF |
34242 |
1A |
|
LD A,(DE) |
34243 |
1000 |
|
DJNZ L85C5 |
34245 |
5E |
L85C5 |
LD E,E |
34246 |
3F |
|
CCF |
34247 |
2810 |
|
JR Z,L85D9 |
34E99 |
00 |
|
NOP |
34250 |
88 |
|
ADC A,B |
34251 |
1F |
|
RRA |
34252 |
4E |
|
LD C,(HL) |
34253 |
21ECB6 |
L85CD |
LD HL,46828 |
34256 |
77 |
|
LD (HL),A |
34257 |
23 |
|
INC HL |
34256 |
77 |
|
LD (HL),A |
34259 |
23 |
|
INC HL |
34260 |
77 |
|
LD (HL),A |
34261 |
215CA4 |
|
LD HL,42076 |
34264 |
77 |
|
LD (HL),A |
34265 |
С30080 |
L85D9 |
JP 32766 |
34268 |
85 |
|
ADD A,L |
34269 |
00 |
|
NOP |
Как нам уже известно, строка 34216 осуществляет запуск игры, т.е. к этому моменту загрузка закончилась и закончился также необходимый перенос информации в нужные ячейки командой LDIR. Это именно та точка, которая нужна для осуществления необходимых изменений. Теперь будем рассуждать с точки зрения рядового пользователя компьютером. Если по адресу 34216 осуществляется запуск игры, то значит команды, размещенные в ячейках 34219-34252 просто не нужны. Однако, с другой стороны, весьма маловероятно, что они являются "мусором". Не разбираясь глубоко в принципе работы программы, можно предположить, что они используются загрузившейся программой в процессе ее работы, либо же служат, как переменные загрузчика. Такие логические рассуждения необходимы для того, чтобы безошибочно определить место размещения будущей специальной подпрограммы, изменяющей содержимое ячеек памяти. Как видим, наиболее приемлемым местом является область 34253-34268, поскольку здесь есть немного "пустого" места и мы ножем не опасаться, что чему-либо помешаем.
Верхний предел связан с тем, что с адреса 34269 начинается загрузка блока машинных кодов, - информация, которую Вы могли узнать, внимательно ознакомившись с загрузчиком. Теперь нам необходимо достаточно экономно расходовать память при составлении своей процедуры изменения, чтобы уложиться в отведенное пространство 13 байтов.
Как вам уже вероятно известно, в этой программе необходимо внести следующие изменения:
- для бесконечного оружия
46328,0
46329,0
46330,0
- для изменения количества жизней
42076,0
Машинный код, который выполнит необходимые изменения. Вы можете видеть в строках 34253 - 34265.
Таким образом, в том месте, где загрузчик должен запускать игру, мы поставили "жучка", который запускает процедуру для изменения количества жизней и оружия, расположенную по адресу 34253. А после осуществления необходимых изменений в ячейках памяти процедура сама запускает игру на исполнение.
После таких изменений игра становится даже не интересной - Вы можете дойти до конца буквально за 10 минут. Поэтому мы рекомендуем Вам просто изменить количество выстрелов из огнемета - тогда в игру станет играть чуть легче, но не настолько, чтобы быстро потерять к ней интерес.
Для тех, кто решит сохранить данные изменения, рекомендуем записать информацию на магнитофон, подав команду: SAVE "G^CORR." CODE 33475,794
Для тех читателей, которые не имеют ни малейшего представления о машинных кодах Z80 и не желают их изучать, Я предлагаю измененный вариант Бейсик-загрузчика, который перед запуском программы в кодах вносит в нее все вышеописанные изменения.
10 BORDER 0: PAPER 0: INK 0:CLEAR 65535 20 LOAD ""CODE
30 POKE 34217,205: POKE 34218,133 40 FOR i=34253 TO 34267 50 READ A: POKE I,A 60 NEXT I
70 DATA 33,236,182,119,35,119,33,92,164,119,195,0,128 80 RANDOMIZE USR 34132
4.2.2. Новые возможности программы "RENEGADE".
Если Вы внимательно изучили содержимое предыдущего раздела и достаточно подробно разобрались с предложенной вашему вниманию программой, то теперь должны достаточно хорошо разбираться в подобного рода вопросах, поскольку программа GREEN BERET имеет достаточно сложный загрузчик. Однако, возможно, что не у всех хватило терпения и желания подробно изучить предложенное выше описание и потому для тех, кто просто пролистал материал предыдущего раздела, мы предлагаем разобраться с более простой программой RENEGADE. (Конечно, слово "простой" не относится к программе, а только к ее загрузчику).
В этой программе, как и в GREEN BERET не требуется много размышлять, но эта игра достаточно популярна. Здесь так же, как и в GREEN BERET количества жизней, предложенных вначале, бывает недостаточно для прохождения программы до конца.
Бейсик-загрузчик имеет вид:
10 POKE 23624,71: POKE 23693,71:
CLS: LOAD ""CODE: LOAD "SCREEN$: RANDOMIZE USR 64000
Запуск машиннокодового загрузчика выполняется, как видите, с адреса 64000. Посмотрим, что там содержится.
64000 |
DD21005B |
LD IX,23296 |
64004 |
11009F |
LD DE,40704 |
64007 |
37 |
SCF |
64008 |
3EFF |
LD A,#FF |
64010 |
CD5605 |
CALL 01366 |
64013 |
31FFFF |
LD SP,65535 |
61016 |
C3CB5C |
JP 23755 |
64019 |
32485С |
LD (23624),A |
64022 |
CD6B0D |
CALL 03435 |
64025 |
21003D |
LD HL,15616 |
61028 |
113000 |
LD DE,00048 |
64031 |
00 |
NOP |
64032 |
00 |
NOP |
Если Вы внимательно изучите и эту короткую программу, то достаточно быстро поймете, что в адресах 64000-64010 осуществляется непосредственная загрузка главного блока (как Вам уже вероятно известно, в программе RENEGADE загружаются два блока в машинных кодах). Однако нас сейчас интересует только первый, являющийся
машиннокодовым загрузчиком.
Почти сразу после загрузки главного блока осуществляется безусловный переход по команде: JP 23755.
Чтобы осуществить необходимые изменения, нам необходимо воспользоваться данным переходом. Вместо того, чтобы переходить на адрес 23755, мы перейден на адрес 64031, где разместим программу, осуществляющую необходимые изменения, и, осуществив их, перейдем на адрес 23755.
Измененный загрузчик для RENEGADE, набранный в ассемблере "EDITAS-48".
10 |
ORG 64000 |
20 |
LD IX,23296 |
30 |
LD DE,40704 |
40 |
SCF |
50 |
LD A, 255 |
60 |
CALL 1366 |
70 |
LD SP,65535 |
80 |
JP NEW |
90 |
LD (23624),A |
100 |
CALL 03435 |
110 |
LD HL,15616 |
120 |
LD DE, 0048 |
130 |
NEW LD HL,41047 |
140 |
LD A,162 |
150 |
LD (HL),A |
160 |
LD HL, 30301 |
170 |
LD A,195 |
180 |
LD (HL),A |
190 |
JP 23755 |
200 |
END |
Перед вами дисассемблер измененного загрузчика. Эта версия проверена автором и вполне работоспособна.
ПРИМЕЧАНИЕ.
В "ZX-РЕВЮ" N7,8 за 1991г. была дана информация об изменении количества жизней и времени в программе RENEGADE. Однако приведенная там БЕЙСИК-программа не работает с имеющейся у автора версией программы. Для тех, у кого тоже есть такие проблемы дается другой вариант адаптации. Подчеркнуты те байты, которые нуждаются в
изменении. |
|
|
|
|
|
64000 |
DD |
21 |
00 |
5В |
|
64004 |
11 |
00 |
9F |
37 |
...7 |
64008 |
ЗЕ |
FF |
CD |
56 |
>.MV |
64012 |
05 |
31 |
FF |
FF |
.1.. |
64016 |
СЗ |
1F |
FA |
32 |
C.z2 |
64020 |
48 |
5С |
CD |
6B |
НМК |
64024 |
0D |
21 |
00 |
3D |
.!.! |
64028 |
11 |
30 |
00 |
21 |
.0.! |
64032 |
57 |
А0 |
3Е |
B6 |
W >6 |
64036 |
77 |
21 |
5D |
76 |
w!]v |
64040 |
3Е |
C3 |
77 |
C3 |
>CvC |
54044 |
СВ |
5С |
00 |
00 |
К.. |
64046 |
00 |
00 |
00 |
00 |
|
64052 |
00 |
00 |
00 |
00 |
|
64056 |
00 |
00 |
00 |
00 |
|
64060 |
00 |
00 |
00 |
00 |
|
64064 |
00 |
00 |
00 |
00 |
|
64068 |
00 |
00 |
00 |
00 |
|
64072 |
00 |
00 |
00 |
00 |
|
64076 |
00 |
00 |
00 |
00 |
|
Новый же БЕЙСИК-загрузчик, способный внести эти изменения выглядит так:
RENEGADE NEW LOADER LLIST
10 POKE 23624,71: POKE 23693,71:CLS: LOAD ""CODE: LOAD ""SCREEN$ 20 POKE 64017,31: POKE 64018,250 30 FOR I = 64031 TO 64045 40 READ A: POKE I, A 50 NEXT I
60 DATA 33,87,160,62,182,119,33,93,118,62,195,119,195,203,92 100 RANDOMIZE USR 64000
Том 3. Методы известных взломщиков компьютерных программ к ZX
SPECTRUM.
Введение.
Эта книга написана для тех, кто внимательно изучил информацию первого и второго тома и теперь желают расширить свои знания путем исследования методов известных хаккеров.
Начало взлома компьютерных программ к "ZX SPECTRUM" относится приблизительно к 1986-1987 г.г. По всей видимости, это связано с тем, что фирмы-изготовители программного обеспечения с этого периода начали интенсивно защищать свои продукты от несанкционированного просмотра. Это, в свою очередь, было связано с существенными прорывами в технике программирования для даного компьютера и, кроме того, к такому поведению фирмы подтолкнуло широкое распространение самого компьютера.
Комментарий "ИНФОРКОМА"
Конечно же техника защиты программ, как и техника их взлома начали разрабатываться раньше. Можно сказать, что только в 1982 году выпускались программы без защиты, но и компьютеров в то время было еще очень немного.
В 1983 г. техника программирования была еще недостаточно развита для серьезных защит и, как правило, программы защищались только на уровне БЕЙСИК-загрузчика (совмещение цвета, внедрение управляющих кодов, искажение содержимого некоторых системных переменных, защита от MERGE).
1984 год стал годом разгула средств защиты. Появились такие варварские изобретения, как "стукалка", "спидлок", "лензлок". Вся мерзость их состояла в том, что не то, что скопировать программу было невозможно, ее и загрузить-то было трудно (в случае "лензлока" с загрузкой не было проблем, но были проблемы с запуском). Массовые жалобы покупателей и отказ от приобретения программ у фирм, запятнавших себя такими приемами стали коммерческой проблемой уже в 1985 году, когда убытки от средств защиты превысили убытки от пиратства.
Автор статьи относит начало появлений средств защиты к 1986 году и мы с ним согласны, если рассматривать квалифицированные средства защиты, построенные на изощренной логике программирования, а не на искажении параметров загрузки, что очень плохо отражается на самой загрузке.
Разумеется, техника взлома, техника защиты и техника программирования совершенствовались одновременно. В частности, если сравнить по графике игры 1986 года и 1989, то без сомнения в большинстве случаев Вы отдадите предпочтение последним. То же самое можно сказать и об уровне защищенности компьютерных программ.
Однако то же самое мы можем сказать и о технике взлома. В самом деле, фирмы совершенствуют свою защиту и, чтобы вскрыть ту или иную программу, приходится прикладывать максимум изобретательности.
Среди "хаккеров" наибольшую известность приобрел BILL GILBERT. Можно с уверенностью сказать, что программы взломанные им есть у каждого обладателя компьютера "ZX SPECTRUM". Достаточно сложно судить о том, что заставило этого человека заниматься такой деятельностью, однако судя по распространению программ вскрытых Билом Гилбертом можно предположить следующее.
В нашу страну программы попадают уже пройдя через руки этого "хаккера", а поскольку наибольший приток программ сюда наблюдается из Польши, то не исключено, что он проживает именно там. Не исключено так же, что человека с таким именем не существует, а хаккер в своей деятельности использует псевдоним.
однако это всего лишь гипотеза, и если кому-либо известна достоверная информация о работе "хаккера", то я надеюсь, он поделится ей на страницах "ZX-РЕВЮ".
Комментарий "ИНФОРКОМа"
Не имея достоверной информации о Б. Гилберте, мы должны, тем не менее, отметить тот факт, что вопросы пиратского распространения копий программного обеспечения несколько лет назад широко обсуждались на страницах зарубежных журналов, посвященных Синклер-совместимым машинам. Сейчас острота этой проблемы спала, поскольку лидирующее место на рынке заняли другие компьютеры.
Исследования западных журналистов показали, что центром международного пиратства является Голландия, где по-видимому и следовало бы искать Б. Гилберта. Оттуда поток разделялся на три ветви. За океан в Южную Америку, в частности в Бразилию, где ситуация очень напоминала нашу - очень дорогие компьютеры при очень дешевых программах и при полном отсутствии элементарной защиты авторских прав. Второй поток -на юг в Израиль, далее куда угодно, и третий поток - на Восточную Европу, в частности в Польшу, Венгрию и Югославию, а из Польши - к нам.
Как показали журналистские расследования, эта деятельность - отнюдь не невинные развлечения энтузиаста "хаккера". В нее были вовлечены колоссальные средства, измерявшиеся миллионами долларов. Достаточно сказать, что во многих случаях пиратский тираж программ из Голландии в десяток раз превосходил основной тираж в Англии. Организация имела мощные сети и неоднократно начинала продавать вскрытые программы за несколько месяцев до того, как в Англии выходил первый защищенный оригинал.
Достаточно сложно выделить "хаккеров", которые бы занимали второе место после Билла Гилберта. Фактом является то, что никому не удалось еще подняться на его уровень. Тем не менее, в коллекции автора второе место занимает "PEGAS SOFTWARE". Несмотря на то, что никакой информации о месте нахождения данной "компании" нет. Это не помешает нам разобрать приемы, используемые ими в работе.
Ступенькой ниже идут отдельные программы, в которых окозалось сообщение о том, что их кто-то взломал. К таким хаккерам мы можем отнести "ROBI CRACKING SERVISE", "TOMI & DALI" и др.
Автор считает своим приятным долгом выразить благодарность тов. Кириллову С.В. из пос. Мурмаши Мурманской обл., предоставившему очень интересную информацию из журнала "Bajtek", касавшуюся данного вопроса.
ГЛАВА 1.
Техника защиты совершенствуется постоянно. Поэтому Глава 4 первого тома к моменту прочтения Вами изложенного в ней материала по всей видимости безвозвратно устарела. Именно по этой причине мы будем говорить о современных методах защиты как можно более часто, стараясь, чтобы изложенная информация сохраняла свою актуальность.
Итак, сегодня мы рассмотрим некоторые приемы, которые были взяты на вооружение фирмами-изготовителями программного обеспечения. Для начала исследуем очень любопытный прием, разработанный фирмой ULTIMATE.
Вы знаете, что "SPECTRUM" имеет "встроенные часы", роль которых выполняет системная переменная FRAMES. Ее значение увеличивается каждую 1/50 сек. Таким образом, мы можем контролировать процессы, протекающие строго определенное время. Именно на этом принципе основана одна из защит фирмы ULTIMATE (изготовитель программ ATIC ATAC, SABRE WOLF, KNIGHTLORE, ALIEN 6, PENTAGRAM, NIGHT SHADE и мн. др.)
Поскольку при загрузке программ система прерываний отключается, то мы можем контролировать - осуществлялось или нет вмешательство в данную программу, следя за состоянием системной переменной FRAMES. В самом деле, для осуществления вмешательства необходима остановка программы, которая, что вполне естественно, приведет к несовпадению контрольных значений в системной переменнной FRAMES.
Рассмотрим, как это осуществляется на практике. Обычно, после достаточно простого загрузчика на БЕЙСИКе на ленте идет сама программа, после которой следуют три небольших блока, которые собственно и осуществляют защиту. Первый - это однобайтовый код инструкции JP(HL), осуществляющий старт необходимых процедур, второй блок программной защиты состоит из нескольких байтов - он осуществляет декодирование всей программы. (Вопросы кодирования и декодирования программ будут подробно рассмотрены в следующем разделе), и, наконец, третий блок имеет длину два байта и загружается в область 23627, т.е. в системную переменную FRAMES. Загружаемые значения представляют собой контрольную сумму, по величине которой и осуществляется проверка: останавливалась исходная программа или нет. Обычно этим занимается специальная процедура в машинных кодах, которая при обнаружении взлома обнуляет память компьютера.
Данная защита не получила широкого распространения и обычно ее можно обнаружить лишь в программах фирмы ULTIMATE. Это объясняется тем, что ее можно достаточно легко свести на нет, если придерживаться специального принципа при взломе.
Вмешательство в программу такого типа весьма просто. Достаточно загрузить все блоки, за исключением последнего, а после осуществления просмотра или проведения в ней определенных изменений (например, вписание необходимых POKES) достаточно ввести:
LOAD "" CODE:RANDOMIZE USR ADRESS(24064)
Эту команду необходимо обязательно ввести с клавиатуры одной строкой, разделяя инструкции двоеточием, чтобы вложиться в интервал времени соответствующий новому значению системной переменной FRAMES.
Поскольку в большинстве вышеприведенных программ фирмы ULTIMATE адресом старта является 24064, то именно он приведен в качестве примера. Однако, в каждом конкретном случае значение может быть другим. Необходимо каждый раз перед вводом этой серии команд уточнять его и вносить необходимые изменения.
После такого пояснения мы надеемся, что у читателя не возникнет затруднения при вводе POKES для изменения игр фирмы ULTIMATE.
(Продолжение следует)
МОНИТОР 48 - новые возможности.
Читателям, которые работают с машинными кодами Z80, наверняка приходилось использовать пакет программ фирмы PICTURESQUE "EDITAS/MONITOR". Существуют две версии данного пакета программ, рассчитанные на работу в компьютерах с оперативной памятью 16 и 48 килобайт. Они имеют соответственно названия MONITOR 16 и MONITOR 48. Естественно, программа, рассчитанная на 16 килобайтную машину, подходит к компьютеру, имеющему объем оперативной памяти 48 Кбайт, поэтому в отечественных моделях возможно и желательно использование обеих типов данных программ, т.к. вследствие своего расположения в низких адресах оперативной памяти программа MONITOR 16 может применяться для дисассемблирования блоков, занимающих верхние области памяти.
Однако было бы по меньшей мере наивно предполагать, что в программе MONITOR 48 существенным отличием является лишь новое расположение в оперативной памяти компьютера. Эта версия является одним из лучших отладчиков для программ в нашинных кодах. Она, безусловно, имеет меньше режимов работы, чем версии программы MONS из пакета DEVPAC, однако это компенсировано разработчиками введением дополнительного режима, обеспечивающего работу программы через отладчик. Рассмотрим его более подробно.
Этот режим вызывается после нажатия клавиши T <ENTER> и служит для пошаговой отладки программы, написанной в машинном коде. Назовем этот режим режимом трассирования (T - TRACE).
После этого Вы попадаете в основное меню данного режима. На экране Вы можете видеть следующую картину (см. рис. 1):
- два дисассемблированных оператора текущего программного адреса;
- содержимое всех регистров микропроцессора в т.ч. и альтернативных;
- состояние всех флагов регистра F, в том числе и альтернативного.
- содержимое нескольких ячеек вершины машинного стека;
- содержимое определенных ячеек памяти, которые заранее выбраны пользователем.
Следует отметить, что содержимое основных регистров процессора отделено от
содержимого альтернативных регистров. Кроме этого, напротив каждой основной регистровой пары приведено содержимое ячеек памяти, на которые указывает содержимое данной пары. _
STEP |
|
|
2D28 |
AF LD |
C,A |
IR |
3F50 |
STACK |
|
SZ H PNC |
0009 |
A'F' |
>0001000100 |
000D |
B'C' |
1721 |
10ED |
D'E' |
369B |
F39C |
H'L' |
2758 |
*33 65 |
|
SZ H PNC |
|
AF |
0F01010100 |
|
BC |
F70F (BC) C3 |
45 F1 1A CD |
DE |
61C4 (DE) 00 |
00 0F F7 00 |
HL |
2D2B (HL) FD |
21 3А 5С AF |
IX |
03D4 |
|
IY |
5C3A |
|
SP |
E8D6 |
|
PC |
2D28 |
|
M000 |
F3 AF 11 FF FF |
C3 CB 11 2A |
Экран режима "Т" программы "MONITOR 48" при входе в него сразу после начала
работы отладчика.
Рис. 1
Все это стандартная информация, которую можно получить и в MONS за исключением, пожалуй, достаточно интересной информации о содержимом стека. Фактически этот режим создан исключительно для изучения работы программ в машинных кодах. Здесь можно изучать пошаговое выполнение программы, поскольку после нажатия клавиши ENTER происходит выполнение текущей команды.
Теперь настало время рассмотреть более подробно работу программы в данном режиме. Я предполагаю, что читатель, заинтересовавшийся этим материалом уже имеет необходимое представление о машинных кодах и поэтому не считаю нужным давать здесь какую-либо информацию о процессоре Z80. Если Вы хотите получить эту информацию, рекомендую трехтомник "ИНФОРКОМа".
Итак, вы уже вероятно поняли, что информация, появившаяся на экране после перехода в режим "Т" отражает текущее состояние микропроцессорной системы. Естественно, она будет изменяться после выполнения компьютером очередной команды. Сверху вы можете видеть две дисассемблированные команды, начиная с адреса, указанного в регистре PC микропроцессора. Вы сможете изменить этот адрес для того, чтобы осуществить выполнение программы оттуда, откуда вам надо. Но об этой чуть позже, а теперь краткая сводка команд, использующихся в этом режиме.
S - установка программного счетчика (регистра PC) на заданный шестнадцатиричный адрес.
M - распечатка в нижней строке экрана содержимого ячеек памяти, начиная со значения, заданного после M. Всего можно увидеть 9 значений. В момент первого запуска данного режима программа автоматически устанавливает значение M, указывающее на нулевую ячейку памяти.
Курсорные клавиши - изменяют местоположение стрелки от одной регистровой пары к другой. Таким образом, можно указать на любой регистр микропроцессора, за исключением регистра программного адреса PC. Это необходимо, чтобы изменять содержимое данных регистров, а как Вам уже известно, содержимое регистра PC изменяется с помощью команды S.
1 - Если Вы нажмете на 1, то в строке ввода информации (самая нижняя строка экрана, она находится под строкой информации о содержимом памяти) появится содержимое текущей регистровой пары микропроцессора, на которую указывает стрелка-курсор. Если вы хотите изменить содержимое данной регистровой пары, то наберите шестнадцатиричное число, которое бы Вы хотели видеть вместо текущего значения. Если же Вы не хотите ничего изменять, то не набирая шестнадцатиричного числа нажмите ENTER. Кроме этого, для выхода из режима можно использовать команду X.
X - если Вы набираете какую-либо команду и увидели, что набираете ее неправильно, то ввиду того, что в программе MONITOR 48 отсутствует функция DELETE. Вам необходимо использовать функцию X. После нажатия этой клавиши вы возвращаетесь в исходный режим, который был до начала набора данной команды, примечательно, что эта клавиша используется и для выхода из режима "Т" в основной режим MONITORa. Поэтому будьте осторожны и внимательны при использовании этой функций в данном режиме. Но в крайнем случае не отчаивайтесь: ничто не помешает Вам вновь нажать "Т" и продолжить работу.
ENTER - нажатие этой клавиши приводит к выполнению компьютером текущей программной команды. Если вы несколько раз нажали клавишу ENTER, перед этим установив программный счетчик, то можете включить два вспомогательных режима.
R - после нажатия этой клавиши и ENTER справа вверху появляется надпись SCIP TO RET. Надо признаться, что этот режим еще недостаточно хорошо исследован, однако есть предположение, что по этой команде начинается исполнение программы и при обнаружении ближайшей команды RET осуществляется возврат в MONITOR 48. Предлагаю Вам самостоятельно проверить правильность этой гипотезы и подтвердить ее или опровергнуть.
Следующий режим исследован наиболее тщательно и, на взгляд автора, является тем преимущественным фактором, который вызывает предпочтение MONITORа 48 другим отладчикам. Это так называемый режим B.
В - нажатие этой клавиши и ENTER приводит к появлению слева вверху надписи BREAKPOINT, а повторное нажатие ENTER приводит к включению режима. После B можно набрать шестнадцатиричный адрес, с которого Вы бы хотели осуществить включение режима.
Данный режим работы служит для относительно медленного контроля работы исходной программы в машинных кодах с возможностью в любое время прервать выполнение программы нажатием клавиши BREAK. Причем в данном случае медленная работа программы Вам на руку, поскольку программы в машинных кодах в нормальном режиме выполняются очень быстро, а здесь происходит замедление в 100, а может и более раз. К тому же несомненное удобство представляет возможность остановки программы с возвратом в отладчик. Вам не придется кусать себе локти в случае зависания отлаживаемой программы
Однако, есть несколько нюансов, которые необходимо учитывать при работе. Во-первых, если Вы наберете B0000, то, быть может, Вам вновь придется загружать программу с внешнего носителя. Это необходимо учитывать в том случае, если проверяемая Вами процедура использует в своей работе верхнюю область памяти (нельзя допускать каких-либо изменений в области, где хранится программа MONITOR 48).
Во-вторых, есть одна особенность, без учета которой бывает достаточно сложно включить режим "В". В частности, он не всегда начинает работать, если вы включаете его сразу после изменения содержимого программного счетчика, используя команду S. Если это происходит, то необходимо перед нажатием "В" "прогнать" несколько шагов программы нажатием клавиши ENTER.
Безусловно данная статья не в состоянии охватить полностью всех возможностей этого режима. Однако этого вполне достаточно, чтобы дать толчок для ваших исследований, уважаемые читатели. Мы надеемся, что открыв что-нибудь новое, Вы поделитесь своей информацией на страницах "ZX-РЕВЮ". Мы также надеемся, что быть может откликнется человек, имеющий необходимое описание, сделанное фирмой производителем данной программы, чтобы мы с вами могли более полно использовать все возможности великолепной программы-отладчика машинных кодов MONITOR 48.
Алексеев А. Г.