ZX-Spectrum изнутри 1969 г.

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


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

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

4.1. CHR$ 6 -"COMMA CONTROL".

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

PRINT "1","2" и PRINT "1"+CHR$ 6+"2"
имеют идентичное значение.

4.2 CHRJ 22 -"AT CTRL".

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

Чтобы попробовать с помощью этих символов сделать листинг прог-
раммы невидимым, введите:

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

После инструкции REM введите три пробела, а после "!" - две уп-
равляющие запятые. Их можно получить непосредственно с клавиатуры,
нажимая последовательно клавиши EXTEND (или оба SHIFT вместе), чтобы
получить курсор "Е", а затем клавишу."8" (курсор сменит цвет на жел-
тый) и DELETE - курсор перескочит к ближайшей половине экрана.

После ввода этой строки заменим три пробела после REM на знак AT
0, 0 с помощью

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

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

4.3. CHR$ 23 - "TAB CTRL'*.

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

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

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

CHR$ 16 - INK CTRL
CHR) 17 - PAPER CTRL
CHR$ 18 - FLASH CTRL
CHR$ 19 - BRIGHT CTRL
CHR$ 20 - INVERSE CTRL
CHR$ 21 - OVER CTRL

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

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

Если Вы хотите взломать программу-загрузчик, то его не обязатель-
но очищать - важно узнать, что эта программа делает, каким образом
загружает в память и запускает следующие блоки (а не стараться, чтобы
она это делала "ладно" и была написана чисто г прозрачно). Это тем
более важно* что пока не узнаешь точно программу, лучше не делать в
ней никаких изменений - одна ловушка может проверяться другой. Поэто-
му наилучшим способом раскручивания программы является анализ ее ра-
боты шаг за шагом при просмотре последовательных байтов памяти:
0 BORDER 0: PAPER 0: INK 0: CLS: PRINT #0,
"LOADING";: FOR N«0 TO 20 STEP 4: BEEP .2,N:
NEXT N: LOAD M" CODE: PRINT AT 19,0;:
L0A0 "" CODE: PRINT AT 19,0;: LOAD "" CODE:
PRINT AT 19,0;: LOAD "" CODE: PRINT AT 19,0;:
LOAD ии CODE: RANDIMI2E USR 24064

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

Это было бы все, если речь шла только об управляющих символа*. Ко
есть еще одна вещь» которую требуется объяснить, чтобы Вы не имели
проблем с чтением БЕЙСИКа. Речь идет об инструкции DEF FN. Введите, а
затем внимательно просмотрите такую строку:
10 DEF FN А(А,В$,С) * А+С
Кажется, что она должна занять в памяти 19 байтов (номер строки,
ее длина, ENTER и 14 введенных символов), но это не так. Интерпрета-
тор после каждого параметра функции поместил знак CHR$ 14 и зарезер-
вировал зачем-то следом еще 5 байтов. Введите

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

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

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

FOR N«23755 ТО РЕЕК 23627+256*РЕЕК 23628: PRINT N;

"; РЕЕК N. CHR$ РЕЕК N AND РЕЕК N>31: NEXT N
После такого загрузчика на ленте находится 5 следующих блоков:
экран, закодированный главный блок программы и три коротеньких блока,
защищающих программу. Первый - однобайтовый (код инструкции JP HL),
второй - из нескольких байтов (это - процедура, декодирующая всю
программу) и третий - двухбайтовый, загружаемый по адресу 23672 или в
переменную FRAMES. Значение этой переменной увеличивается на 1 через
каждые 1/50 секунды. В машинной программе, запущенной с помощью
RANDOMIZE USR 24064, ее значение проверяется и, если оно отличается
от того, каким должно быть (что означает остановку программы после
загрузки на какое-то время), выполняется обнуление памяти компьютера.
Взлом программ такого типа весьма прост. Достаточно загрузить все
блоки за исключением последнего, а после просмотра программы или же
проведения в ней необходимых изменений (например - посредством РОКЕ)
ввести

LOAD "" CODE: RANDOMIZE USR 24064
(но обязательно - в одной строке) чтобы запустить игру. Отдельной ра-
ботой является декодирование программы или запуск процедуры, декоди-
рующей так, чтобы она по завершению работы вернулась в БЕЙСИК. У чи-
тателей, знающих АССЕМБЛЕР, это не должно вызвать затруднений, однако
с учетом распространенности этого типа защиты, особенно в пользова-
тельских программах (например - ARJL STUDIO или THE LAST WORD) мы еще
вернемся к этой теме.




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

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



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

Похожие статьи:
Частотный регламент - Частотный регламент радиостанций в г.Санкт-Петербурге.
Игрушки - Разработка игр на Evo SDK (часть 1).
Капля припоя - О проблеме в прошивке расширенной клавиатуры (в "таганрогской" схеме) в IS-DOS.
Энциклопедия - о создании энциклопедии всех представителей сцены.
От редакции - Новости от Юза Гаррисона.

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