
Ассемблер. Учебное пособие
..pdfплотности записи (значения 250/5 и 300/6 совпадают). Им соответствуют: Low (250/6), Double (250/5 или 300/6), Medium (300/5), High (500/6) и Quad (500/5). Плотности записи Low и Medium не поддерживаются BIOS.
2.5.2. Методы кодирования информации на дискете. В канале цифровой магнитной записи на магнитных носителях применяют модуляционные коды записи. Эти коды должны обладать высокой информативностью, способностью к самосинхронизации. Информативность способа записи – это количество записанной информации, приходящейся на один переход намагниченности. Применение самосинхронизирующихся кодов вызвано тем, что на диске нет отдельной таймерной дорожки для определения битового элемента, т.е. заданного интервала времени, в течение которого должен быть считан бит данных.
Способы кодирования данных различаются методом формирования сигналов данных и синхронизации при записи битовых элементов. Существует несколько методов кодирования:
1.Метод частотной модуляции (ЧМ, F2F) – это разновидность записи с самосинхронизацией. Начало каждого элемента отмечается тактовым импульсом в виде смены направления намагниченности. Если элемент должен представлять “1”, то в его центральной части записывается еще один тактовый импульс, дающий изменение направления магнитного потока, а если “0”, то смены направления намагниченности нет до начала следующего элемента. Если тактовая частота равна F, то поток двоичных единиц дает частоту 2F (отсюда и название метода – F2F).
2.Более эффективна модифицированная частотная модуляция (MFM), которая состоит в следующем. Головка дисковода при записи формирует на дорожке намагниченные точки (домены), причем домены бывают положительные и отрицательные (различаются
направлением магнитного потока в головке). Каждый бит состоит
из 2-х доменов. При этом “1” состоит из одного |
отрицательного |
и |
||
одного положительного домена, “0” следующий |
за “1” состоит |
из |
||
2-х отрицательных доменов, |
а “0” следующий за |
“0” – из |
одного |
|
положительного и одного |
отрицательного |
домена. |
Пример: |
последовательность битов 1001 представляется следующим образом: _П__П__П. Одной из особенностей MFM является то, что последовательность одинаковых бит может читаться как
23
последовательность нулей, так и последовательность единиц, в зависимости от того, в какой момент времени контроллер начал ее читать. Неправильное чтение битов называется сбоем синхронизации. Кроме информационнных байтов, контроллер записывает на дорожку особые байты, называемые маркерными. Эти байты отличаются от информационных тем, что в них есть последовательности из 3-х нулевых бит, второй из которых записывается так, как если бы перед ним была “1”. Это единственный случай, когда на дорожку записывается три отрицательных домена подряд. Маркерные байты являются частью адресных маркеров (AM), которые записываются на дорожку при ее форматировании и предназначены для обозначения начала дорожки и секторов. Каждый адресный маркер состоит из 3-х особых маркерных байтов и байта – идентификатора маркера. Перед каждым маркером записывается настроечная последовательность из 12 нулевых байтов, предназначенная для точной подстройки частоты внутреннего кварцевого генератора контроллера в соответствии с конкретной частотой прохождения доменов синхронизации под считывающей головкой дисковода. Такая подстройка необходима изза неизбежного разброса значений скорости вращения дисководов и частоты тактового генератора контроллеров.
3.Применяются также и схемы группового кодирования, при которых цепочка байт данных предварительно разбивается на группы по несколько бит, кодируемых по определенным правилам. Схема кодирования RLL (Run Length Limited) построена на ограничении длины неперемагничиваемых участков дорожки. Например, в схеме RLL 2.7 число неперемагничивамых бит лежит в диапазоне 2 – 7, частотная модуляция MFM соответствует схеме RLL 1.3.
4.Технология PRML (Partial Response Maximum Likelihood). По обычной технологии считывания используются аналоговые пиковые детекторы сигналов воспроизведения, не позвололяющие увеличить плотность записи из-за усиления межбитовых помех. По технологии PRML аналоговый сигнал от считывающей головки преобразуется в цифровой, а затем из полученной последовательности с помощью цифровой фильтрации выделяются биты значащей информации.
2.5.3.Строение стандартной дорожки. Началом (и концом)
каждой дорожки является точка пересечения её окружности с радиусом, проходящим через центр индексного отверстия дискеты. В начале дорожки записана последовательность из 80 байтов 4E,
24
называемая GAP4A. Далее расположен адресный маркер дорожки (IAM), который нужен для нормальной работы контроллера ГМД. IAM содержит маркерные байты C2 и идентификатор 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 (удаленные данные). За концом первого сектора следуют байты межсекторного промежутка GAP3, код 4E. GAP3 имеет переменную длину, задаваемую при форматировании дорожки параметром GPL. Промежуток от конца последнего сектора до конца дорожки (GAP4B) заполнен байтами 4E, имеет переменную длину и, фактически, представляет собой незаполненный остаток дорожки.
2.5.4 Форматирование дорожки – это первоначальная разметка дорожки, при которой создаются все ее элементы. Для выполнения форматирования надо подать на КНГМД команду, содержащую все необходимые параметры, а именно:
•число необходимых секторов на дорожке;
•код длины секторов;
•GPL (gap length) – параметр, определяющий GAP3;
• |
D (fill byte), |
код заполнения зоны данных всех секторов; |
• |
заголовки |
всех секторов по порядку расположения, |
четверками байтов C, H, R, N.
Длина создаваемых секторов всегда одинакова и определяется только заданным кодом длины, независимо от значений N, указанных в заголовках секторов. Все параметры, включая байты заголовков секторов, могут содержать числа в диапазоне 0...255. После получения команды форматирования дорожки с требуемыми параметрами КНГМД переходит в режим ожидания индексного отверстия (начало дорожки). При поступлении сигнала о прохождении индексного отверстия КНГМД записывает GAP4A, IAM, GAP1, заголовок первого сектора, область данных, заполненных
25
символомзаполнителем, заголовок следующего сектора и т.д. до последнего из заказанных секторов. После записи на дорожку циклического контрольного кода поля данных последнего сектора КНГМД записывает 4E до тех пор, пока не встретится индексное отверстие. При стандартных параметрах форматирование дорожки производится за один оборот, но возможна ситуация, когда формат будет создаваться за два оборота и более. Необходимо отметить, что код длины сектора, указанного в заголовке независим от кода длины в операции форматирования. Например, код длины в заголовке сектора больший, чем в команде форматирования, позволяет получать доступ
кполям, лежащим за пределами сектора.
2.5.5.Особенности чтения и записи секторов. Каждый сектор на дорожке может быть записан или считан контроллером ГМД независимо от остальных секторов. При выполнении этих операций головка устанавливается на требуемую дорожку, затем на КНГМД подается команда чтения или записи сектора с указанием заголовка сектора. После приёма команды чтения КНГМД считывает заголовки всех секторов и сравнивает их с заданным в команде. Операция чтения/записи может завершиться как нормально, так и с ошибкой.
2.5.6.Искусственное прерывание операций форматирования и записи. Запись с прерыванием называется короткой записью, а форматирование с прерыванием – коротким форматированием. Этот приём применяется при создании ключевых меток на дискетах. Точка прерывания может быть выбрана в любом месте дорожки, при этом часть дорожки от её начала до точки прерывания будет сформирована заново, а оставшаяся часть не изменится и сохранит прежний формат. Таким образом, повторным коротким форматированием можно создать дорожку с многократным форматом, в пределе – каждый сектор такой дорожки может быть создан отдельной операцией форматирования с независимо выбранными параметрами. Часто
короткое форматирование дорожки применяется для подмены заголовков одного из секторов. При этом точка прерывания форматирования устанавливается в середине межсекторного промежутка GAP2 этого сектора для того, чтобы заново переписать заголовок, но не тронуть DATA AM и зону данных сектора. Аналогично короткая запись применяется для “отсечки” 2-го байта CRC для имитации ошибки при последующем чтении этого сектора. Надо отметить, что в этом случае требуется точность измерения
26
момента прерывания записи, поскольку промах даже на 1 байт назад вызовет подрезание сектора, а на один байт вперед – отсутствие имитации ошибки.
2.5.7. Идентификация ГМД. Идеология идентификации ГМД основывается на том, что у дискеты выделяются или формируются идентификационные характеристики, которые должны:
•отличать данную дискету от остальных дискет;
•быть доступными для считывания программными способами;
•быть устойчивыми к стандартным операциям (чтение, запись
ит.п.);
•быть невоспроизводимыми средствами копирования. Формирование идентификационных характеристик на дискетах
позволяет создавать программы, защищенные от несанкционированного выполнения или копирования. Дискеты, содержащие подобные характеристики, называются ключевыми и, как правило, не читаются и не копируются стандартными способами. При инсталляции или выполнении защищённая программа обращается к дискете и проверяет наличие ключевой метки (информации), в случае успешного завершения программа продолжает свою работу. Запись и чтение информации с ключевой дискеты осуществляется либо на низком уровне, непосредственно командами контроллера НГМД, либо специальными программами. При создании ключевой дискеты важно знать стандартную логическую структуру дискеты, поддерживаемую операционной системой MS-DOS, и другую необходимую информацию:
1.длина сектора =512 байтам, т.е. означает N=2;
2.цилиндры нумеруются последовательно от 0 до максимального номера;
3.номера дорожек 0 и 1 – для двухсторонних дискет;
4.секторы нумеруются от 1 до максимального номера;
5.cектор 1 на дорожке 0 цилиндра 0 по смещению 11 содержит блок, описывающий характеристики дискеты;
DOS использует прерывание Int 13h, обрабатываемое BIOS,
которое в свою очередь использует данные, хранимые в таблице параметров дискеты (DPT), указатель вектор 1Е. В DPT с точки зрения защиты информации от копирования нужны данные: код размера сектора, номер последнего сектора на дорожке и межсекторный промежуток GPL для операции форматирования.
27
Существует большое разнообразие способов создания ключевой дискеты. Рассмотрим наиболее используемые.
1. Преднамеренное разрушение поверхности носителя На дискете каким-либо способом повреждается магнитный слой.
Поскольку, с точки зрения износа головок, это лучше делать с помощью лазера, данные повреждения получили название “лазерных дырок”. Для идентификации дискеты программе надо проверить наличие “лазерных дырок” в заданных секторах. Наличие “дырок” будет опознаваться как ошибка циклического контрольного кода при чтении.
2. Использование собственного формата ГД Строится по следующей схеме: часть цилиндров на дискете, тех,
на которых размещаются системные области DOS, форматируют со стандартными параметрами. В данной области хранится специальная загрузочная программа, которую, благодаря стандартному формату, DOS может запустить на выполнение. После запуска программа, "зная" параметры, с которыми отформатирована оставшаяся часть дискеты, загружает и выполняет основную программу. Как вариант этого метода применяется нестандартное форматирование одной из дорожек, на которой в одном из секторов хранится ключевая информация.
3. Использование инженерных цилиндров Метод основан на создании дополнительных секторов в
инженерных цилиндрах. Инженерными называются цилиндры, которые формируются за стандартным полем форматирования. При нумерации от нуля для дискет 1,2М или 1,44М – это цилиндры с номерами от 80 до 82. Эти цилиндры могут иметь произвольный формат, например, один сектор с любой, вмещающейся в длину дорожки длиной и с любым заголовком. На инженерных цилиндрах записывается информация о ключевой дискете, которая проверяется в процессе функционирования программы.
4. Особые сектора Сектор с нестандартным заголовком игнорируется стандартной
командой чтения. Особый сектор создается при форматировании. 5. Нестандартное чередование секторов
Особенность стандартного формата DOS – это последовательное возрастание номеров секторов на дорожке. При создании ключевой дискеты порядок нумерации секторов на выбранной дорожке
28
изменяется. Штатная утилита копирования ориентирована на обычное расположение секторов, которое она воссоздает на копии. Нарушение последовательности секторов и другие нарушения в параметрах CHRN проверяется при выполнении команды КНГМД “Чтение идентификатора”.
6. Форматирование с кодом длины 0 или 1 Наиболее распространенный метод. Суть данного метода
состоит в том, что при форматировании дорожки код длины сектора выбирается 0 или 1, но коды длины, записанные в параметры CHRN секторов, могут быть другими. Этот подход позволяет, варьируя значения GAP3, создавать резервные сектора для записи информации о ключевой дискете. Кроме того, форматируя дорожку с кодом длины 0 или 1, но, указывая другие величины в кодах длины CHRN и затем записывая данные в эти сектора, можно получать другие форматы. Это объясняется тем, что запись длинных данных в короткий сектор разрушает маркеры идентификаторов следующих секторов и позволяет получать другой формат.
7. Использование межсекторных промежутков Одни из самых скрытых и трудно копируемых меток. Путем
комбинированного применения команд короткого форматирования и короткой записи можно поместить ключевую информацию в любой промежуток GAP1…GAP4. Например, чтобы поместить ключ в GAP3 между 1-м и 2-м секторами, требуется:
а) отформатировать дорожку на нормальное число секторов с кодом длины 2 и нормальными (GAP1... GAP4), но параметр N заголовка первого сектора установить при форматировании не 2 а 3; б) сделать короткую запись в 1-й сектор так, чтобы не задеть заголовок 2-го сектора (если вовремя не прервать запись, 2-й сектор будет затерт удлинившейся зоной данных 1-го сектора). Запись
необходимо прервать, не доходя 1-2 байтов до IDAM 2-го сектора; в) путем короткого форматирования подменить заголовок 1-го
сектора на нормальный. В результате GAP3 между 1-м и 2-м секторами будет содержать не код 4Е, а записанную информацию. Для осуществления такой операции требуется высокая точность таймера. При помощи повторного форматирования можно создавать межсекторные промежутки любой длины. Например, если после нормального форматирования произвести короткое форматирование этой же дорожки, “заказав” только один сектор, и прервав операцию
29
внутри GAP3 между предпоследним и последним секторами, в результате на дорожке останутся 2 сектора (один – в начале, другой – в конце). Такая операция называется “трущим форматированием” (один сектор затирает другие).
8. Сбойные заголовки секторов Ошибка циклического контрольного кода – самый известный
способ создания ключевой метки. Известны несколько разновидностей имитации ошибки CRC:
а) ошибка имитируется путем отсечения второго байта CRC при записи с прерыванием операции до завершения. Этот способ требует наличия хорошего дисковода и точности таймера;
б) подмена заголовка сектора. Для этого необходимо отформатировать дорожку таким образом, чтобы “ошибочный” сектор имел в заголовке параметр N на единицу больше требуемого, например, 3, а не 2. Затем произвести короткую запись в этот сектор, чтобы не затереть заголовок следующего по порядку сектора, и, наконец, произвести повторное короткое форматирование дорожки с нормальными заголовками секторов и прерыванием в середине поля GAP2 требуемого сектора.
2.6. Пример защиты программы с помощью ключевой дискеты
Рассмотрим пример создания дискеты с записью ключа на инженерной дорожке с нестандартным кодом длины.
org 100h jmp start
tpd |
dw 0,0 |
chrn |
db 80,0,1,1 |
|
db 80,0,2,1 |
|
…………… |
|
…………… |
|
db 80,0,18,1 |
key |
db 12 |
|
db 255 dup(?) |
mes |
db 'Запись не успешна',13,10,' $' |
mes1 |
db 'Дорожка не сформатирована',13,10,'$' |
mes2 |
db 'Запись успешна',13,10, '$' |
mes3 |
db 'Дорожка сформатирована',13,10, '$' |
30
start proc
;установим тип текущего драйвера ГМД
mov ah,18h |
|
mov cl,18 |
;число секторов |
mov ch,80 |
;число дорожек |
mov dl,0 |
;накопитель (А-0) |
int 13h |
; ES:DI – адрес таблицы параметров дискеты |
;сохраним адрес таблицы параметров дискеты |
|
mov tpd, di |
|
mov tpd+2,es |
|
push ds |
|
pop es ;es:bx - восстановим буфер ;установим код длины сектора=1 mov byte ptr es:[di+3], 1 ;форматирование 80 дорожки
mov ah,05 |
|
mov ch,80 |
; дорожка |
mov dh,0 |
; головка |
mov dl,0 |
; номер диска |
lea bx, chrn |
|
int 13h |
|
jnc read1 |
; форматирование ОК |
lea dx,mes1 |
; форматирование неудачно |
mov ah,9 |
|
int 21h |
|
jmp kon |
; выход |
;запись на дорожку ключа read1: lea dx,mes3
mov ah,9 int 21h
mov ah,03
mov al,1 ; количество секторов mov ch,80 ; дорожка
mov cl,1 ; сектор mov dh,0 ; головка
mov dl,0 ; N диска, (А-0) lea bx, key;es:bx – буфер int 13h
31
jnc read |
; запись ОК |
lea dx,mes |
; запись неудачна |
mov ah,9 |
|
int 21h |
|
jmp kon |
; выход |
read: lea dx,mes2 mov ah,9
int 21h
;восстановим таблицу параметров дискеты tpd mov es, tpd+2
mov byte ptr es:[di+3], 2 kon: mov ah,7
int 21h ret
start endp end start
Кроме рассмотренных методов защиты программ с помощью ключевых дискет, можно использовать методы, основанные на применении системных средств BIOS и DOS операционной системы MS-DOS. Одним из простых способов является закрепление за программой конкретного местоположения на ЖМД (жесткий магнитный диск), т.е. определение первого кластера, с которого записывается программа на жестком диске. Алгоритм этого способа следующий:
1.Инсталляционная программа открывает файл с рабочей программой.
2.В префиксе программы PSP по смещению 18h размещается таблица файлов задания JFT (Job File Table) размером 20 байт. Пять полей таблицы JFT заняты стандартными дескрипторами, а остальные могут быть использованы. В таблицу JFT DOS записывает по умолчанию по мере открытия файлов номера соответствующих блоков описания открытых файлов из таблицы SFT (System File Table), свободные байты содержат FFh. Относительный номер байтов JFT от ее начала является дескриптором открытого файла. По дескриптору открытого файла программы можно найти в PSP номер блока описания файла в таблице SFT. Указатель на SFT находится из системной таблицы списка списков (List of List) по смещению 4, а
32