ZX-Ревю 1992 №3-4 1991 г.

Защита программ - практическое использование управляющих кодов для защиты.


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

Сегодня мы продолжаем разговор о приемах защиты программ от просмотра. Начало статьи см. в "ZX-РЕВЮ" 1-2, 1992 г., стр. 9-16.

2.3.4. Управляющие коды, используемые для защиты от просмотра.

Естественно, что того описания которое приведено в разделе 2.3.3, недостаточно для полноценного использования управляющих кодов. Здесь мы более подробно рассмотрим их применение для защиты от листинга, изучая программы, взломанные известными хаккерами, а также просматривая наиболее удачные программные приемы фирменных программ.

Итак по порядку.

Код N7 EDIT не используется для целей защиты. Это управляющий код, который создает программа ввода с клавиатуры при нажатии клавиш "CAPS SHIFT" и "1" для вызова строки в область редактирования. Эта область изменяется в соответствии с размерами строки.

N8 BACKSPACE. Этот код, означающий в переводе с английского "Курсор назад" достаточно широко используется для скрытия некоторых частей строки Бейсика, для накладывания частей друг на друга с целью дезинформации и для создания необычных эффектов, один из которых был нами рассмотрен в примерах (раздел 2.3.2).

Естественно, можно использовать этот код сразу для нескольких целей одновременно. Рассмотрим теоретические способы использования BACKSPACE для скрытия информации и исполнения накладок (с практическими приемами Вы будете ознакомлены в следующей статье).

Предположим, первой строкой в Вашей программе идет строка, выполняющая реальные действия, например осуществляющая запуск программы в машинных кодах, встроенной в Бейсик (о том как сделать такую программу читайте в Главе 1. Эта программа осуществляет реальную загрузку и только она может правильно загрузить и запустить блок кодов с магнитной ленты.

Чтобы ввести пользователя в заблуждение, текст этой строки скрывают, а в следующих за ней строках ставят ловушки (естественно эти строки не скрывают - пусть все смотрят).

Ловушки могут быть самые разные от продолжения программы на Бейсике, создающей видимость загрузки до запуска программы в кодах в таком месте, где либо коды умышленно путаются с целью зависания компьютера, либо с отправкой на команду АССЕМБЛЕРа JP 0000, аналогичной RANDOMIZE USR 0, что обеспечивает перезапуск компьютерной системы). Таким образом, вся сложность подобной системы защиты сводится к тому, чтобы освоить создание невидимой строки.

Делается это следующим образом: пишется нормальная строка на Бейсике, после этого она зануляется, чтобы её невозможно было вызвать для редактирования, а потом "сжимается" до нуля влево с помощью символов BACKSPACE.

Примечание: ещё больше затруднить поиск точного адреса старта Вашей программы в кодах можно используя измененный вариант числа управляющим кодом 14, который описан ниже, а кроме этого рекомендуется искажать подлинный смысл операторов Бейсика с использованием методов, описанных в разделе "Новейшие достижения защиты".

Более подробно как это сделано показано на рис. 1

MM NN|<-|<-|<-|<-|<-|<-|<-|<-| |<-|<-|<-|<-|<-|<-|<-|<-|<-|<-|

|<-|<-|<-| RANDOMIZE USR ABCDE

РИС. 1

где MM - номер строки NN - длина строки ABCDE - номер ячейки памяти, с которой осуществляется запуск программы в кодах.

После Бейсик строки мы размещаем ровно столько символов BACKSPACE чтобы текст строки был скрыт из виду т.е. каждому символу строки соответствует символ BACKSPACE.

Сокрытие лишь части строки из виду является разновидностью данного метода и используется в аналогичных целях. В частности, в широко распространенной программе COMMANDO (фирма ELITE) - оно используется следующим образом:

10 CLEAR 40000

20 LOAD "" CODE

30 RANDOMIZE USR (неверный, т.е. ложный шаг, с которого якобы начинается программа в кодах.)

Достаточно хитро спрятан действительный адрес, по которому происходит запуск программы в кодах. Он размещен в строке 20 после команды загрузки LOAD "" CODE и "сделан невидимым" с помощью символов BACKSPACE. Для тех, кто интересуется более подробно, как это сделано, рекомендую составить программу для непосредственного просмотра ячеек памяти Бейсик-программы (дампинга памяти), разместив ее в конце программы:

9997 FOR I=23755 ТО З0000

9998 PRINT PEEK I; " ";CHR PEEK I; " "; I

9999 NEXT I

Запускается эта программа командой GO TO 9997, а в случае остановки ее из-за невозможности распечатать тот или иной символ или по другим причинам, необходимо набрать с клавиатуры NEXT I и дампинг продолжится. Этот метод рекомендуется применять для просмотра содержимого любых программ, т.к. он позволяет получить истинную картину Бейсика.

Коды N9, N10 , N11 - RIGHTSPACE, DOWNSPACE и UPSPACE для защиты программ не используются, они выделены в отдельную группу т.к. генерируются программой ввода с клавиатуры для передвижения курсора в заданном направлении:

"CAPS SHIFT" +8 - -> RIGHTSPACE

"CAPS SHIFT" +6 - -> DOWNSPACE

"CAPS SHIFT" +7 - -> UPSPACE

Коды N12, N13 - DELETE и ENTER для защиты программ не используются. N14: - этот управляющий код предшествует числам в программах. Как известно, в "СПЕКТРУМЕ" при программировании на Бейсике, обычные числа являются наибольшими расточителями памяти. Это происходит потому, что фактически числа записываются в память дважды -первый раз записано число в том виде, в каком оно печатается на экране, а второй раз записано истинное значение числа, т.е. то, которое обрабатывается интерпретатором. Свидетельством того, что началась запись числа для интерпретатора и является управляющий код 14.

Введем, например, строку:

10 PLOT 10,9

и посмотрим, каким образом она запишется в память. Выглядит она так, как показано на рис. 2:

0 10

18 0

248

8 9

14 0 0 10 0 0

44

57

14 0 0 9 0 0

13

10

18

PLOT

1

10

9

9

номер длина 1-,-1 i-,-1 ENTER

строки строки число 10 число 9

Рис 2.

Как видите, текст, который хранится в памяти, отличается от того, что изображается на экране. После последней цифры каждого числа, выступающего в тексте строки как параметр функции PLOT, интерпретатор выделил 6 байтов памяти и поместил там символ с кодом 14, а за ним - 5 байтов, в которых записано значение этого числа (число записано способом, понятным интерпретатору. Для желающих более подробно изучить способы представления чисел в "СПЕКТРУМЕ" рекомендую обратиться к методической разработке "ИНФОРКОМа" "Первые шаги в машинных кодах". Это ускоряет в определенной мере выполнение программ на Бейсике, т.к. во время выполнения интерпретатор не должен каждый раз переводить числа из алфавитно-цифрового представления (просто последовательность цифр) в 5-ти байтовое представление, пригодное для вычислений на встроенном в ПЗУ калькуляторе "СПЕКТРУМА". Готовое значение выбирается из памяти после управляющего кода 14.

Рассмотрим небольшой пример конкретной защиты программ. Во многих программах загрузчиках присутствует такая строка: 0 RANDOMIZE USR 0: REM...

На первый взгляд эта строка после запуска должна перезапустить компьютер и, соответственно, очистить всю память "СПЕКТРУМА", но этого не происходит. После более внимательного рассмотрения (с помощью PEEK-программы, которая была предложена ранее) оказывается, что после USR 0 и символа 14 нет 5 нулей, а именно так записалось бы число 0 в пятибайтной форме. Эти значения были умышленно изменены, чтобы сбить Вас с толку.

Но после управляющего символа 14 мы видим не нулевую комбинацию, а определенную последовательность, например: 0,0,218,92,0, что равнозначно числу 23770, т.е. практически функция RANDOMIZE USR не осуществит переход по адресу 0, а делает его именно на адрес 23770, а это как раз адрес байта, находящегося сразу после инструкции REM, где размещена программа в машинных кодах (о том, как разместить её там, мы писали в Главе 1).

N 15 - Этот код "СПЕКТРУМОМ" в стандартном БЕЙСИКе не используется. Использование его в других языках оговаривается в их описаниях, например в БЕТА-БЕЙСИКе 3.0.

N 16 - код управления цветом символов - INK CTRL. После этого символа обязательно наличие одного байта, уточняющего о каком цвете идет речь. Цифровая шкала цветов совпадает со стандартной шкалой цветов СПЕКТРУМА:

0-черный

1-синий

2-красный

3-пурпурный

4-зеленый

5-голубой

6-желтый

7-белый

(В разделе "Секреты ПЗУ" в прошлом году на стр. 148 "ИНФОРКОМ" указывал, что существуют также установки цвета с параметром 8 ("прозрачный") и 9 ("контрастный").

Если после этого управляющего кода будет находиться байт, содержащий значение, не совпадающее со значением одного из цветов, то это вызовет остановку компьютера с выдачей сообщения об ошибке INVALID COLOR (неверный цвет).

Создание системы команд, вызывающих остановку компьютера с выдачей сообщения об ошибке очень часто используется при защите Бейсик-программ от просмотра. В

частности, если мы используем этот метод совместно с методом зануления всех строк то это обеспечит полную защиту листинга, а кроме этого мы сможем оставлять свои сообщения в программах и закрывать доступ к ним (естественно, делать это стоит только на программах, созданных Вами лично).

Рассмотрим более подробно организацию строки Бейсика при использовании управляющего кода INK CONTROL. Как Вам уже вероятно известно, печать всех сообщений на экране "СПЕКТРУМА" осуществляет специальная процедура, встроенная в ПЗУ. Когда эта процедура встречает управляющий код 16, она анализирует следующий за ним байт и принимает его за числовое значение цвета INK, конечно если оно лежит в допустимых пределах.

После того, как код принят, все последующие символы на экране печатаются с цветом INK, соответствующим значению, стоящему после управляющего кода INK CONTROL. В строках Бейсика применение управляющих кодов позволяет экономить память, что достаточно важно в программах и приобретает особую актуальность в загрузчиках.

Рассмотрим, откуда берется эта экономия. Традиционная форма записи Бейсик-строки: INK 0.

Другой вариант - введение в строку управляющего кода INK CONTROL и за ним символа "0". Правда, набрать на клавиатуре эту комбинацию не так просто. О том, как это осуществить практически, смотрите ниже.

И в том и в другом варианте расходуется "приблизительно" одинаковое количество байтов памяти за исключением того, что интерпретатор Бейсика переводит число 0 в специальную 5-ти байтную форму, с которой он и оперирует. То есть фактически при подаче команды INK 0, расходуется не 2 байта памяти а 8: INK 0 14 0 0 0 0 0 ,

т.е. в 4 раза больше. Комбинация же: INK CONTROL 0

расходует всего 2 байта, поскольку здесь число 0 представлено в своем нормальном виде. Даже метод, использующий комбинацию: INK NOT PI, (что фактически аналогично INK 0) расходует 3 байта памяти, т.е. еще раз убеждаемся, что использование управляющих кодов является самым экономичным из рассмотренных методов.

Еще более существенная экономия места в памяти достигается в том случае, когда управляющие коды используются в строке оператора Бейсика PRINT вместо вставного INK. Это объясняется тем, что в этом случае приходится учитывать символ ";" (точка с запятой), которым необходимо "окаймлять" с двух сторон команду INK. 10 PRINT;INK 0; "ZX SPECTRUM"

В данном случае под вставку команды INK 0 расходуется 10 байтов:

;

INK

0

14

0

0

0

0

0

;

1

2

3

4

5

6

7

8

9

10

В случае же употребления управляющего кода INK CONTROL истратим лишь 2 байта. Фактически это применение может использоваться не только для защиты программ, но и для элементарной экономии памяти, в частности, очень существенной эта экономия оказалась в программе "MONOPOLY" (аналог известной во всем мире настольной игры), где управляющие коды используются при распечатки сообщений в операторе PRINT.

Практически используя этот и другие приемы, программистам удалось создать великолепный экземпляр игры, в которую можно играть как в одиночку, так и в паре с соперником (под игрой в одиночку я понимаю поединок со "СПЕКТРУМом", когда компьютер выступает вместо второго игрока). Этот код дает Вам возможности не только экономить память. Но и создавать эффекты, достигнуть которые иными путями будет просто невозможно. В частности, хотите ли вы, чтобы при загрузке Вашей программы после ключевого слова PROGRAM текст названия Вашей программы печатается иным (т.е. таким, который Вы заранее зададите) цветом? Если да, то и об этом поговорим на страницах данных статей.

17 управляющий код PAPER CONTROL используется точно так же, как и предыдущий код INK CONTROL, только в данном случае числовое значение следующее после этого кода изменяет цвет не символа, а фона. В большинстве случаев управляющие коды INK CONTROL и PAPER CONTROL используются вместе для достижения каких либо эффектов. Именно совместное их использование создает наибольшую выразительность и улучшает читаемость информации, а также позволяет достигнуть наилучших цветовых эффектов. Рассмотрим более подробно теоретические аспекты совместного использования управляющих кодов INK CONTROL и PAPER CONTROL на базе ПРИМЕРА 1. (см. раздел 2.3.2).

Вкратце напомню, что тогда мы просто изучали эффекты, возникающие при использовании некоторых управляющих кодов без какой-либо предварительной теоретической проработки. Применение этих символов аналогично часто применяемым операторам изменения цвета INK и PAPER на базе оператора PRINT. Имеются, правда, существенные отличия. Первое - это существенная экономия оперативной памяти (в некоторых случаях этот объем удается сократить в пять раз). И второе отличие состоит в том, что встроенный в PRINT оператор INK или PAPER изменит цвет символов или фона лишь у текста, который должен распечатать PRINT, в то время как соответствующие управляющие символы INK CONTROL и PAPER CONTROL изменяет цвет всего следующего за ними текста. В частности, для эксперимента Вы можете вставить эти управляющие коды в один из фрагментов листинга программы способом, который будет описан в следующей статье (Раздел 2.3.5. "Практическое применение управляющих кодов для защиты). В целях защиты это может применяться, например в тех случаях, когда Вам нужно сделать текст программы невидимым), т.е. действие управляющих кодов INK CONTROL и PAPER CONTROL аналогично действию постоянных операторов INK и PAPER.

Управляющий код 18 задает или отменяет мигание - FLASH CONTROL. После этого управляющего символа следует байт параметра. Кодировка аналогична стандартной кодировке, т.е. она может иметь значение 0,1 или 8. FLASH CONTROL вызывает мерцание всех следующих после этого управляющего кода символов. FLASH CONTROL 8 оставляет в позициях символов прежние ранее установленные значения FLASH.

FLASH CONTROL 0 уничтожает действие предыдущих операторов FLASH 1 и FLASH 8, поэтому все индицируемые после этого управляющего кода символы не мерцают. Учтите, что FLASH CONTROL 1 заставляет мерцать позицию всего символа (8x8), даже в том случае, если высвечивается только одна точка.

Использование этого управляющего кода Вы могли наблюдать при загрузке программы-копировщика "COPY-COPY" в тот момент, когда на экране появляется заголовок "PROGRAM", а после него следуют два слова программы, попеременно мерцающие. Рассмотрим теоретические аспекты применения управляющего кода FLASH CONTROL. Его применение, как и других аналогичных управляющих символов, сопровождается значительной экономией памяти. В некоторых случаях за счет использования FLASH CONTROL в сравнении с FLASH удается "выиграть" до 8 байтов памяти, что при достаточно частом использовании приносит ощутимую экономию.

Для того, чтобы заставить мерцать все символы. Вам необходимо лишь установить управляющий код перед первым из данных символов: FLASH CONTROL 1 <текст программы>.

Если же Вы желаете, чтобы мерцал лишь небольшой отрезок текста (именно это необходимо в большинстве случаев), то Вам необходимо перед этим отрезком включить мерцание, а после него - выключить:

<текст программы> FLASH CONTROL 1 <отрезок текста> FLASH CONTROL 0 <текст программы>.

После ввода вышеприведенных кодов будет мерцать лишь <отрезок текстах

Ничем не поддержанное использование управляющего кода FLASH CONTROL не принесет эффективности в защиту Вашей программы от несанкционированного доступа. Но применение этого кода может озадачить малоопытного "хаккера", который столкнется с новым для себя приемом программирования.

Управляющий код N19 - BRIGHT CONTROL - индицирует следующие за ним символы более ярко. Это достаточно часто используется в игровых программах, но имеет очень слабую перспективу в применении для защиты программ.

После управляющего кода BRIGHT CONTROL следует байт параметра, который соответственно придает или отменяет более яркую окраску в зависимости от своего значения:

BRIGHT CONTROL 1 дает более яркую окраску символам, выводимым после этого оператора.

BRIGHT CONTROL 8 указывает, что яркость символов в данном знакоместе должна остаться такой, какой она в нем была и ранее.

BRIGHT CONTROL 0 устраняет действие BRIGHT 1 и BRIGHT 8, и далее символы индицируются с нормальной яркостью.

Теоретические аспекты применения BRIGHT CONTROL полностью аналогичны использованию управляющего кода FLASH CONTROL.

Управляющий код N20 - INVERSE CONTROL меняет местами цвета в позиции символа, т.е. цвет INK становится цветом PAPER и наоборот. После управляющего кода INVERSE CONTROL следует байт, определяющий применение данного управляющего символа. INVERSE CONTROL 1 меняет местами цвета INK и PAPER у всех последующих символов, индицируемых на экране после этого кода.

INVERSE CONTROL 0,соответственно, возвращает первоначальные установки.

Этот управляющий символ также как и BRIGHT CONTROL почти не применяется для защиты программ. Теоретические аспекты применения INVERSE CONTROL аналогичны применению FLASH CONTROL (см. выше).

Управляющий код N21 OVER CONTROL используется тогда, когда необходимо индицировать символ, не уничтожая символа, который уже находился в этой позиции. В зависимости от следующего после OVER CONTROL байта, т.е. того значения, которое находится там, наполнение либо осуществляется, либо нет:

OVER CONTROL 0, который действует по умолчанию, уничтожает в индицируемой позиции ранее индицированный символ.

OVER CONTROL 1 индицирует символ, не уничтожая то, что находится в данном, и, таким образом, получается комбинация символов.

Использование этого управляющего кода может применяться для защиты листинга программ, в частности, совместное его использование с управляющими кодами

BACK SPACE, AT CONTROL, TAB CONTROL, позволит осуществить наложение символов таким образом, что текст программы станет полностью нечитаемым.

Для примера рассмотрим теоретические аспекты совместного применения управляющих символов OVER CONTROL и BACKSPACE для создания готического шрифта. Если на алфавитные символы накладывать какой-либо простой символ, например "/", (наклонная черта), то мы можем получить подобие готического шрифта. Для того, чтобы осуществить наложение, нам необходимо напечатать сам символ, включить режим совмещения, сдвинуть курсор на одну позицию влево управляющим кодом BACKSPACE и после этого напечатать поверх этого символа наклонную черту.

Последовательность действий: В BACKSPACE OVER CNTR 1 /

Для пояснения приведем алгоритм на Бейсике, аналогичный вышеприведенной строке. Введем строку:

PRINT "В"; CHR 8;OVER 1; "/"

после чего мы увидим, как наклонная черта перечеркивает "В".

Здесь был рассмотрен пример, позволяющий украсить шрифт. Однако, нетрудно видеть, что можно умышленно накладывать некоторые символы один на другой так, чтобы исключить возможность прочтения листинга Вашей программы.

Код N22 (AT CONTROL) служит для печати сообщений в заданном знакоместе экрана. Компьютер получает информацию о том, в каком месте осуществлять печать символов после анализа двух байтов, следующих за рассматриваемым управляющим кодом.

Первый байт может быть в пределах от 0 до 21 и указывает номер строки, в которой будут индицироваться данные. Второй байт может лежать в пределах от 0 до 31 и указывает номер колонки, начиная с которой будут индицироваться данные. Неправильное задание данных значений вызовет останов компьютера по ошибке. (Под неправильным применением в данном случае подразумевается выход значений за допустимые пределы). Управляющий код AT CONTROL является одним из наиболее употребительных и применяется для защиты не реже, чем INK CONTROL и PAPER CONTROL. Возможности его применения очень широки и здесь все будет зависеть от Вашей фантазии.

Рассмотрим теоретические аспекты на конкретных примерах, а к конкретному их применению вернемся позже. Например, Вы хотите, чтобы после остановки Вашей программы по команде BREAK и попытке листинга на экране появлялось заранее заданное Вами сообщение. Причем появляться оно будет в той позиции экрана, в которой Вы желаете. Если хотите, то можете создать комбинацию, которая не будет выводить никаких сопроводительных сообщений - т.е. на экране не будет номера строки и других Бейсиковских атрибутов.

Для достижения подобного эффекта нам необходимо:

Во-первых, уничтожить Бейсиковские атрибуты, используя управляющий код BACKSPACE.

Во-вторых, задать место печати сообщения в необходимом нам месте экрана, используя управляющий код AT CONTROL.

В-третьих изменить цвет INK и PAPER таким образом, чтобы дальнейший листинг программы не был бы виден.

Схема Бейсик-строки, позволяющей достигнуть этого:

REM |<-|<-|<-|<-|<-|<-|AT CNTR | |row | col |<текст сообщения>| | INK CNTR |0|PAPER CNTR | 0 |

Здесь:

<- - упр. код BACKSPACE;

row - номер строки, в которой должно печататься Ваше сообщение;

col - номер колонки, с которой начнется Ваше сообщение хаккеру, взламывающему Вашу программу;

После того, как нам удастся создать эту строку практически, желаемый эффект будет достигнут. Подобное использование AT CNTR практически аналогично использованию AT совместно с PRINT. Но несмотря на это, применение управляющего кода позволяет получать эффекты, достижение которых иными методами было бы невозможно. Вышеприведенный пример является этому подтверждением.

Рассмотрим еще одно любопытное применение управляющих кодов. Это касается использования их в заголовке программ. Многие из Вас, вероятно наблюдали в некоторых программах появление названия программы (следующего после ключевого слова PROGRAM), высвечивающееся не в обычно принятом для этих целей месте, т.е. после слова PROGRAM, а в других местах, в частности, в центре экрана. Кроме этого, в некоторых случаях можно наблюдать появление заголовка вообще без слова PROGRAM (в этом случае название, как правило, печатается с начала строки). Все это достигается с помощью использования управляющего символа AT CONTROL.

Как Вам известно, хэдер (английское название заголовка) состоит из 17 байт. Когда мы загружаем программу, то сначала идет короткий хэдер, а после него непосредственно загружается программа. Хэдер содержит информацию о типе программы(BASIC, CODE и т.д.), о длине программы, о месте размещения программы в памяти компьютера и другие подробности, различные для каждого типа загружающихся программ). Под название программы отводится 10 байтов. Этим объясняется тот факт, что мы не можем записать на ленту программу с количеством символов в названии большим, чем 10.

А теперь давайте представим ситуацию, когда мы вместо первых трех байтов в хэдере введем управляющий код AT CONTROL (возможно введение и любого другого управляющего символа) с соответствующими значениями столбца и строки, а остальные семь байтов у нас будет занимать название программы. В результате этой операции мы получим возможность распечатывать название программы в любом месте экрана. Если же мы будем использовать другой управляющий код, то в зависимости от того, какими функциями он управляет, будем получать соответствующие изменения. Модель данной строки:

AT CNTR

row

col

1

2

3

4

5

6

7

8

9

10

Первые три байта занимает управляющий символ AT CONTROL со своими параметрами управлений номером строки и столбца, а байты 4-10 отводятся под название текста программы. Как видим, использование AT CONTROL несколько ограничивает наши возможности - в заголовке остается лишь семь свободных байтов для записи названия, но зато это создает неповторимый эффект. Кроме того, при удачном размещении в оставшихся 7 байтах хэдера ключевых слов Бейсика, Вам может удаться эффект создания полноценного названия, а в некоторых случаях общий объем печатаемого текста будет даже превышать 10 знакомест.

Код N23 (TAB CONTROL) используется для задания позиции данного, либо следующего столбца, начиная с которого в текущей строке печатаются указанные данные. После TAB CONTROL следует один байт значение которого должно лежать в пределах от 0 до 31.

Основные аспекты использования TAB CONTROL для защиты аналогичны подобным моментам для AT, с той разницей, что TAB CONTROL со своим параметром занимает всего 2 байта, в то время как AT CONTROL занимает 3 байта.

Это обстоятельство определяет, преимущественное отношение к TAB CONTROL в тех случаях, когда особенно важна экономия памяти. В частности, использование этого кода в хэдере дает выигрыш в 1 байт, правда несколько оскуднеет эффект применения.

Мы рассмотрели использование всех, кроме одного, управляющих кодов. Не рассмотренный код COMMA CONTROL оставлен на самый конец повествования, ввиду того, что понять его работу лучше, если знаешь уже теоретические основы применения AT CNTR и TAB CNTR.

Итак:

Код 6 - управляющий код СОММА CONTROL (или управляющая запятая оператора PRINT) используется для индицирования элементов, следующих после этого управляющего кода на смещённых на пол экрана.

Более подробно алгоритм действия COMMA CONTROL можно понять на примере использования запятой в Бейсиковском операторе PRINT. Если в операторе PRINT элементы данных разделены запятыми, то они начинают индицироваться или с начала экрана или с его середины.

Наиболее любопытным аспектом при использовании COMMA CONTROL является тот факт, что это не простое табулирование 16 символов, т.к. при этом очищаются все 16 знакомест, по которым осуществлялась табуляция. Это значит, что COMMA CONTROL можно использовать для стирания некоторых надписей на экране, особенно в тех случаях когда необходима особая экономия памяти. Одним из этих случаев является применение СОММА CONTROL в хэдере. Именно с использованием этого управляющего символа удается уничтожить ключевое слово PROGRAM, которое должно появляться при загрузке Бейсик-блока. Достигается это с помощью полного "стирания" данного слова с помощью COMMA CONTROL.

В самом деле, если в 10 байтах хэдера, отведенных под заголовок, первой пойдет комбинация управляющих символов AT CONTROL выставляющая позицию печати в начале ключевого слова PROGRAM. После этого это слово сотрется, с использованием СОММА CONTROL. Далее позиция печати переносится в любое удобное для нас место экрана, например, в его середину опять-таки с использованием AT CONTROL и уже начиная с этого места осуществляется печать названия программы. Схема распределения данных 10 байтов хэдера приведена на рисунке:

AT CNTR

row

col

AT CNTR

row

col

1

2

3

4

5

6

7

8

9

10

Байты 1-3 занимает управляющий символ AT CONTROL со своими атрибутами. Байт 4 занимает символ COMMA CONTROL осуществляющий табуляцию в середину строки. Байт 57 занимает AT CONTROL с атрибутами. И всего лишь, 3 байта 8-10 остается под название программы.

Примечание "ИНФОРКОМА" даже и в этих 3 байтах можно разместить довольно длинные названия, используя токены ключевых слов. Например: RETURN TO RUN LAND MOVE (L + AND + MOVE) DRAW CAT ! STEP OVER BORDER TANK (TAN + BACKSPACE + K) RUN TO POINT GO TO NEW POINT TABOR (TAB * BACKSPACE + OR) OUTRUN OVERLIST и т.д. и т.п.

Несмотря на простоту, подобное использование управляющих кодов достаточно неэкономично, но я надеюсь, что читатель в качестве эксперимента, укрепляющего свои познания в этой области, сумеет найти более рациональные решения, сохраняющие требуемый эффект.

2.3.5. Практическое использование управляющих кодов для защиты.

Мы рассмотрели теоретические основы применения управляющих кодов. Я постарался дать исчерпывающую информацию обо всех. О том, как это у меня получилось, судить Вам, читатель. В этом разделе перед нами стоит задача освоить предложенные теоретические идеи на практике. Если Вы хорошо поняли предыдущий материал, то и этот освоите без труда. Итак, все по порядку.

Управляющие коды "СПЕКТРУМа" можно получить несколькими способами. Первый -самый легкий, понятный и доступный - использование встроенной функции CHR.

Как Вам уже вероятно известно, все существующие на клавиатуре ключевые слова и символы, а также определенные потребителем графические символы совместно с управляющими кодами образуют полный набор символов "ZX SPECTRUM". Используя CHR и номер кода символа, можно получить строчное изображение каждого символа. Такое правило будет соблюдаться для всех символов, кроме управляющих кодов. Если вместе с CHR мы наберем управляющий код, то никакой новый символ на экране не появится, а будет выполнено действие, соответсвующее данному управляющему коду.

Рассмотрим применение CHR с управляющими кодами на базе оператора PRINT. Существует несколько вариантов использования CHR. После CHR и значения указанного кода может следовать точка с запятой, например: PRINT "A" ; CHR 6; "В"

Этот оператор выдает индикацию на экране: А В

т.к. используется управляющий код COMMA CONTROL. Использовать управляющие коды CHR можно и иначе - выстраивая из них составную строку. Так, оператор:

PRINT "A" + CHR 6 + "В"

даст тот же эффект, что и приведенный ранее пример. Как мы уже знаем, коды от 16 до 23 управляют цветами и позицией печати. Каждый из них может использоваться в составной строке. После CHR 16 (INK CONTROL) и CHR 17 (PAPER CONTROL) должны следовать CHR с указанным параметром цвета, a CHR 18... CHR 21 (FLASH, BRIGHT, INVERSE и OVER CONTROL) должны применяться вместе с CHR 0, CHR 1 или CHR 8.

Так, команда PRINT CHR 16 + CHR 2 + CHR 17 + CHR 6 + CHR 18 + CHR 1+ "SINCLAIR" изобразит на экране надпись "SINCLAIR" мерцающую красным и желтым цветами. Как и в случае, рассмотренном ранее, каждый знак плюс может быт заменен точкой с запятой.

После CHR 22 (AT CONTROL), как мы уже знаем, должны следовать два ключевых слова CHR с параметрами, указывающими номера строки и столбца позиции печати. Так команда PRINT CHR 22 + CHR 11 + CHR 16 + "W"

отпечатает в середине экрана символ "W".

После CHR 23 (TAB CONTROL) могут следовать 2 символа - это дает любопытный эффект: первое указывает позицию TAB, а второе обычно равно 0. Так команда

PRINT CHR 23 + CHR 16+ CHR 0+"S"

отпечатает в середине экрана символ "S".

Как видите, такое применение данных кодов достаточно примитивно, а техника программирования, как Вы понимаете, не стоит на месте. Был создан более эффективный способ внедрения управляющих кодов, позволяющий обойтись без CHR.

Я не располагаю информацией о том, кто и когда впервые начал использовать управляющие коды и кто впервые использовал их для защиты. Но мне известно одно, а именно: ни одна современная программа к "ZX SPECTRUM" не обходится без применения управляющих кодов в своей защите. В связи с этим, возникают два вопроса:

1. Как научиться ставить защиту использующую управляющие коды, аналогичную применяемым в фирменных программах?

2. Как научиться быстро и просто снимать эту защиту с фирменных программ?

Рассмотрим теперь практическое применение управляющих кодов. Итак по-порядку: BACKSPACE

Незаменим, когда вам необходимо скрыть какую-либо информацию Бейсика, например номер строки или некоторые другие атрибуты. За счет обратной табуляции Вы сможете также сокрыть от посторонних глаз особо ценную информацию.

Рассмотрим конкретный пример. Предположим у Вас имеется строка вида: 1 REM IT'S A FANTASTIC ТО USE BACKSPACE

а мы бы желали, чтобы во время листинга на экране не было видно ни номера строки, ни Бейсик-оператора REM. Для этого вам необходимо изменить текст исходной строки, а именно: ввести между оператором REM и исходной надписью 6 символов (не имеет значение каких), чтобы потом заменить их на управляющий код BACKSPACE. Причем между REM и вставленными символами, а также между вставленными символами не должно быть пробелов.

Теперь нам необходимо символьную комбинацию, которую мы добавили между REM и текстом заменить управляющим кодом BACKSPACE. Для этого вычислим адрес, по которому расположен первый символ данной комбинации.

Для этого используем известный нам факт, что область Бейсика начинается с адреса 23755 (это условие верно только в том случае, когда к компьютеру не подключен INTERFACE 1 с микродрайвом и некоторая другая периферия). В случае сомнений найдите этот адрес для своей системы сами, используя системную переменную PROG (23635, 2 байта): PRINT PEEK 23635 + 256*РЕЕК 23636

Количество символов, которое нам необходимо пропустить, равно пяти (4 символа это 2 байта номера строки и 2 байта длина строки + код оператора REM). Найдем адрес

ячейки, в которой хранится первый символ нашей комбинации:

23755+5=23760

Проверим это, подав команду:

PRINT CHR РЕЕК 23760

После этого заменим зарезервированную комбинацию управляющим кодом BACKSPACE. Подадим команды с клавиатуры:

FOR i=23760 TO 23765: POKE i,8: NEXT i

После чего содержимое нашей команды исчезнет с экрана, но оно останется в памяти и будет обрабатываться интерпретатором.

Для тех, кто желает оставить "надпись-памятку" для "хаккеров", рекомендую вернуться к примерам раздела 2.3.2. (самый первый шаг).

Практическое применение управляющих кодов INK CONTROL и PAPER CONTROL лучше всего описывать вместе, поскольку именно такое их использование приносит наилучший эффект. Итак, пo-порядку.

В защите применение INK CNTR и PAPER CNTR наиболее эффективно, когда нам необходимо скрыть текст листинга. Достигается это с помощью подачи команд, задающих одинаковый цвет INK и PAPER. Рассмотрим более подробно, как это сделать.

Предположим, Вы желаете сделать так, чтобы после подачи команды LIST экран оставался пустым. Для этого нам необходимо первой строкой программы поставить такую строку, которая бы "уничтожала" номер строки и изменяла цвета INK и PAPER управляющими кодами INK CONTROL и PAPER CONTROL. Чтобы стереть номер строки на экране нам понадобится использовать управляющий код BACKSPACE.

Итак, для начала зарезервируем место, используя оператор RЕМ, чтобы потом спокойно заполнять его управляющими кодами. Наберем 1 REM HHHHHHHHH 9символов

Нам необходимо зарезервировать место именно для 9 символов т.к. первые 5 заменит BACKSPACE, a остальные 2+2 мы используем для INK и PAPER CONTROL с соответствующими параметрами таким образом, чтобы сделать одинаковыми цвета символов и фона.

Для ввода первых пяти символов BACKSPACE подадим команду с клавиатуры:

FOR i=23760 TO 23764: POKE i,8: NEXT i.

Для задания черного цвета INK подадим команды POKE 23765,16: POKE 23765,0

Для задания черного цвета PAPER подадим команды POKE 23767,17: POKE 23768,0

Теперь следующие строки вводимые после этого операторы не должны быть видны. Введем первый оператор, создав новую Бейсик-строку и убедимся, что это соответствует действительности.

Теперь рассмотрим одно из наиболее любопытных применений управляющего кода AT CONTROL. Многим из Вас, наверняка доводилось встречать программы, при загрузке которых на экране появлялось лишь одно название программы (имеется ввиду, что отсутствовало слово PROGRAM), либо название программы появлялось в необычном месте экрана, например в середине. Достигалось это использованием кода AT CONTROL, а в первом случае с применением COMMA CONTROL. Итак, пo-порядку.

Для того, чтобы сделать такой заголовок, нам необходимо записать на ленту хэдер, содержащий управляющие коды.

Поскольку, сначала необходимо создать такой хэдер, то возникает, вопрос: "Как это сделать?", - ввиду того, что набор управляющих кодов с клавиатуры проблематичен.

Я предлагаю сделать следующее: после того, как Вы записали свою программу на ленту с любым названием, содержащим 10 символов, загрузить Ваш хэдер в копировщик COPY - COPY, найти там адрес ячеек, содержащих название, используя команду LIST и поменять их командой POKE, следуя нижеизложенным рекомендациям.

Для тех, кто не имеет копировщика COPY - COPY, возможен другой вариант. Одной из строк своей программы Вы делаете строку nn SAVE "имя программы" LINE m

После этого Вам необходимо получить дампинг памяти, используя одну из предложенных в этой главе программ. Запомнив адреса ячеек памяти, в которых находятся байты с названием Вашей программы, необходимо изменить их, следуя нижеизложенным рекомендациям, после чего обратиться к этой строке командой GO TO nn и записать файл в магнитофон. Неудобство второго метода заключается в том, что созданная Вами строка nn SAVE "имя программы" LINE m, должна будет остаться в программе, т.к. при записи хэдера в общую длину программы вошла также и длина этой строки.

Итак, какие надо делать изменения, чтобы название печаталось в произвольном месте экрана? Необходимо лишь задать данную позицию, используя управляющий код AT CONTROL. Из отводящихся под название 10 байтов, 3 будет занимать AT CONTROL со своими параметрами. Ввиду этого под само название остается лишь 7 байтов.

Для того, чтобы распечатать название NEITRON в позициях AT 10,12, Вам необходимо, чтобы в 10 байтах хэдера, отведенных под название, содержалась следующая комбинация:

22

10

12

78

69

73

84

82

79

78

AT CNTR

r

с

N

Е

I

Т

R

O

N

1

2

3

4

5

6

7

8

9

10

Если же мы хотим создать систему команд, уничтожающую слово PROGRAM, то необходимо действовать в следующей последовательности:

1) Установить курсор в позицию AT 1,0 используя код AT CONTROL, чтобы следующей командой стереть это слово.

2) Стереть слово PROGRAM, используя управляющий код COMMA CONTROL.

3) Установить курсор в то место экрана, с которого мы желали бы распечатать текст названия программы с помощью AT CONTROL.

4) Распечатать название программы.

Таким образом, как видим, в предложенном варианте под текст названия программы остается всего 3 знакоместа. Для тех, кому этого окажется мало, можно не делать пункт 3 данного плана, что позволяет сэкономить еще 3 байта. Итак, чтобы распечатать название программы MVS в позиции экрана 8, 8, уничтожив перед этим слово PROGRAM необходимо, чтобы 10 байтов заголовка имели вид:

22

1

0

6

22

8

8

77

86

83

AT CNTR

r

с

COM CNTR

AT CNTR

r

c

M

V

S

1

2

3

4

5

6

7

8

9

10

Возможно, что экспериментируя над управляющими кодами, читателю удастся обнаружить нечто новое в этой интересной области.

Теперь некоторые советы. Выше было описано использование управляющих кодов в операторе PRINT через CHR. Я полагаю, что Вам будет удобней экспериментировать именно используя непосредственно управляющие коды.

И последнее. Запомните, пожалуйста, что байт, стоящий после управлявшего кода, содержит именно значение данной цифры, а не её ASCII код. Это правило касается абсолютно всех управляющих кодов.

ПРОГРАММА ДЛЯ СНЯТИЯ ЗАЩИТ

Предназначена для программ, которые используют управляющие коды INK CONTROL и PAPER CONTROL.

9990 REM Программист МИХАЙЛЕНКО ВАДИМ МРТИ 010207,1991

9991 PAPER 7: INK 0: BORDER 7: CLS

9992 FOR I=23758 TO 65000

9993 IF PEEK I =13 THEN IF PEEK (I+1)=39 AND PEEK (I+2)=6 THEN STOP

9994 IF PEEK I=13 THEN LET I=I+4

9995 IF PEEK I=16 THEN POKE (I+1),0: LET I=I+2

9996 IF PEEK I=17 THEN POKE (I+1),7: LET I=I+2

9997 NEXT I

Краткое описание.

Задав необходимые значения цветов INK, PAPER и BORDER, программа в цикле начинает анализировать содержимое каждой ячейки памяти и, если встречается код INK CONTROL то цвет символов принудительно задаётся чёрным, а для PAPER CONTROL -белым.

Строка 9993 следит за тем, чтобы как только программа дойдёт до самой себя (до строки 9906), произошла остановка, поэтому наличие этой строки - обязательно.

Глава 3. Методы защиты от MERGE

Среди приемов, наиболее часто применяемых для взлома программ, одним из распространенных является использование MERGE вместо команды LOAD"". Это позволяет загрузить программу в память компьютера без ее автостарта.

Таким образом, в случае наличия в программе POKES, которые защищают от BREAK, либо делают листинг программы нечитаемым, их удается разблокировать.

Автостарт должен был бы запустить программу, что позволило бы организовать защиту посредством POKES, но MERGE загружает программу без автостарта.

Вот почему одним из первоочерёдных условий защиты является создание системы команд, способных защитить Вашу программу от использования MERGE"".

Для того, чтобы уяснить себе, как действуют данные методы защиты, необходимо проанализировать выполнение функции MERGE. Итак, рассмотрим, как работает этот раздел интерпретатора Бейсика. Как Вам уже вероятно известно, встроенные в ПЗУ программы обработки LOAD, SAVE, VERIFY и MERGE работают вместе, используя многие общие процедуры. Команда MERGE очень близка по своей сути к команде LOAD, естественно с некоторыми специфическими отличиями. В частности, MERGE загружает файл Бейсика в специальный буфер. После загрузки интерпретатор начинает анализировать последовательно каждую строку загруженной программы. Если все проанализированное с точки зрения интерпретатора верно, то происходит непосредственное выполнение команды MERGE, заключающееся в соединении двух программ в одну, причем новая программа затирает строки с теми же номерами, а также переменные с теми же именами.

Но это происходит лишь в том случае, если до загрузки командой MERGE в памяти уже находилась какая-либо программа. Если же мы загружаем посредством MERGE новую программу в очищенную память, то, естественно, никакого слияния не происходит, а программа просто загружается в память, анализируется интерпретатором и после этого компьютер останавливает свою работу, позволяя нам просмотреть листинг данной программы. Так использование MERGE вместо LOAD позволяет загрузить программу без автостарта.

Быть может, теперь у нетерпеливого читателя возникнет желание просмотреть все фирменные программы, используя эту команду. Что ж, попробуйте, но необходимо заметить, что в большинстве из них стоит защита от MERGE. Необходимость такой защиты очевидна из-за описанных выше возможностей для хаккеров просматривать программы. Поэтому профессионалы достаточно широко используют данный метод защиты.

Рассмотрим теоретические аспекты работы защит от MERGE.

Как вам уже известно, работа оператора MERGE заключается в том, что он загружает программу в специальный буфер и там её анализирует. Если анализ проходит успешно, то никаких сбоев не будет, но если он проходит не "очень гладко", то компьютер просто-напросто зависает. То есть, как видим, задача программиста, разрабатывающего защиту от MERGE, состоит в том, чтобы его программа имела "встроенный дефект", который бы после загрузки с помощью MERGE проявлял себя. В то же время необходимо отметить, что этот "дефект" не должен никак проявляться после загрузки программы командой LOAD"".

Одним из методов, позволяющих осуществить подобную защиту, является задание фальшивого номера строки параллельно с фальшивой длиной строки. Фальшивый номер и длина строки сразу же проявятся, как только интерпретатор начнет анализировать программу во время выполнения команды MERGE.

Но существует один нюанс, который тоже необходимо учитывать. Интерпретатор анализирует и ту строку программы, которую он выполняет во время работы программы. А это значит, что если после загрузки программы интерпретатору Бейсика попадается созданная нами строка, то работа компьютера будет прервана по ошибке:

"Ошибка в Бейсике (NONSENSE IN BASIC)"

Следовательно, нам необходимо создать данную строку таким образом, чтобы она никогда не обрабатывалась интерпретатором во время работы программы. Одним из методов, позволяющим сделать это, является размещение данной строки в самом конце программы.

Рассмотрим, как это осуществить на практике.

Предположим, Вами создана программа, причем одним из необходимых условий является то, чтобы номера последних шагов программы не превышали 9980, поскольку в этой области памяти мы разместим специальную программу, которая создаст вам требуемую строку защиты от MERGE.

9985 FOR I=23758 TO 65000

9986 IF PEEK I=13 THEN IF PEEK (I+1)=39 AND РЕЕК (I+2)=6 THEN POKE (I+1),255: POKE(I+2),255:

POKE(I+3),255: POKE(I+4),255: PRINT "THE END": STOP

9987 NEXT I

9990 REM защита от MERGE

9994 REM ПРОГРАММИСТ МИХАИЛЕНКО ВАДИМ, МЕНСК, МРТИ, ГР 010207.

Данная программа осуществляет принудительное изменение одного из номеров содержащихся в ней же строк. Номер этой строки - 9990, так что наличие ее в программе -обязательно. Если читатель хочет оставить памятку - сообщение для взломщиков, то он может написать в этой строке после REM произвольный текст, достаточно убедительно показывающий непосвященному, что программа защищена именно Вами. Подобные комментарии постоянно оставляет после себя один из наиболее известных в нашей стране "хаккеров" BILL GILBERT, причем он использует именно этот метод защиты от MERGE"".

Программа действует следующим образом. В цикле анализируется содержимое текущей ячейки памяти. Если оно равно 13, то, следовательно, это код ENTER, а это, в свою очередь, не что иное, как окончание данной строки. А раз данная строка окончена, то, зная структуру Бейсик-программы, мы можем утверждать, что после этого кода следуют 4 байта, ответственные за номер следующей строки и за ее длину. Раз так, тогда анализируем номер строки. Если его кодовое представление равно 9990, - именно этот номер нам необходим, то тогда принудительно засылаем в ячейки Бейсика, ответственные за номер, значение 255, чтобы умышленно изменить содержащиеся там правильные значения. После того, как эта операция закончится, на экране печатается "THE END" и программа останавливается.

После того, как Вы создали "защитную" строку Вы уже не увидите ее на экране. Но она будет последней строкой и Вам необходимо строго соблюдать условие, чтобы интерпретатор Бейсика данную строку не анализировал.

После того, как предложенная программа выполнила возложенную на нее миссию -создала строку защиты от MERGE, её необходимо уничтожить, подав команды:

9984 ENTER

9985 ENTER

9986 ENTER и т.д.

Заканчивая рассмотрение системы защиты от MERGE, хотелось бы подчеркнуть тот факт, что здесь был описан лишь один из многочисленных приемов, применяющихся для создания защитной строки на Бейсике, препятствующих применению MERGE. Но то, что эта программа производит автоматически, можно осуществлять и "вручную", если использовать специальную программу для получения "дампа" памяти, описанную в предыдущей Главе.

Существуют методы защиты, достаточно кардинально отличающиеся от описанного

выше.

Мы уже говорили о том, что в БЕЙСИК-строке можно разместить программу в машинных кодах. Это используется с помощью применения оператора Бейсика REM и описано в ГЛАВЕ I. Там же указано, что для нормальной работы интерпретатора необходимо, чтобы программа в машинных кодах не содержала кода перевода строки - 13. Это объясняется тем, что интерпретатор, анализируя данную строку Бейсика, определяет ее окончание именно по коду 13 и, если он его находит, то следующие за ним 4 байта он рассматривает, как номер и длину следующей, БЕЙСИК-строки. А эти байты, естественно, не могут правильно характеризовать БЕЙСИК-строку и, следовательно, должен произойти сбой в работе интерпретатора. Это очень напоминает ситуацию, когда мы пытались сделать фальшивыми номер и длину первой идущей в программе строки. То же самое происходит и в нашей программе, если мы используем в ней машинные коды, в которых есть код 13.

В этом есть некое рациональное зерно. Преимущества налицо, если у Вас есть программа, в которой на Бейсике сформирована строка машинных кодов, где присутствует код 13 (если он отсутствует, то его можно внедрить в программу, используя специальную директиву АССЕМБЛЕРа DEFB). В этом случае Вам уже не понадобится формировать специальную строку, ответственную за защиту от MERGE, что способствует экономии оперативной памяти, а это очень немаловажно для Бейсика, особенно если это загрузчик.

В то же время, следует учитывать, что этот метод может оказаться недействительным, если программа в кодах будет стоять в первой строке БЕЙСИКа. В этом и заключена одна из сложностей применения данного метода, поскольку интерпретатор начинает анализировать программу в машинных кодах, как несколько строк БЕЙСИК-программы, разделенных кодом 13. В этом случае он может остановить свою работу и выдать код сообщения об ошибке:

NONSENSE IN BASIC

Избавиться от проблемы можно, если сделать, чтобы машинные коды шли последней строкой программы. Осуществляется это достаточно просто: необходимо при создании своей программы лишь соблюсти определенную последовательность операций, которая и приведет к желаемому результату:

- Сначала формируем строку с машинными кодами, но теперь при формировании даем ей такой номер, чтобы все строки нашей исходной программы размещались до нее.

Причем необходимо, чтобы до начала следующего пункта нашего плана эти строки были сформированы. Здесь необходимо отметить тот факт, что даже в команде запуска программы в машинных кодах (RANDOMIZE USR NN) должны присутствовать значения цифр и именно такие, чтобы они приблизительно указывали на место расположения Вашей программы в кодах. Это необходимо для того, чтобы ваша программа имела точно фиксированное место расположения в оперативной памяти компьютера. После того, как мы в следующем пункте найдем точку старта подпрограммы в кодах, нам останется лишь заменить адрес в команде RANDOMIZE USR на правильный, но количество символов, соответствующих номеру старта не должно поменяться, т.к. уменьшение или увеличение числа цифр в номере приведет к смещению на один байт нашей программы в кодах. В общем случае после команды RANDOMIZE USR должно следовать пятизначное число, указывающее на какой-либо адрес, а после обнаружения правильного значения, это число соответственно откорректируется.

Для того, чтобы обнаружить истинное место в оперативной памяти нашей программы, можно использовать несколько методов:

1 - В частности, поручить это делать компьютеру, составив соответствующую программу.

2 - Сделать просмотр памяти "вручную".

В любом из этих случаев нам понадобится вводить дополнительные строки в Бейсик, а делать это необходимо таким образом, чтобы они размещались после строки, в которой содержится подпрограмма в кодах (используя такой прием, мы не изменим местоположение этой строки с подпрограммой в оперативной памяти).

В первом из рассмотренных случаев нам понадобится составить программу, чтобы она самостоятельно в цикле анализировала бы область Бейсика с тем, чтобы обнаружить там номер строки в кодах. При обнаружение этой строки она должна распечатать номер с учетом 4-х байтов, отводящихся под номер и длину, и с учетом пятого байта, отведенного под REM. Выше было приведено достаточное количество подобных программ анализаторов, так что я надеюсь, что читатель сам справится с этой задачей.

Второй случай аналогичен первому с той разницей, что вам придется использовать программу получения дампинга, которая также была приведена в предыдущей главе.

Естественно, что после того, как эта программа выполнит свою задачу, ее строки необходимо будет уничтожить.

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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Великолепная Зейнаб - Из всех поэтических легенд неизвестных авторов Ближнего востока, дошедших до нас, есть легенды, полные глубоких эмоций и ни с чем несравненной непосредственной красоты изложения.
Программирование - о выводе спрайтов.
B.B.S. Новости - Несколько телеконференций,касающихся дальнейшего развития ZX-Spectrum'a.
INTRO - Объем текста очень велик.
Реклама - каталог (Прайс - лист) фирмы Nemo

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