ZX-Ревю 1992 №9-10 1991 г.

Защита программ - продолжение цикла статей по защите программ. (Начало: 9-16, 53-60,97-104, 141-146).


Темы статьи: Программирование  

ЗАЩИТА ПРОГРАММ

Продолжение.

(Начало: 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

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

CD

6B

НМК

64024

0D

21

00

3D

.!.!

64028

11

30

00

21

.0.!

64032

57

А0

B6

W >6

64036

77

21

5D

76

w!]v

64040

C3

77

C3

>CvC

54044

СВ

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.

Алексеев А. Г.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Программистам - Конверсия чисел в десятичный формат.
Семь и 1/2 - посмеемся: Анекдоты пpо ламеpов и юзеpов, а также pеальные звонки в слyжбy тех. поддеpжки.
Games - Описание игры "NIGEL MANSELL WORLD CHAMPIONSHIP".
Новости - О наиболее значительных событиях из хаккерского мира SPECCY.
Почта - Анонс раздела.

В этот день...   18 апреля