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

Основы работы. Глава 6. - защита программ.


ГЛАВА 6

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

Защита программ состоит в исключении возможности просмотра или
внесения изменений в текст программы лицом, не уполномоченным на это
автором программы.

Методов защиты много. Здесь же мы рассмотрим лишь основные
принципы и обозначим подходы к этой проблеме. Можно выделить 3 основ-
ных направления:

• 1) исключить возможность остановки (прерывания) программы;

• 2) исключить возможность подачи команды LIST (распечатки текста);

• 3) сделать листинг программы нечитабельным.

ИСКЛЮЧЕНИЕ ВОЗМОЖНОСТИ ОСТАНОВКИ ПРОГРАММЫ

Первое, что Вы должны сделать - это автостарт программы. Авто-
матический старт программы запрашивается при выгрузке ее командой
SAVE "ИМЯ" LINE N. После загрузки такой программы она будет сама
стартовать с указанной вами строки (N). Тем не менее, она может быть оста-
новлена командой BREAK или, при появлении сообщения об ошибке, можно
«отрубить» клавишу BREAK, если в той строке, с которой идет автостарт,
поместить команду:

РОКЕ 23613, РЕЕК 23730 - 5

Остановку по ошибке можно исключить, если хорошо отладить Вашу
программу. Знайте: чтобы «взломать» программу, часто сознательно вводят
неверные символы для внесения ошибки в работу оператора INPUT. Так,
если программа просит от пользователя ввести какое-то число, взломщик
нажимает на буквенную клавишу. Тогда программа останавливается с сооб-
щением «VARIABLE NOT FOUND». Поэтому рекомендуем не использовать
оператор INPUT, а организовывать опрос клавиатуры на основе функции
INKEYS.

Если в строке автостарта поместить следующие команды, то при появ-
лении ошибки и при попытке сделать BREAK программа будет сбрасываться:
LET ERR=256*PEEK 23614 23613: POKE ERR,0:
POKE ERR+1,0

Примерно тот же эффект дает помещение в той же строке команды:
РОКЕ 23659,0

Один из способов остановки автостартующей программы дает исполь-
зование команды MERGE "" вместо LOAD при загрузке. Если размер ва-
шей программы больше 7К, то защитить ее от этого приема можно, если
перед выгрузкой подать следующие прямые команды:
LET Х=256*РЕЕК 23636+РЕЕК 23635 :
POKE X,60 : РОКЕ Х+1,0

Другой способ защиты от MERGE - это перед выгрузкой программы на
ленту дать ложную информацию о том. что якобы первая строка Вашей
программы имеет чрезвычайно большую длину. Это делается прямой коман-
дой:

РОКЕ (РЕЕК 23635 + 256*РЕЕК 23636 + 3).255
ОТКЛЮЧЕНИЕ КОМАНДЫ LIST

Введите первой строкой программы "1 REM". Перед выгрузкой ее на
ленту дайте прямую команду.

РОКЕ (РЕЕК 23635 + 256*РЕЕК 23636),100

Теперь программу можно запускать, но читать ее нельзя

КАК СДЕЛАТЬ ТЕКСТ ПРОГРАММЫ НЕЧИТАЕМЫМ

Простейший прием, применяемый во многих программах. - установить
одинаковыми цвета символов (INK) и фона (PAPER), например:
10 INK 7: PAPER 7

Ну. а в тех местах, где программа должна сделать вывод на экран, в
операторе PRINT временно вставляют правильные цвета:
20 PRINT IN К 0 : "HELLO!"

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

РОКЕ 23606,8 : PRINT " ZX-SPECTRUM" : POKE 23606.0

Если адресовать CHARS в те. области памяти, где вообще ничего нет.
например.

РОКЕ 23607,200

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

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

РОКЕ 23755,0 : РОКЕ 23756.0

ОПЕРАЦИИ С ЭКРАНОМ

Типичной задачей начинающих программистов на SPECTRUM'e бывает
создание красочных изображений в графике высокого разрешения, хранение
их в памяти и вывод на экран.

Мы не будем рассматривать графические операции с операторами
DRAW, CIRCLE. PLuT. а также печать символов графики пользователя, а
разберем операции с экраном, созданным графическим редактором. Наибо-
лее удобным в работе является редактор ARTSTUDIO. но можно использо-
вать и любой доступный.

Созданное в редакторе изображение Вы можете выгрузить на ленту в
виде блока кодов длиной 6912 байтов. Если потом загрузить его:
LOAD CODE 16384,6912

то изображение сразу появится на экране, но хранить его там.
разумеется, нельзя. Можно загрузить изображение в произвольное место и
вызывать его оттуда на экран в нужный момент. Примем адрес для хранения
«картинки» 30000. Тогда:

LOAD "" CODE 30000, 6912

Переброску на экран можно организовать в BASIC'e так:
500 FOR 1-1 ТО 6912
510 РОКЕ 16383+1, РЕЕК 29999+1

520 NEXT I
530 RETURN

Всякий раз для выдачи изображения на экран Вы можете сделать это
командой GO SUB 500. К сожалению, этот метод очень медленно работает,
что связано с ограниченными возможностями BASIC'a Построение экрана
таким способом занимает более 20 секунд! Возможность быстрой
переброски экрана (менее 1 секунды) дает программирование в машинном
коде Для этой цели процессор Z80 имеет мощную команду LDiR
(перемещение блоков памяти). Ее код: 237,176 Перед ее выполнением необ-
ходимо. чтобы в регистре HL процессора находился адрес начала блока, под-
лежащего переброске (в нашем примере - 30000). в регистре ВС - длина
блока (у нас - 6912). а в регистре DE - адрес места назначения (16384). Тогда
программа в машинном виде будет выглядеть так:

Машинный код

Ассемблер

Комментарий

33 48 117

LD HL.48 117

Загрузить к HL 30000.

Обратите внимание: 48 = 117 * 256 - 30000.

1 0 21

LD ВС.О 27

В регистр ВС <- 6912

17 0 64

LD DL.0 64

DE « 16384

237 176

LDIR

Выполнить переброску

201

RET

Возврат в вызывающую программу

Итак, программа выглядит в машинном коде так:

33,48, 117, 1,0. 27. 17, 0, 64, 237, 176, 201 .
Поместим ее в произвольное место памяти, например, с адреса 65000
следующей BASIC-программой:
10 FOR 1=1 ТО 12
20 READ А
30 РОКЕ 59999+1,А
40 NEXT I

50 DATA 33,48,117,1,0,27,17,0,64,237,176.201
Теперь, когда Вам понадобится поместить картинку на экран. Вам стоит
лишь стартовать эту процедуру командой:
RANDOMIZE USR 65000 .
Если же Вы храните не одно, ja несколько изображений, то их также
можно перебрасывать этой процедурой, предварительно изменив адрес
источника, поступающий в регистр HL. что в нашем случае делается коман-
дами РОКЕ по адресам 65001 и 65002. Предположим, что у Вас есть вторая
картинка, помещенная с адреса 37000. Тогда подсчитаем: INT (37000/25ь) =
144, а 37000 - 256 * 144 = 136. Выполним :

РОКЕ 65002,144 : РОКЕ 65001,136

Тогда

RANDOMIZE USR 65000
обеспечит нам перенос на экран второй картинки, и т.д. и т.п.
Очевидно, поскольку каждый экран занимает 6912 байтов, поэтому
одновременно в памяти нельзя хранить более 6 изображений, что во многих
случаях - «1У/Лиовато будет». Но если учитывать, что каждое изображение
обычно имеет длинные последовательности нулей (нулевых битов), то имеет-

ся возможность вдвое и более сокращать объем хранимого изображения за
счет сжатия, компрессирования его.

Мы предлагаем вашему вниманию две процедуры в машинном коде.
Первая называется FNS и служит для компрессирования изображения с
экрана и помещения его в указанное пользователем место. Адрес для
размещения сжатого изображения задается в виде двух параметров: Н -
старший байт и L - младший байт адреса. Сама процедура располагается с
адреса 56600 и занимает 60 байтов. Вторая процедура - обратная первой -
служит для декомпрессии изображения из области, заданной пользователем
теми же двумя параметрами (H.L), и помещения его на экран. Адрес
размещения этой процедуры - 56500, длина - 40 байтов. Называется она FNT.

Чтобы создать эти процедуры, надо набрать и выполнить следующие
BASIC - программы. После того, как они отработают, выгрузить созданные
процедуры на ленту командами:

SAVE "FNS" CODE 56600,60 и

SAVE "FNT" CODE 56500,40

В дальнейшем можете использовать их в своих программах.

ПРОЦЕДУРА FNS

8300 LET В=56600: LET L=60: LET Z*>: RESTORE 8310

8301 FOR 1=0 TO L-l: READ A

8302 POKE <B+I),A: LET 2>=Z+A

8303 NEXT I

8304 LET 2>INT(((Z/L)-INT(Z/L))*L)

8305 READ A: IF AZ THEN PRINT "???": STOP

8310 DATA 42,11,92,1,4

8311 DATA 0,9,86,14,8

8312 DATA 9,94,237,83,82

8313 DATA 221,33,0,64,6

8314 DATA 1,126,44,32,8

8315 DATA 36,245,124,254,91

8316 DATA 40,16,241,78,185

8317 D.ATA 32,4,4,32,238

8318 DATA 5,18,19,120,18

8319 DATA 19,24,227,241,18

8320 DATA 19,120,18,237,83

8321 DATA 22,221,201,0,0

8322 DATA 56,0,0,0,0

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

PRINT РЕЕК 23296 + 256*РЕЕК 23297

ПРОЦЕДУРА FNT

8350 LET В=56500: LET b=40: LET ZfO: RESTORE 8360

8351 I OR 1=0 TO L-l: READ A

8352 POKE (B+l ),A: LET Z=Z+A

8353 NEX I I

8354 LET ZHNT((<Z/L)-INT(Z/L))*L)

8355 READ A: IF A THEN PRINT "???": STOP

8360 DATA 42,1 1,92,1,4

8361 DATA 0,9,86,14,8

8362 DATA 9,94,33,0,64

8363 DATA 26,245,19,26,19

8364 DATA 71,241,119,35,16

8365 DATA 252,124,254,91,32

8366 DATA 240,201,0,0,0

8367 DATA 28,0,0,0,0

ПРИМЕР ПРИМЕНЕНИЯ ПРОЦЕДУР ДЕКОМПРЕССИИ И
КОМПРЕССИИ

Предположим, что Вам надо сжать и сохранить 3 экрана: SCR1, SCR2 и
SCR3, причем, первый из них идет в адрес 50000 (48,117). Тогда основная
программа может выглядеть так:

10 DEF FN S(H,L) s USR 56600

20 DEF FN T(H,L) « USR 56500

100 LET Ae23296: LET B=23297

110 LET Hl=l 17 : LET Ll=48

120 LET AD«Lt+(H 1*256)

130 PRINT AD: LOAD "SCRTCODE 16384,6912

140 RANDOMIZE FN S(H1X1)

150 LET L2=PEEK A: LET H2=PEEK В

155 LET AD-L2+H2*256

160 PRINT AD: LOAD uSCR2"CODE 16384,6912
170 RANDOMIZE FN S(H2,L2)
180 LET L3=PEEK A: LET H3=PEKK В
185 LET AD=L3+256*H3

190 PRINT AD: LOAD "SCR3"CODE 16384,6912
200 RANDOMIZE FN S(H3,L3)
210 PAUSE 50

300 RANDOMIZE FN T(H1,L1)
310 PAUSE 50

320 RANDOMIZE FN T(H2,L2)
330 PAUSE 50

340 RANDOMIZE FN T(H3,L3)
350 PAUSE 50. GO TO 300




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Новелла - Этa новeллa - мои пeрвыe шaги нa литeрaтурном поприщe...
Юмор - анекдоты.
Список BBS - Сетевые новости.
Форум - Эффекты на бордюре и Multicolor.
Вступление - Привет! Вот и август наступил и не за горами уже долгожданный Enlight'97.

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