
                                    Приложение

      В  настоящее  время  практически  единственным  способом  коммерческого
   распространения  программных   продуктов  является   тиражирование  гибких
   магнитных дисков (дискет) с записанными на них программами (дистрибутивных
   дискет). При этом  имеет место  опасность несанкционированного копирования
   дистрибутивных  дискет,  из-за  чего  фирмы  -  производители  программных
   средств  будут терпеть  убытки,  иногда  весьма  значительные.  В  Росии и
   республиках   бывшего    СССР,   в    силу   несовершенства   действующего
   законодательства  о  правовой  охране  программных  средств,  а  также его
   фактической       неработоспособности,       проблема       предотвращения
   несанкционированного копирования дистрибутивных дискет особенно актуальна.
   Суть данной  проблемы  заключается  в том,  чтобы  записать  информацию на
   стандартную дискету таким образом, чтобы  ее можно было считать с дискеты,
   используя  только средства  операционной  системы  (DOS),  но  нельзя было
   скопировать никакими стандартными средствами. Для этой цели дистрибутивные
   дискеты снабжают особым признаком, называемым ключевой меткой, которая при
   стандартном копировании не переносится на дискету - копию.
      Ключевая метка  является наиболее  важным элементом  защиты дискет, она
   практически  полностью   определяет  основные   характеристики  защищенной
   дискеты, такие,  как совместимость  с различными  стандартными аппаратными
   средствами   считывания,   устойчивость   против   копирования,   надежная
   воспроизводимость,  стабильность   параметров  во   времени.  Устойчивость
   ключевой  метки против  неблагоприятных  внешних  воздействий,  таких, как
   перепады температуры и влажности, магнитные поля, деформация, механическое
   истирание при  многократном  считывании,  естественное  старение материала
   дискеты, не должна быть ниже таковой  для информации, записанной на эту же
   дискету  стандартным   путем.   Существует  (и   практически  применяется)
   множество различных способов создания  ключевых меток на дискетах, однако,
   далеко  не  все  из   них  удовлетворяют  перечисленным  требованиям.  Это
   относится,  главным   образом,   к  дистрибутивным   дискетам,  защищенным
   отечественными программными средствами.  Формирование ключевой метки может
   производиться либо только стандартными аппаратными средствами, входящими в
   состав   компьютера   (программная    защита),   либо   с   использованием
   дополнительной аппарптуры (аппаратная защита). В качестве такой аппаратуры
   чаще всего используется  лазер, излучающий элемент  которого жестко связан
   головкой  дисковода,   на   котором  производится   запись.   Лазер  точно
   дозированным импульсом излучения выжигает  (испаряет) в заданных местах на
   поверхности дискеты ничтожно малые  углубления (holes), которые и являются
   ключевой меткой.  Это наилучший  из  известных способов  создания ключевой
   метки, он широко используется крупными зарубежными фирмами, однако требует
   наличия весьма  дорогостоящей аппаратуры.  Здесь необходимо  отметить, что
   создание  ключевой  метки  путем   повреждения  дискеты  острым  предметом
   (накола),  абсолютно  не  допустимо,  поскольку,  в  отличие  от испарения
   лазером, удаления материала дискеты при  наколах не происходит, поэтому на
   дискете образуется  ямка с  выступающими краями,  оставляющими царапины на
   головке дисковода.
      Для отечественных  производителей  программных средств  более приемлемы
   программные способы создания  ключевой метки. Для  лучшего понимания далее
   изложенного материала,  здесь  приведены основные  сведения  о стандартном
   формате  записи информации  на  дискету  и  некоторых  особенностях работы
   контроллера гибкого диска (FDC).

                           Формат записи на гибкий диск

      Информация на гибком магнитном диске (флоппи диске, дискете) содержится
   на   концентрических    окружностях,   называемых    дорожками   (tracks),
   расположенных на обеих сторонах дискеты и обслуживаемых головками чтения -
   записи (heads). Нижняя сторона дискеты обслуживается головкой 0, верхняя -
   1. Комбинация из двух противолежащих дорожек на разных сторонах называется
   цилиндром (cylinder). На стандартной дискете 360К размещается 42 цилиндра,
   но DOS поддерживает только  40 (номера от 0  до 39), остальные игнорирует.
   Нумерация  цилиндров  начинается  с  нуля,  причем  нулевой  цилиндр имеет
   наибольший диаметр.  На дискете 5.25"  1.2М размещается  84 циллиндра (DOS
   поддерживает 80), на дискетах 3.5" 82 цилиндра, DOS поддерживает 80.
      Каждая дорожка,  в  свою  очередь, делится  на  секторы, представляющие
   собой дуги окружности. Число секторов  на дорожке может быть произвольным,
   но DOS поддерживает  только стандартные значения  8 или 9  для дскет 5.25"
   DS/DD, 15 для  5.25" DS/HD,  9 для 3.5"  DS/DD, 18 для  3.5" DS/HD. Каждый
   сектор  имеет  определенную   длину  зоны  данных,   зависящую  от  объема
   записанной в  него  информации. Контроллер  флоппи  - диска  (FDC  765 или
   8272A) РС AТ обычно поддерживает  только восемь возможных длин зоны данных
   сектора, а  именно: 0  (128) байт,  1 (256  байт), 2  (512 байт),  3 (1024
   байт), 4  (2048 байт),  5 (4096  байт), 6  (8192 байт)  и 7  (16384 байт).
   Полная длина  сектора,  вместе  с  заголовком и  байтами  CRC,  хотя имеет
   размерность угла, измеряется в байтах, а именно: длина 0 соответствует 190
   байтам, 1 -  318, 2 - 574,  3 - 1086,  4 - 2110, 5  - 4150, 6  - 8254, 7 -
   16446. Здесь  байт - это  угол, на  который необходимо  повернуть диск для
   чтения или записи одного информационного байта. Промежутки между соседними
   секторами  от  конца  предыдущего  до  начала  следующего  могут принимать
   значения от 1 до 255 (кроме промежутка от последнего сектора на дорожке до
   первого, который может  быть любым). DOS  использует только длину секторов
   2, однако, на дорожках могут встретиться  секторы с другой длиной именно с
   целью защиты дискеты.
      Каждый  сектор  имеет  заголовок  (ID),  состоящий  из  четырех  байтов
   (C,H,R,N). C  -  номер цилиндра,  H  - номер  головки,  R -  номер сектора
   (отсчет от 1, во всех остальных  случаях от 0), N - длина сектора (0...7).
   Имейте  в виду,  что  заголовок  ID  предназначен  только  для опознавания
   сектора контроллером, и вовсе не  дает представления об истинном положении
   сектора на дискете  и его  параметрах, т. е.  сектор с  ID 7,0,124,4 может
   располагаться где угодно, а не только  на дорожке 7,0. Более того, C,H,R,N
   могут иметь любые,  в том числе  физически бессмысленные значения  от 0 до
   255. Истинные параметры сектора могут совершенно не совпадать с указанными
   в  заголовке, что  используется  в  целях  защиты.  При  этом  имеют место
   некоторые  ограничения,  например,  сектор  с  указанной  в идентификаторе
   длиной более 7 не может быть правильно считан контроллером.
      Плотность записи - это  параметр, характеризующий максимально возможное
   число  битов  записанной  информации  на  одной  дорожке.  Она  зависит от
   скорости  приема/выдачи   информации  контроллером   и  скорости  вращения
   дискеты. Контроллер  аппаратно поддерживает  три  скорости: 250,  300, 500
   Кбит/с. Скорость вращения дискет в  дисководах 5.25" составляет 5 об/с для
   дисководов на 360К и 6 об/с для дисководов на 1.2М. Скорость вращения 3.5"
   дискет всегда 5 об/с.  Плотность записи пропорциональна отношению скорости
   выдачи информации контроллером к  угловой скорости вращения дискеты. Таким
   образом, возможны 5 различных значений  плотности записи (значения 250/5 и
   300/6 совпадают).  В  окне  подготовки к  DOS  формату и  Report  файле им
   соответствуют  записи  Low  (250/6),  Double  (250/5  или  300/6),  Medium
   (300/5), High (500/6)  и Quad (500/5).  Необходимо отметить, что плотности
   записи Low и Medium  не поддерживаются BIOS, но  могут быть использованы с
   целью защиты.

                           Строение стандартной дорожки.

      Контроллер  гибкого   диска   (FDC)  IBM   -   совместимых  компьютеров
   поддерживает формат  дорожки в соответствии  со стандартом  IBM System 34.
   Информация  записывается на  дорожку  при  помощи  метода модифицированной
   частотной модуляции (MFM), и представляет собой последовательность байтов,
   каждый  бит которых  кодируется  следующим  образом.  Головка  дисковода в
   процессе записи формирует на  дорожке намагниченные точки (домены), причем
   домены  бывают  положительные  и  отрицательные  (различаются направлением
   магнитного  потока  в  головке  дисковода).  Каждый  бит  состоит  из двух
   доменов.  При этом  единица  состоит  из  одного  отрицательного  и одного
   положительного  домена,  ноль,  следующий  за  единицей,  состоит  из двух
   отрицательных   доменов,  а   ноль,   следующий   за   нулем,   из  одного
   положительного и одного  отрицательного домена. Пример: последовательность
   битов 1001 схематично представляется следующим образом: _П__П__П. Одной из
   особенностей  MFM является  то,  что  последовательность  одинаковых битов
   может читаться  и как  последовательность нулей,  и как последовательность
   единиц, в зависимости от того, в  какой момент контроллер начал ее читать.
   Неправильное  чтение  битов  называется   сбоем  синхронизации.  Чем  выше
   плотность записи  на дорожку  (recording  density), тем  меньше расстояние
   между синхронизирующими  доменами. Кроме  описанных информационных байтов,
   контроллер записывает на дорожку  особые байты, называемые маркерными. Эти
   байты отличаются от информационных тем,  что в них есть последовательности
   из трех  нулевых битов, второй  из которых  записывается так,  как если бы
   перед  ним  была  единица.  Это  единственный  случай,  когда  на  дорожку
   записывается три  отрицательных  домена подряд.  Маркерные  байты являются
   частью адресных  маркеров  (AM), которые  записываются  на дорожку  при ее
   форматировании и предназначены для  обозначения начала дорожки и секторов.
   Каждый адресный  маркер состоит  из 3-х  особых маркерных  байтов и байта-
   идентификатора  маркера.  Перед  каждым  маркером  записывается настоечная
   последовательность из  12  нулевых байтов.  Настроечная последовательность
   байтов предназначена для точной  подстройки частоты внутреннего кварцевого
   генератора контроллера  в соответствии  с конкретной  частотой прохождения
   доменов синхронизации под считывающей  головкой дисковода (захвата частоты
   и  фазы).  Такая  подстройка  совершенно  необходима  из  -  за незбежного
   разброса  значений  скорости  вращения   дисководов  и  частоты  тактового
   генератора контроллеров.
      Началом (и концом) каждой дорожки является точка пересечения окружности
   дорожки с радиусом, проходящим через центр индексного отверстия дискеты. В
   начале дорожки  записана последовательность  из  80 байтов  4E, называемая
   GAP4A. Далее  находится адресный  маркер дорожки  (IAM), который необходим
   для нормальной работы FDC. IAM содержит  маркерные байты C2 (здесь и далее
   двоичные числа представлены 16 - ричной записью) и идентификатор FC. Затем
   идет последовательность из 50 байтов  4E, называемая GAP1 и заголовок, или
   идентификатор  (ID)  первого  сектора,   состоящий  из  адресного  маркера
   заголовка (IDAM), 4-х байтов C,H,R,N, 2-х байтов CRC. Маркерные байты IDAM
   имеют код A1,  идентификатор -  FE. За заголовком  каждого сектора следует
   последовательность   из   22-х   байтов   4E,   которая   называется  GAP2
   (внутрисекторный промежуток), затем  адресный маркер  данных сектора (DATA
   AM), информационные байты  (содержимое сектора)  и два байта  CRC. DATA AM
   состоит  из  маркерных   байтов  A1   и  идентификатора  FB   или  F8.  FB
   соответствует нормальным  данным,  F8  - так  называемым  удаленным данным
   (deleted data),  причем такое  разделение  имеет чисто  условный характер,
   удаленные данные записываются  и читаются точно так  же, как и нормальные,
   просто используются разные команды контроллера.
      За  концом  первого  сектора  следуют  байты  межсекторного промежутка,
   имеющие код 4E. Межсекторный промежуток,  имеющий название GAP3, в отличие
   от  вышеописанных,  имеет   переменную  длину.  Его   длина  задается  при
   форматировании  дорожки параметром  GPL.  Промежуток  от  конца последнего
   сектора до  конца дорожки  называется GAP4B.  Этот промежуток, заполненный
   байтами 4E,  имеет  переменную  длину, и,  фактически,  представляет собой
   незаполненный  остаток  дорожки.  Этот   промежуток  имеет  весьма  важное
   значение в технике защиты дискет от  копирования, о чем будет рассказано в
   дальнейшем.

                              Форматирование дорожки

      Форматирование  дорожки  -  это  первоначальная  разметка  дорожки, при
   которой создаются  все вышеописанные  элементы дорожки.  Для осуществления
   форматирования,  необходимо   подать   на  FDC   соответствующую  команду,
   содержащую все необходимые параметры, а именно:
      - число  секторов на  дорожке,  образующихся после  завершения операции
   форматирования;
      - код длины секторов (см. выше);
      - GPL (gap length), параметр, определяющий GAP3;
      -  D  (fill  byte),  код,  которым  будут  заполнены  зоны  данных всех
   секторов, образованных при форматировании;
      - заголовки  всех секторов  по порядку  расположения, четверками байтов
   C,H,R,N, при  этом необходимо  следить,  чтобы число  указанных заголовков
   равнялось числу секторов на дорожке.
      Длина   созданных   форматированием   секторов   всегда   одинакова   и
   определяется  только  заданным  кодом  длины,  независимо  от  значений N,
   указанных в заголовках  секторов. Все параметры,  включая байты заголовков
   секторов,  могут принимать  значение  0...255,  однако,  при  выборе числа
   секторов, их  длины  и GPL,  необходимо  хорошо представлять  себе процесс
   форматирования,  иначе возможны  неожиданные  результаты.  Сразу  же после
   получения команды форматирования дорожки  со всеми требуемыми параметрами,
   FDC переходит в режим ожидания  индексного отверстия (начала дорожки). Как
   только  начало  дорожки  "поймано",   FDC  записывает  GAP4A,  IAM,  GAP1,
   начинающийся  с  IDAM  заголовок   первого  (из  перечисленных  в  команде
   форматирования) сектора, GAP2, DATA AM  этого же сектора, его зону данных,
   имеющую длину, определенную кодом длины (все секторы будут иметь одну и ту
   же длину), заполненную кодом  D, два байта CRC,  GAP3, заданный кодом GPL,
   заголовок следующего  по  порядку сектора,  и  т.д. до  CRC  последнего из
   перечисленных  сектора. После  этого  FDC  записывает  GAP4B  и выполнение
   команды  форматирования дорожки  завершается.  Таким  образом,  зная общую
   длину дорожки  и  размеры всех  элементов,  которые предполагается  на ней
   разместить при форматировании, легко  распланировать дорожку, т.е. выбрать
   необходимые параметры  для  команды  форматирования.  Форматирование может
   быть  однооборотным,  когда  все   "заказанные"  секторы  могут  физически
   разместиться на длине дорожки, и команда выполняется за один оборот диска,
   а также  многооборотное  (multirevolution format),  когда  суммарная длина
   "заказанных" секторов превышает длину  дорожки, например, когда "заказано"
   100 секторов  с  длиной 2,  в  то время,  как  на дорожке  физически может
   разместиться лишь 10.  В этом случае  расчет результата выполнения команды
   превращается в  математическую задачу,  на дорожке  может не  оказаться ни
   одного сектора, или остаться один или несколько последних из перечисленных
   в команде  секторов,  в зависимости  от  соотношения параметров.  От конца
   последнего из "заказанных"  секторов до конца  дорожки всегда записывается
   GAP4B, при этом конец  этого сектора может оказаться  в любом месте, в том
   числе в  начале  дорожки. Естественно,  GAP4A,  GAP1, IAM  при  этом будут
   отсутствовать. Если же длина последнего из "заказанных" секторов превышает
   длину дорожки, после выполнения  команды форматирования, дорожка останется
   неформатированной, поскольку зона данных  этого сектора затрет собственный
   заголовок.

                       Особенности чтения и записи секторов

      Каждый сектор  на дорожке  может быть  записан или  считан контроллером
   независимо от остальных секторов.  Для чтения сектора, необходимо включить
   двигатель дисковода, выждать  время, необходимое  для раскручивания диска,
   установить  (позиционировать) головку  дисковода  на  требуемую  дорожку и
   подать на  FDC  команду чтения  сектора,  причем в  состав  команды чтения
   сектора  входит  заголовок  считываемого  сектора  (C,H,R,N).  Сразу после
   приема команды чтения,  FDC считывает заголовки  всех секторов, проходящих
   под  головкой, и  сравнивает  их  с  заданным.  Как  только обнаруживается
   требуемый заголовок, FDC переходит в  режим чтения зоны данных сектора, и,
   "захватив" DATA  AM, следующий  за заголовком,  считывает данные  в буфер,
   используя контроллер прямого  доступа к памяти  (DMA). По окончании чтения
   данных, FDC считывает два байта CRC  и сравнивает считанное значение CRC с
   вычисленным  в  процессе  чтения  данных.  Операция  чтения  сектора может
   завершиться  как  нормально  (normal  termination),  так  и  не  нормально
   (abnormal termination). Ненормальное завершение операции происходит, если:
      - сектор не  найден, т.е. головка  дважды пересекла индексное отверстие
   (начало  дорожки),  а  требуемый  заголовок  не  обнаружен,  при  этом FDC
   возвращает код ND;
      - данные  в DATA  AM  помечены, как  удаленные (идентификатор  F8), FDC
   возвращает код CM;
      - ошибка CRC заголовка, т.е. вычисленная контрольная сумма не совпадает
   со считанной, FDC возвращает код DE;
      - ошибка CRC данных, FDC возвращает коды DE+DD;
      - не найден ни один IDAM, FDC возвращает код MA;
      - не найден адресный маркер зоны данных (DATA AM), т.е. заголовок есть,
   а зоны данных нет ("пустой" сектор), FDC возвращает коды MA+MD.
      FDC  устроен  таким  образом,   что,  если  после  считывания  сектора,
   контроллер  DMA   не  заполнит   буфера  чтения   на  весь  предварительно
   запрограммированный объем, и  будет "требовать" еще,  FDC, по "требованию"
   DMA, будет пытаться считать следующий  по порядку номеров сектор. При этом
   байт R  искомого заголовка  автоматически увеличивается  на единицу. Таким
   образом, если  все секторы  на дорожке  имеют одинаковые  байты заголовков
   C,H,N, а байт  R у каждого  следующего по порядку  расположения сектора на
   единицу больше,  чем у  предыдущего,  то всю  такую дорожку  можно считать
   одной   командой   чтения   за   один   оборот   диска,   достаточно  лишь
   запрограммировать контроллер DMA на прием суммы всех секторов дорожки. При
   этом, однако, необходимо иметь в виду, что промежуток GAP3 между соседними
   секторами на  такой дорожке,  не должен  быть менее  22 байтов,  иначе FDC
   может не успеть захватить следующий сектор после прочтения предыдущего.
      Для  записи  сектора   необходимо  выполнить   те  же  подготовительные
   операции, что  и  для чтения,  но на  FDC  подать команду  записи сектора.
   Приняв команду,  FDC отыскивает  требуемый заголовок  и производит запись.
   Здесь  также  возможно  ненормальное  завершение  операции  по  всем ранее
   перечисленным причинам, за  исключением CM, DD,  MD. Также возможна запись
   всей дорожки одной  командой, при тех  же условиях, что  и для чтения. При
   записи сектора,  возможно  "затирание" следующих  по  порядку расположения
   секторов на этой же дорожке. Это  происходит в том случае, если параметр N
   заголовка сектора превышает  код длины, указанный  при форматировании. При
   записи такого сектора, его зона данных формируется заново, причем ее длина
   будет уже соответствовать  коду N заголовка.  Эта удлинившаяся зона данных
   записанного  сектора  затрет  один  или  несколько  следующих  по  порядку
   секторов  на   дорожке.  Если   N  достаточно   велико,  то   зона  данных
   записываемого  сектора  может  удлиниться  настолько,  что  превысит длину
   дорожки и  затрет  сначала все  следующие секторы,  а  затем сама  себя на
   втором обороте!

             Искусственное прерывание операций форматирования и записи

      Операции записи  и форматирования  могут быть  искусственно прерваны до
   завершения.  Запись с  прерыванием  обычно  наэывают  короткой  записью, а
   форматирование с прерыванием - коротким форматированием. Этот прием широко
   применяется при  создании  ключевых  меток на  дискетах.  Точка прерывания
   форматирования может быть  выбрана в  любом месте дорожки,  при этом часть
   дорожки от  ее  начала до  точки  прерывания будет  сформирована  заново в
   соответствии  с   вышеописанной  последовательностью   выполнения  команды
   форматирования дорожки, а оставшаяся часть не изменится и сохранит прежний
   формат. Таким образом, используя  повторное короткое форматирование, можно
   создать дорожку с  многократным форматом (repeated  - formatting track), в
   пределе  -  каждый  сектор  такой  дорожки  может  быть  создан  отдельной
   операцией форматирования  с  независимо  выбранными  параметрами. Наиболее
   часто корокое  форматирование  дорожки применяется  для  подмены заголовка
   одного   из   секторов.   При   этом   точка   прерывания   форматирования
   устанавливается в середне  промежутка GAP2 этого  сектора, т.е. так, чтобы
   заново переписать заголовок, но не тронуть  DATA AM и зону данных сектора.
   Короткая запись применяется, как правило,  для "отсечки" второго байта CRC
   для  имитации ошибки  при  последующем  чтении  этого  сектора. Необходимо
   отметить,  что  здесь  требуется  поистине  снайперская  точность  момента
   прерывания записи,  поскольку  промах  даже на  один  байт  назад вызывает
   подрезание (truncation)  записываемого сектора,  а на  один байт  вперед -
   отсутствие имитации ошибки.
      Для осуществления прерывания  операций форматирования и  записи в точно
   заданном месте,  программа, управляющая  FDC, должна  иметь таймер, идущий
   синхронно с  внутренними  часами FDC  и  пускаемый одновременно  с началом
   выполнения  команды.  Кроме  того,  необходимо,  чтобы  диск  в  дисководе
   вращался  по  возможности   равномерно.  Максимально  достижимая  точность
   установки момента прерывания  операции определяется  как расхождением хода
   внутренних часов программы  и FDC, так  и неравномерностью вращения диска.
   Минимальная практически  достижимая разность  хода часов  составляет менее
   одного  байта  за  оборот  диска,   в  то  время,  как  ошибка,  вызванная
   неравномерностью  вращения  диска,  обычно  гораздо  больше. Равномерность
   вращения  диска  зависит,  главным  образом,  от  конструкции  и  качества
   изготовления двигателя  привода диска.  В прежние  годы для  привода диска
   использовались   коллекторные   электродвигатели   с   электромеханическим
   регулятором скорости вращения. Такие  дисководы (в основном, болгарского и
   армянского  производства)  иногда  еще  встречаются  у  пользователей. Они
   абсолютно не пригодны для работы с программами, использующими рассчитанное
   прерывание форматирования и  записи. В  современных дисководах применяются
   исключительно  многополюсные  бесколлекторные  синхронные электродвигатели
   постоянного тока  с управлением  от  собственного кварцевого  генератора и
   непосредственным приводом диска. Частота  вращения таких двигателей весьма
   стабильна, однако, диск вращается как бы скачками, то ускоряя, то замедляя
   вращение в  пределах одного оборота,  Количество этих  скачков равно числу
   полюсов двигателя, а  величина зависит от  массы (точнее, момента инерции)
   диска.  Многополюсные  двигатели   с  довольно   массивным  диском  обычно
   установлены на дорогих моделях  дисководов известных фирм (например, Sony,
   Panasonic). Дополнительная  погрешность момента  прерывания в  этом случае
   составит  один байт.  Дешевые  "желтые"  дисководы  часто  (но  не всегда)
   гораздо хуже,  и  вызывают дополнительную  погрешность  до четырех  - пяти
   байтов. Однако, эта  погрешность не случайная,  а систематическая, поэтому
   может  быть  "вручную"  скорректирована,  если  программа  это  позволяет.
   Качество дисководов  ограничивает  возможности программ,  управляющих FDC,
   например, подмена заголовка  возможна на любом  дисководе, поскольку здесь
   требуется точность  +-10 байтов  (длина  GAP2, как  уже сказано,  равна 22
   байтам), в то время, как "отсечка" CRC - только на хорошем.

                   Способы создания ключевых меток на дискетах.

      1.  Использование   инженерные  цилиндров.   Стандартный  5.25"   40  -
   дорожечный дисковод может читать и записывать 42 цилиндра, 80 - дорожечный
   - 84  цилиндра, однако, DOS  использует соответственно  только 40  и 80 из
   них. Дисководы 3.5"  поддерживают 82 цилиндра, но  DOS использует лишь 80.
   Не используемые  DOS цилиндры  называются инженерными.  Эти цилиндры могут
   иметь произвольный нестандартный формат, например, иметь всего один сектор
   с любой  вмещающейся в  длину  дорожки длиной  и каким  угодно заголовком.
   Использование инженерных цилиндров  очень удобно,  однако, есть опасность,
   что найдутся дисководы, их не поддерживающие.
      2. Особые  секторы. При  обращении к  дискете, DOS,  вызывая прерывание
   BIOS 13H, читает или записывает всю  дорожку одной командой FDC. При этом,
   как уже  было сказано,  все  секторы на  дорожке должны  иметь стандартные
   заголовки и расположены в порядке возрастания номеров. Если же между двумя
   нормальными  секторами вклинится  сектор  с  нестандартным  заголовком, он
   будет проигнорирован  командой чтения.  Такой особый  сектор можно создать
   при форматировании дорожки и использовать в качестве ключевой метки.
      3. Запись  ключевой информации  в  промежутки. Этим  способом создаются
   одни  из   самых  скрытых   и  труднообнаружимых   ключевых  меток.  Путем
   комбинированного применения  команд  короткого  форматирования  и короткой
   записи,   можно  поместить   ключевую   информацию   в   любой  промежуток
   (GAP1...GAP4). Напимер, чтобы  поместить ключевую информацию  в GAP3 между
   первым и вторым секторами, требуется отформатировать дорожку на нормальное
   число секторов  с  длиной  2 и  нормальным  GPL, но  параметр  N заголовка
   первого сектора установить при форматировании  не 2, а 3. Затем произвести
   короткую  запись  в  первый  сектор  так,  чтобы  только-только  не задеть
   заголовок  второго сектора  (если  вовремя  не  прервать  операцию записи,
   второй сектор  будет  затерт  удлинившейся зоной  данных  первого). Запись
   необходимо прервать,  не  доходя  одного  - двух  байтов  до  IDAM второго
   сектора.  Затем,  путем  короткого  форматирования,  необходимо  подменить
   заголовок первого сектора на нормальный.  В результате GAP3 между первым и
   вторым секторами  будет  содержать  не код  4E,  а  записанную информацию.
   Необходимо    отметить,     что    успешное     осуществление    описанной
   последовательности  операций   требует   высокой   точности   таймера.  Из
   существующих  программных средств  только  Floppy  Disk  Analyser способен
   создать описанную  ключевую метку.  Для  проверки наличия  ключевой метки,
   защищенная этой меткой  программа должна использовать  команду FDC "чтение
   дорожки". При помощи повторного  короткого форматирования, можно создавать
   межсекторные  промежутки любой  длины.  Например,  если  после нормального
   форматирования,  произвести  короткое   форматирование  этой  же  дорожки,
   "заказав"  только  один  сектор  и  прервав  операцию  внутри  GAP3  между
   предпоследним и  последним  сектором,  в результате  на  дорожке останутся
   только два  сектора, причем  один в  начале дорожки,  а другой  - в конце.
   Такая  операция  называется  "трущим  форматированием",  поскольку  второе
   короткое форматирование создает  один сектор (как  "заказано"), а затирает
   все, кроме последнего.
      4.  Секторы,  переходящие   через  начало  дорожки.   Если  параметр  N
   последнего по порядку сектора на дорожке таков, что длина, соответствующая
   этому параметру, превышает  сумму физической длины  сектора плюс GAP4B, то
   этот сектор  нельзя нормально  записать,  поскольку его  удлинившаяся зона
   данных перейдет  за конец дорожки  и затрет  IAM, один  или даже несколько
   первых секторов. Однако, считать такой  сектор можно, причем будет считана
   не только зона данных этого  сектора, но и участок дорожки, продолжающийся
   далеко вперед,  за пределы физической  длины сектора,  и переходящий через
   конец дорожки. Тем  не менее, считанная информация  будет верной только на
   участке от начала  зоны данных  сектора до конца  дорожки, поскольку далее
   произойдет сбой  синхронизации чтения.  Это объясняется  тем, что интервал
   между битами  синхронизации  на  границе дорожки  испытывает  скачок из-за
   неравенства полной длины окружности  дорожки целому числу интервалов между
   битами  синхронизации.  По  этой  причине,  все  биты  синхронизации после
   границы дорожки  будут  иметь некоторый  постоянный  сдвиг по  отношению к
   экстраполяции их  дограничного расположения  через границу.  Путем анализа
   информации,  считанной  при  сбитой  синхронизации,  можно  точно выявлять
   только  "ступеньки",  т.е.   точки,  ограничивающие  области,  заполненные
   одинаковым кодом.  Например,  если  имеется строка  aaaaabbbc,  то  при ее
   чтении со сбитой синхронизацией,  коды произвольно изменятся, но положение
   мест переходов  от a  к b  и  от b  к c  останется прежним,  или сдвинется
   максимум на  один байт. Физическое  положение таких  "ступенек" зависит от
   индивидуальных  параметров  дисковода,  на  котором  производилась запись,
   поэтому  переходящие  секторы  могут   служить  ключевой  меткой,  которую
   невозможно скопировать.  Хотя ключевые  метки такого  типа и  не поддаются
   копированию, они,  однако, имеют  крайне неприятный  недостаток, а именно,
   невоспроизводимость   результатов    записи   метки    из-за   случайного,
   вероятностного характера  стыковки  конца дорожки  с  ее началом.  Даже на
   одном и том  же дисководе  будут каждый раз  получаться разные результаты.
   При  чтении  ключевой  метки,  где  синхронизация  случайно  оказалась "не
   достаточно  сильно  сбита",  возможно  самовосстановление  синхронизации в
   произвольном месте,  и,  следовательно, образование  ложной  ступеньки. По
   этой причине, не все ключевые  метки будут надежно опознаваться защищенной
   программой, и  неизбежны  накладки, особенно,  при  массовом тиражировании
   защищенных дискет. Из известных систем защиты дискет от копирования, такие
   ключевые метки используют CopyLock, Cerberus, и некоторые другие.
      5. Секторы с ошибкой CRC. Это, пожалуй, самый известный способ создания
   ключевой метки.  Можно,  как уже  отмечено,  имитировать ошибку  CRC путем
   "отсечки"  второго  байта  CRC  при  записи  с  прерыванием  опрерации  до
   завершения. Однако,  такой  способ  требует наличия  хорошего  дисковода и
   высокой  точности  таймера  управляющей   FDC  программы,  что  не  всегда
   приемлемо. Существует  другой  способ  имитации ошибки  CRC  путем подмены
   заголовка  сектора. Для  этого  необходимо  отформатировать  дорожку таким
   образом, чтобы "ошибочный"  сектор имел в заголовке  параметр N на единицу
   больше  требуемого, например,  3  вместо  2-х.  Затем  произвести короткую
   запись в этот  сектор, чтобы  не затереть заголовок  следующего по порядку
   сектора, и, наконец, произвести  повторное короткое форматирование дорожки
   с нормальными  заголовками  секторов и  прерыванием  в середине  поля GAP2
   требуемого сектора.  Этот  способ  более надежен,  поскольку  требования к
   точности  намного   ниже.   Отличная,   труднокопируемая   ключевая  метка
   получается,  если  создать  два  последовательно  расположенных  сектора с
   одинаковыми заголовками и ошибкой CRC в каждом. При этом доступ ко второму
   по порядку ключевому сектору будет заблокирован первым.
      6. "Пустые"  секторы. Если сектор  имеет заголовок,  но DATA  AM и зона
   данных  отсутствуют, такой  сектор  называется  "пустым".  "Пустой" сектор
   можно   создать    следующим   образом.    Сначала   произвести   "трущее"
   форматирование на  один короткий  сектор, затем  короткое форматирование с
   прерыванием операции в поле GAP2 требуемого сектора.

                   Сравнительные характеристики ключевых меток.

      Основными  параметрами,   характеризующими   качество   ключевой  метки
   являются:
      - совместимость, т.е. способность  ключевой метки уверенно опознаваться
   всеми компьютерами заданного типа, например, PC/AT;
      -  устойчивость  против   несанкционированного  копирования  различными
   программными и аппаратными средствами;
      - стабильность  ключевых меток при  естественном старении  дискет и при
   изменении параметров окружающей среды.
      1. Совместимость.  Наилучшей  совместимостью  обладают  ключевые метки,
   наличие  которых  можно  проверить  при  помощи  стандартных  функций BIOS
   (особые  секторы),  средней  -  метки,  для  проверки  которых  необходимо
   обращаться к  FDC,  но только  с целью  записи  или чтения  одного сектора
   ("пустые" секторы),  и, наконец, наихудшей  - метки,  для проверки которых
   необходимо обращаться к дополнительным функциям FDC, не используемым BIOS,
   например,  чтение  дорожки,  сканирование   (запись  информации  в  GAPS).
   Неудовлетворительной  совместимостью,  независимо   от  способа  проверки,
   отличаются метки,  основанные на  сбоях синхронизации,  например, секторы,
   переходящие через начало дорожки.  Все метки, созданные вышеперечисленными
   способами,  могут  быть  проверены  как  средствами  BIOS,  так  и  прямым
   обращением к FDC.
      2. Устойчивость  против  несанкционированного копирования.  Проще всего
   копируются особые  секторы и  различные  нестандартные форматы,  труднее -
   секторы с ошибкой CRC и проверкой  на подрезание, еще труднее - информация
   в промежутках (GAPS). Секторы, переходящие  через начало дорожки, могут не
   копироваться вовсе, если проверяется сбой синхронизации, но такие метки не
   надежны.
      3. Стабильность. Надежность  чтения ключевой метки  не должна быть ниже
   надежности чтения  остальной информации,  записанной стандартным способом.
   Этому требованию  в полной мере  удовлетворяют особые  и "пустые" секторы,
   ошибки  CRC. Чуть  менее  надежны,  но  вполне  удовлетворительны ключевые
   метки, основанные  на  записи информации  в  GAPS, и,  наконец, совершенно
   неудовлетворительную  надежность   имеют   метки,   основанные   на  сбоях
   синхронизации.  То  же   относится  и  к   устойчивости  против  старения,
   повышенной  температуры и  влажности,  внешних  магнитных  полей (телефон,
   видеомонитор, бытовые радиоприборы).
