Работа с ZX-Spectrum 1993 г.

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


ГЛАВА 4

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

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

CHR$ 6 - «СОММА CONTROL»

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

а также

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

CHR$ 22 - «AT CTRL»

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

PRINT CHR$ 22; CHR$ 10; CHR$ 7; "Г
Чтобы убедиться, как с помощью этого символа сделать листинг прог-
раммы невидимым, введите, например:

10 RANDOMIZE USR 30000: REM ничего не видно!

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

РОКЕ 23774, 22; РОКЕ 23775, 0; РОКЕ 23776,0

Попробуем теперь посмотреть программу. На экране не появится текст
всей строки - начальная её часть закрыта надписью, находящейся после
инструкции REM и знака AT CTRL. Такие же трудности возникнут, если эту
строку перенести в зону редактирования (клавиша EDIT).

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

CHR$ 23 - "TAB CTRL"

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

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

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

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 это могут быть числа
О ...9, после FLASH и BRIGHT: 0, 1 и 8, после INVERSE и OVER: 0 и 1. За-
дание других значений вызывает сообщение: «INVALID COLOUR» и, естест-
венно, прерывание просмотра программы.

Высвечивая программу, защищенную управляющими символами цветов,
принимаем на себя следующую последовательность действий. Например,
если, просматривая текст программы, мы встречаем код знака PAPER CTRL,
то заносим в его второй байт значение 0. если INK CTRL - значение 7, в
остальные управляющие цветами символы - значение 0. Кроме того, удаляем
все мешающие знаки BACKSPACE (CHRS 8) путем их замены пробелами
(CHRS 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""CODE:
PRINT AT 19,0;: LOAD""CODE: PRINT AT 19,0::
LOAD""CODE: PRINT AT 19,0;:LOAD "" CODE:
PRINT AT 19,0; : LOAD "" CODE: RANDOMIZE USR 24064
Помните о правильной интерпретации очередных байтов: сначала 2 бай-
та номера строки, потом 2 байта содержания её длины, (которая может быть
фальшивой), затем текст: инструкция BASIC'a, потом её параметры, за каж-
дым числом дописываются CHRS 14 и пять байтов, содержащих значение
этого числа. За параметрами - двоеточие и следующая инструкция или
«ENTER» и новая строка программы.

Это было бы все, если речь идет об управляющих символах. Но есть ещё
одна вещь, которую требуется объяснить, чтобы Вы не имели неприятностей
с чтением BASIC'a. Речь идет об инструкции DEF FN. Введите, а затем
внимательно посмотрите такую строку:

10 DEF FN А(А,В$,С)=А+С
Кажется, что она должна занять в памяти 19 байтов (номер строки, её
длина, ENTER, а также 14 введенных символов), но это не так. Интерпретатор
после каждого параметра функции поместил знак CHRS 14 и доре-
зервировал зачем-то следом ещё 5 байтов. Введите:
PRINT FN А (1,"125",2)
и снова внимательно просмотрите содержимое памяти с адреса 23755.
После первого параметра в определении функции далее находится CHRS 14,
но после него последовательно расположились: 0,0,1,0,0, что в пятибайтовой
записи означает число 1. Также после третьего параметра функции на-
ходится CHRS 14 и байты, содержащие число 2. После параметра В$ также
находится значение использованного параметра: CHRS 14 и пять байтов, ко-
торые последовательно содержат: первый для нас не имеет значения, второй
и третий содержат адрес, по которому находилась цепочка символов "123"
(вызов функции был осуществлен в директивном режиме, следовательно,
этот адрес относится к области редактирования строки BASIC'a), а байты 4 и
5 - это длина цепочки - в нашем случае она составляет 3 знака.

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

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

FOR N=23755 ТО РЕЕК 23627 + 256*РЕЕК 23628 :

PRINT N;" PEEK N, CHR$ PEEK N AND PEEK N 31:
NEXT N

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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Мысли - Достоин ли NEMO (Вячеслав Скутин) уважения?
Вокруг света - Билл Гейтс: О WINDOWS - только хорошее.
Вступление - за последнее время стало появляться порядком. К чему бы это?
Новости - к нам пришло письмо из Казани от Г.Рустама из EXCESS Group.
Новости - новинки игр: Mortal Kombat, Ice Climber, Streat Fighter, CJ Elephant Fujitive, NB JAM. Новости от известных спектрумовских комманд.

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