Тайники ZX Spectrum и как установить вечную жизнь 1994 г.

Глава 4-5 - "защитные" управляющие символы, символы смены атрибутов.


4. "ЗАЩИТНЫЕ" УПРАВЛЯЮЩИЕ СИМВОЛЫ

В этом разделе мы познакомимся с остальными управляюими символами. Три из
"них касаются изменения места вывода, шесть - смены атрибутов.

4.1. CHR# б - "COMMA CONTROL-

Этот символ (управляющая запятая) действует также как запятая, отделяющая
тексты в инструкции PRINT, т. е. выводит столько пробелов (но всегда не менее
одного), чтобы оказаться в колонке 0 или 16:
PRINT "Г, "2"
а также

PRINT T+CHRS 6+"2"
имеют идентичное значение.

4.2. CHR$ 22 - WAT CTRL"

Этот символ (AT управляющий) позволяет переносить позиции вывода в любое
место экрана также» как AT в инструкции PRINT. После этого знака должны появить-
ся два байта, определяющие номер строки и номер колонки, в которой должен быть
расположен следующий знак: PRINT AT 10,7,1" равнозначно PRINT CHR$ 22;CHR$
10; CHR$ 7;"!".

Чтобы убедиться как с помощью этого символа делать программы невидимыми
(листинги программ), введи, например:

10 RANDOMIZE USR 30000: REM НИЧЕГО НЕ ВИДНО!

После инструкции REM введи три пробела, а после восклицательного знака две
управляющие запятые. Их можно получить непосредсвенно с клавиатуры, нажимая
последовательно клавиши: EXTENT (или оба SHIFTa вместе) чтобы получить курсор
"Е", а Затем клавишу "6й (курсор сменит цвет на желтый) и DELETE курсор переско-
чит к ближайшей половине экрана. После ввода этой строки заменим три этих пробела
на знак AT 0,0.

С помощью: РОКЕ 23774,22 : РОКЕ 23775,0 : РОКЕ 23776,0 попробуем теперь
посмотреть программу. На экране не появится текст всей строки - начальная часть ее
закрыта надписью, находящейся после инструкции REM и знака AT CTRL. Такие же
трудности возникают, если эту строчку перенести в зону редактирования (клавйша
EDIT).

Координаты, заданные в символе AT CTRL должны находиться в поле экрана, т.
е. номер строки не может быть больше 21, номер колонки не больше 31. Задание
больших значений в случае PRINT или LIST вызывает сообщение "OUT OF SCREEN"
и отмену дальнейшего вывода, если же листинг получен нажатием "ENTER" (автома-
тический листинг) - также наступит прекращение дальнейшего вывода, а кроме того,
в нижней части экрана появится мигающий знак вопроса - сигнал ошибки. Следова-
тельно, это практически способ защиты от просмотра текста для каждой программы.

43. CHR$ 23 - TAB CTRL"

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

5. СИМВОЛЫ СМЕНЫ АТРИБУТОВ

Эту группу управляющих смволов составляют символы, меняющие атрибуты:

CHR$ 16 -INK CTRL

CHR$ 17 - PAPER CTRL

CHR$ 18 -FLASH CTRL

CHR$ 19 - BRIGHT CTRL

CHR$ 20 - INVERSE CTRL

CHR$ 21 -OVER CTRL

После каждого из этих символов обязателен один байт, уточняющий о каком
атрибуте идет речь, после символов INK и PAPER это могут быть числа 0...9, после
FLASH и BRIGHT 0,1/8 после INVERSE и OVER : 0 и 1. Задание других значений
вызывает сообщение: "INVALID COLOUR" и, естественно, прерывание просмотра
программы.

Высвечивая программу, защищенную управляющими символами цветов, прини-
маем для себя следующую последовательность действий. Например, если просматри-
вая текст программы мы встречаем код знака PAPER CTRL, то заносим в его второй
байт значение 0, если INK CTRL - значение 7, в остальные управляющие цветами
символы - значение 0. Кроме того, удаляем все знаки BACK SPACE (CHR$ 8) путем
их замены пробелами (CHR$ 32) .Также ликвидируем знаки AT CTRL - заменяем с
помощью РОКЕ три байта символа на пробелы. После такой корректуры программу
можно уже листать без всяких сложностей.

Если ты хочешь взломать программу - загрузчик, то его не обязательно и в прин-
ципе не надо очищать - важно узнать, что эта программа делает, каким образом
загружается в память и запускает следуюие блоки, а не стараться, чтобы она делала
"ЛАДНО" и была написана чисто и прозрачно. Это тем более важно, пока не узнаешь
точно программу, лучше не делать в ней никаких изменений - одна ловушка может
проверяться другой, поэтому наилучший способ раскалывания программы это анализ
ее работы шаг за шагом, считывая последовательные байты памяти:

0 BORDER 0: PAPER 0: INK OsCLSO: PRINT #0, "LOADING";: FOR N-0 TO 20
STEP 4: BEEP 2,N : NEXT N: LOAD ""CODE: PRINT AT 19,0 LOAD "" CODE:
PRINT AT 19,0;: LOAD "" CODE: PRINT AT 19,0 ^LOAD "" CODE: PRINT AT 19,0;
RANDOMIZE USR 24064

Помни о правильной интерпретации очередных байтов: сначала два байта номера
строки, потом два байта содержания ее длины (которая может быть фальшивой),
затем текст: инструкция БЕЙСИКа, потом ее параметры. За каждым числом записы-
вается CHR$ 14 и пять байтов, содержащих значение этого числа за параметрами -
двоеточие и следующая инструкция или ENTER и новая строка программы.

Это было бы все, если речь идет об управляющих символах, но есть еще одна вещь,
которую требуется объяснить, что бы ты не имел неприятностей с чтением БЕЙСИКа.
Речь идет об инструкции DEF FN. Введи, а затем внимательно просмотри такую
строку:

10 DEF FN А (А,В$,С)авА+С

Кажется, что она должна занять в памяти 19 байтов (номер строки, ее длина,
ENTER, а также 14 введенных символов), но это не так. Интерпретатор после каждого
параметра функции поместил знак CHR$ 14 и дорезервировал зачем-то следом еще
пять байт. Введи:

PRINT FN А(1,"125"Л

и снова посмотри содержимое памяти с адреса 23755. После первого параметра в
определении функции далее находится CHR$ 14, но после него последовательно
расположились: 0, 0,1,0,0, что в памяти байтов записи обозначает 1. Также после
третьего параметра функции находится CHR$ 14 и байты, содержащие число 2. После
параметра В$ также находится значение использованного параметра: CHR$ 14 и пять
байтов, которые последовательно содержат: первый для нас не имеет значения, второй
и третий содержат адрес, по которому находится цепочка символов "125" (вызов
функции был осуществлен в директивном режиме, следовательно этот адрес относит-
ся к области редактирования строки БЕЙСИКа), а байты 4-5 это длина цепочки - в
нашем случае она составляет три знака.

Помни об этом, читая БЕЙСИК с помощью РЕЕК, а не LIST, иногда случается, Что
именно в этих байтах, зарезервированных для действительных ар1ументов функции
Скрыты проверки, определяющие работоспособность программы или даже машинная
программа, загружающая последующие блоки (например, BETA BASIC 1,0).

В конце немного о программах-загрузчиках. Их задачей является считывание и
запись всех блоков, составляющих программу. Обычно они это делают способом,
максимально затрудняющим понимание их работы - так, чтобы запуск программы
друшм способом, а не через загрузчик (или на практике валом программы) был не
возможен. Посмотрим на загрузчики применяемые в большинстве продукции фирмы
ULTIMATE ( например, ATIC, АТАС, KUINGHTLORB, PENTAGRAM, NIGHT
SHADE и т. д.). Выглядят они так:

FOR №23755 ТО PEEK 23627+256*РЕЕК 23628j PRINT N;" "fcPEEK N; CHR$
РЕЕК N AND PEEK>3lt NEXT N

После такого загрузчика на ленте находятся пять следующих блоков: экран, зако-
дированный блок программы, а за ним три коротеньких блока, защищающих про-
грамму: однобайтовый (код инструкции JP(HL), из нескольких байтов (это процеду-
ра, которая декодирует всю программу) и последний двухбайтовый загружаемый по
адресу 23627, или в переменную FRAMES. Значение этой переменной увеличивается
на 1 через каждые 1/50 секунд. В машинной профамме, запущенной с помощью
RANDOMIZE USR 24064, ее значение проверяется и если отличается от того каким
должно быть (что означает, что аде-то после загрузки программа была остановлена на
какое-то время), наступает обнуление памяти компьютера. Взлом программ этого
типа весьма прост. Достаточно загрузить все блоки за исключением последнего, а
после просмотра программы или же приведении в ней определенных изменений
(например, вписание РОКЕ) достаточно лишь ввести: LOAD"" CODE: RANDOMIZE
USR 24064 (но обязательно в одной строке, разделяя инструкции двоеточием), чтобы
запустить игру.

Отдельной работой является декодирование программы, или запуск процедур,
декодирующих так, чтобы она вернулась в БЕЙСИК. У читателя, знающего ассемб-
лер, это не должно вызывать затруднений, однако с точки зрения на распространен-
ность этого типа защиты, особенно в пользовательских программах (например ART
STUDIO или THE LAST WORD), мы еще вернемся к этой теме.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Epilogue - The End
Зазеркалье - Эти сексуальные пришельцы.
Огни саламандры - Работа над игрой идет полным ходом...
От редакции - Газете исполнился год...
Sofтинка - Описания и история изменений программы для работы с жестким диском HDDoctor v0.9.

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