ZX-Ревю 1993 №1-2 1992 г.

Секреты TR-DOS - приемы защиты от копирования.


ПРИЕМЫ ЗАЩИТЫ ОТ КОПИРОВАНИЯ.

До сих пор мы вели разговор о том, как все должно работать, как говорится, "по букварю". Теперь подойдем более критически к некоторым вопросам. Например, длина файла. В 16 байтах заголовка длина файла фигурирует дважды. Действительно, длина файла это два байта: 11-й и 12-й. Кроме того, это 13-й байт - длина файла в секторах. Зачем он нужен? Ведь он же легко рассчитывается из известных 11 и 12 байтов. TR-DOS устроена так, что точная длина файла (11-12 байты) необходима для процедуры загрузки файла в память, а вот при операциях перезаписи файла TR-DOS оперирует именно с 13 байтом, резервируя на диске столько места, сколько обозначено в 13 байте. Поэтому если искусственно, "вручную", например, при помощи программы типа "DISK-DOCTOR", изменить значение этого байта, задав нулевое значение, то файл будет загружаться и стартовать нормально (11 и 12 байты не изменены), но при перезаписи файла на другую дискету будет переписано ноль секторов, то есть фактически перезаписи не произойдет.

На этом принципе работают некоторые самые простые программы по защите файлов от копирования, например программа "CLOSE". Эта программа обнуляет 13-й байт заголовка у файлов, имеющих расширение "В", задавая, таким образом, нулевую длину файла в секторах. Кроме того, эта программа искажает системную информацию по диску, изменяя значения параметров системного сектора. Искажению подвергаются: начало и количество свободного места на диске, тип диска (вместо двустороннего задается односторонний), количество файлов. Кроме того, в имя первого файла вводятся непечатаемые управляющие коды. Однако при этом не нарушается нормальный старт программ с диска. Такие диски удается скопировать только целиком при помощи специальных копировщиков типа "диск в диск", когда копируется без изменения содержимое всех 80 дорожек диска. Кстати, изложенные в этой статье сведения позволяют Вам самостоятельно разработать такой копировщик даже на Бейсике, с выполнением одного фрагмента в машинных кодах, аналогично программе "DIR". Пофайловое копирование всего диска при помощи команды TR-DOS: COPY B, а также копирование при помощи программ-оболочек типа "MOA-SERVICE" в этом случае не помогает.

Этот способ защиты широко распространен на рынке программного обеспечения, но пользуются им не разработчики оригинальных программ, а скорее "работники торговли". Их дискеты недостаточно хорошо скомпонованы, чтобы копировать их целиком. Обычно на дискете бывает несколько хороших программ, остальное - мусор для заполнения дискеты. Впрочем, это уже отклонение от темы. Так или иначе, Вы должны быть свободны в вопросах компоновки своих дискет, поэтому я поделюсь с Вами программой, созданной мной в противовес "CLOSE". Она называется "OPEN". На самом деле проблема достаточно примитивна. Испорченную длину файла в секторах легко можно восстановить, вычислив разность между началом этого файла (байты 14 и 15 заголовка) и началом следующего файла. Заодно программа "OPEN" также рассчитывает объем и начало свободного места на диске и восстанавливает всю остальную системную информацию по диску.

Программа "OPEN".

2 BORDER 7: РАРЕR 7: INK 0: aEAR 39999

3 RESTORE : FOR a=40000 TO 40012: READ b: POKE а,^ NЕХТ a:DАТА 33,0,171,17,0,0,1,5,9,

205,19,61,201

4 GO TO 100

5 RANDOMIZE USR 15619: REM : SAVE "OPEN"

6 STOP

100 CLS : PRINT #0; "INSERT DISK AND PRESS ANY KEY": PAUSE 0 110 INPUT INKEY$: PRINT #0;TAB 8; FLASH 1;" PLEASE WAIT " 200 RANDOMIZE USR 40000

210 LET a=43776: LET n=0: LET del=0: LET free=2544

220 GO SUB 1000

230 LET a=43776+128*16

240 GO SUB 2000

300 INPUT INKEY$: PRINT #0: "OWERWRITE TRACK <0> (Y/N) ? ": PAUSE 0: INPUT INKEY$ 310 IF INKEY$="y" OR INKEY$="Y" THEN POKE 40007,6: RANDOMIZE USR 40000 320 STOP

1000 REM Katalog

1010 IF PEEK a=0 THEN RETURN

1020 LET n=n+1

1030 IF PEEK a=1 THEN LET del=del+1: GO TO 1050 1040 IF PEEK a<32 OR PEEK a>127 THEN POKE a,63 1050 LET beg1=PEEK (а+14)+16*PEEК (а+15) 1060 LET beg2=PEEK (a+14+16)+16*PEEK (a+15+16) 1070 LET lens=beg2-beg1

1080 IF PEEK (a+16)=0 THEN LET lens=PEEK (a+12)+(PEEK (a+11)<>0) 1090 POKE (a+13), lens

1100 LET free=free-lens 1110 LET a=a+16 1120 GO TO 1000 2000 REM Disk-data 2010 LET space=beg1+lens

2020 LET spt=INT (space/16): LET sps=space-spt*16 2030 POKE (a+225),sps: POKE (а+226),spt 2040 POKE (a+227),22 2050 РОKЕ (а+228),n

2060 LET fr2=INT (free/256): LET fr1=free-fr2*256 2070 POKE (a+229),fr1: POKE (a+230),fr2 2080 POKE (а+244), del 2090 RETURN

По своей структуре программа похожа на "DIR". После старта с начальной строки, программа формирует кодовый блок для чтения девяти секторов нулевой дорожки, затем останавливается (строка 100) для того, чтобы можно было вставить в дисковод засекреченный диск. После нажатия клавиши происходит чтение нулевой дорожки, затем начинаются расчеты. Задаются начальный адрес каталога (a), число файлов (n) и число удаленных файлов (del) принимают для начала нулевые значения, а число свободных секторов на диске (free) - максимальное значение для двусторонней дискеты 80 дорожек -2544 сектора.

Подпрограмма со строки, 1000 приводит в порядок каталог диска. Строка 1010 проверяет, не достигнуто ли свободное место на диске и если да, то выход из подпрограммы. Если нет, то число файлов увеличивается на единицу (строка 1020), затем проверяется, не удаленный ли это файл (строка 1030). Если да, то счетчик удаленных файлов увеличивается на единицу строка 1040 исправляет значения тех кодов в названии файла, которые могли быть искусственно изменены для невозможности произвести распечатку каталога командами TR-DOS: CAT или LIST. Управляющие коды либо токены ключевых слов, подставленные в имя файла заменяются символом ASCII с кодом 63 - это знак вопроса.

Далее рассчитывается длина файла в секторах (lens). Для этого определяется начало текущего файла (beg1), затем начало следующего файла (beg2). Эти значения рассчитываются непосредственно в секторах от начала диска. Их разность (строка 1070) определяет длину текущего файла. Однако в том случае, если текущий файл является последним на диске (строка 1080), то значение beg2 даст нулевое значение. Поэтому длину файла в секторах в этом случае можно рассчитать непосредственно по его длине в байтах. После занесения рассчитанного значения в память (строка 1090), рассчитывается оставшееся свободное место на диске (строка 1100), затем - переход к следующему заголовку путем возврата на строку 1000.

После того, как выполнена подпрограмма восстановления каталога (в строке 220), значение адреса устанавливается на начало системного сектора (строка 230). Подпрограмма со строки 2000 восстанавливает системную информацию диска. Начало свободного места на диске в секторах (space) определяется как начало последнего файла плюс его длина (строка 2010). Далее это значение преобразуется (строка 2020) в номер дорожки (spt) и сектора (sps) и заносится в память (строка 2030).

Строка 2040 устанавливает тип диска: двусторонний, 80 дорожек. Далее в память заносится общее число файлов (строка 2050), рассчитываются старший и младший байты числа свободных секторов (строка 2060) и полученные значения заносятся в память (строка 2070). Заносится в память и число удаленных файлов (строка 2080). Далее - возврат из подпрограммы на строку 300. Здесь выводится предупредительная табличка и, в случае подтверждения (клавиша "Y"), происходит перезапись нулевой дорожки диска (строка 310). Здесь значение регистра C в ячейке 40007 вместо чтения (C=5) заменяется на запись (C=6). После этого программа останавливается. Можете запускать дискету обычным порядком и копировать файлы с нее на другие дискеты.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Интервью - интервью у Борисова Миши, известного как, BOGO или BARMALEY.
Per Aspera - Замечание по поводу статьи NEМO.
Новости - Mythos/RAGE продал исходники Awaken за 3 тысячи (!) новых белорусских рублей.
ZX Club - Poke's к играм.
Письмо №320 - г Рязань

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