Реферат Система защиты от несанкционированного копирования
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
СОДЕРЖАНИЕ
1. Введение.............................................................................................................. 4
2. Исследовательский раздел............................................................................... 8
2.1. Структура системы защиты от несанкционированного копирования. 8
2.2. Подсистема внедрения управляющих механизмов................................ 10
2.3. Блок установки характеристик среды..................................................... 12
2.4. Выбор структуры системы для реализации............................................ 14
3. Опытно-конструкторский раздел............................................................... 15
3.1. Выбор и обоснование языка программирования................................... 15
3.2. Структура программы................................................................................ 17
3.2.1. Модуль Frozen............................................................................................................................... 19
3.2.2. Модуль Install................................................................................................................................ 20
3.2.3. Модуль Ind..................................................................................................................................... 20
3.2.4. Запуск внешней программы..................................................................................................... 26
3.2.5. Работа с НГМД............................................................................................................................. 27
4. Выводы.............................................................................................................. 28
5. Литература...................................................................................................... 29
6. Приложение..................................................................................................... 31
6.1. Требования к аппаратуре........................................................................... 31
6.2. Требования к программному обеспечению............................................. 31
6.3. Фрагменты программ................................................................................. 31
1. Введение
Вряд ли в нашей стране найдётся хотя бы десяток программистов или людей, повседневно использующих ПК в своей профессиональной деятельности, которые с гордостью могут похвастаться тем, что никогда в жизни не использовали нелегально приобретённые программные продукты. Сегодня сложилась парадоксальная ситуация, когда в большинстве отечественных ПК в основном используется «ворованное» программное обеспечение. Редкое исключение составляют те немногие профессионалы, которые работают в частных фирмах или на совместных предприятиях: как правило, здесь очень дорожат репутацией фирмы и поэтому стараются использовать только лицензионные (официально купленные) программы.
В соответствии с международным правом труд автора программы приравнен к труду других творцов интеллектуальной собственности, таких как писатели, музыканты, художники, и подлежит защите. Однако в отличие от книги или картины массовое копирование программы не вызывает каких-либо технических трудностей и не требует специального дополнительного оборудования, если разумеется, не считать компьютер. В этом отношении программа намного беззащитнее, чем, скажем, скульптура или книга. Общий ущерб от нелегального копирования программ по оценкам западных специалистов составляет от 2 до 10 млрд. долларов в год. Вряд ли в ближайшем будущем что-либо кардинально изменится в этом отношении, особенно в нашей стране.
Бурное развитие информационных технологий и использование их в самых различных, в том числе и критических, областях человеческой деятельности привело к тому, что помимо задач передачи, хранения и обработки информации возникла не менее, а в ряде случаев и более важная задача защиты информации. В соответствии с принятой классификацией выделяют шесть направлений деятельности по защите информации [7]:
1. Защита от несанкционированного доступа в автоматизированных информационных системах, имеющая как программную, так и аппаратную реализацию.
2. Защита информации при передаче по каналам связи и в средствах их коммутации (в том числе в локальных (ЛВС) и распределённых вычислительных сетях).
3. Защита юридической значимости так называемых «электронных» документов (в системе электронной почты (e-mail) и др.)
4. Защита от утечки информации в виде побочных электромагнитных излучений и наводок (ПЭМИН).
5. Защита от программных средств скрытого информационного воздействия (частным случаем которых являются компьютерные вирусы).
6. Защита от несанкционированного копирования и распространения программ и баз данных.
В настоящее время в связи со сложным характером взаимоотношений на рынке программных продуктов проблема защиты от несанкционированного копирования является одной из наиболее острых в области разработки программных средств. Она обусловлена «самой сутью человеческой психологии и будет существовать до тех пор, пока программный продукт является товаром». Данное утверждение подчёркивает экономический базис рассматриваемой проблемы – несанкционированное копирование осуществляется тогда, когда у пользователя существует потребность в эксплуатации какого-то программного продукта, а затраты на копирование существенно меньше затрат на приобретение легальной копии.
Высокий уровень нелегального копирования (по данным международной организации Business Software Alliance в России нелегально используется до 98% программных продуктов) обусловлен в первую очередь соотношением средней оплаты труда и цены набора программного обеспечения, которая колеблется от 200$ для компьютеров домашнего использования до нескольких тысяч долларов для профессиональных систем. Если говорить более строго, то помимо экономических существуют и другие причины для несанкционированного копирования, в частности ознакомительные и психологические, но превалирует всё-таки экономический мотив.
Для разработчика программного обеспечения, как и для любого другого производителя основная задача состоит в том, чтобы окупить затраты на производство и получить прибыль. При этом возможны два крайних варианта: либо производитель находит заказчика, который оплачивает разработку, либо все затраты покрываются за счёт продаж. Для разработчиков предпочтителен первый вариант, так как в нём риск сводится к минимуму, но он возможен только при отсутствии на рынке аналогов программного продукта. Требования к программе должны быть настолько специфичны, а потребность в продукте настолько велика, что заказчику не оставалось бы ничего другого, кроме как оплатить разработку. Учитывая сегодняшнюю ситуацию в области разработки программ, этот случай можно рассматривать как вырожденный. Типичной является ситуация, когда производитель разрабатывает продукт за счёт собственных средств с целью продать определённое число копий и не заинтересован в бесплатном тиражировании.
Для противодействия попыткам несанкционированного копирования используются различные методы защиты программного обеспечения: организационные, юридические, программные и программно-аппаратные. Наиболее популярными (по крайней мере в нашей стране являются технические, т.е. программные и программно-аппаратные методы, так как только они обеспечивают противодействие в момент несанкционированного копирования программного продукта, в отличие от остальных, где санкции за нелегальное использование либо отсутствуют, либо разнесены во времени с моментом эксплуатации нелегальной копии.
К настоящему времени разработаны достаточно эффективные методы противодействия несанкционированному копированию, однако стоит подчеркнуть, что не существует такой защиты, которую было бы невозможно (помимо воли автора) снять. Не должно вызывать сомнений то, что опытный программист, обладающий соответствующими навыками, всегда сможет найти то место (те места) в защищённой программе, где принимается решение о легальности копии, и, изменив несколько байт (или даже один единственный байт) в коде программы, лишить её возможности к самозащите. Именно по этой причине ведущие фирмы-производители массового программного обеспечения практически никогда не ставят защиту на свои программы, справедливо полагая, что не стоит тратить силы и средства на создание системы защиты (тем более, что эти системы, как правило, причиняют пользователю определённые неудобства), если всё равно программа будет вскрыта. Эти фирмы получают свои «дивиденды» за счёт массовости объёма продаж при сравнительно низкой цене за каждую копию. Они делают ставку на «цивилизованных» покупателей и, что примечательно, таким способом воспитывают их! Более того, в последнее время получили распространение программы, которые как раз рассчитаны на механизм «пиратского» копирования и распространяются преимущественно именно таким способом: обычно эти программы сопровождаются «электронным письмом» (файлом с текстом), в котором содержится краткая инструкция по работе с программой и указываются необходимые координаты автора с просьбой выслать небольшую сумму в случае, если пользователь считает, что достоинства программы заслуживают этого.
Несколько иначе обстоит дело с программами, которые не рассчитаны на массового пользователя. К таким относятся различного рода системы автоматизированного проектирования, предыздательские системы, специализированные базы данных и т.п. Как правило, это весьма наукоёмкие товары, т.е. в них особенно велик вклад высококлассных специалистов в конкретных прикладных областях. Труд таких специалистов обычно высоко ценится, поэтому общие затраты на создание подобного рода программ могут быть весьма и весьма велики, что в сочетании со сравнительно небольшим кругом потенциальных пользователей делает цену каждой копии очень большой. Такие программы обычно снабжаются защитой, так как ограниченный спрос на них формирует весьма специфичный (и чаще всего «цивилизованный») рынок: покупателями этих программ являются специалисты в конкретной прикладной области, которые не имеют нужных навыков и, главное, желания заниматься вскрытием программ.
2. Исследовательский раздел
2.1. Структура системы защиты от несанкционированного копирования.
В общем случае система защиты от несанкционированного копирования представляет собой комплекс средств, предназначенный для затруднения (в идеале – предотвращения) нелегального копирования (исполнения) защищаемого программного модуля, с которым она ассоциирована.
Обобщив сведения из различных источников можно предложить следующую структуру системы защиты от несанкционированного копирования (Рис. 2.1). [7]
Рис. 2.1. Структура системы защиты от несанкционированного копирования
Подсистема внедрения управляющих механизмов представляет собой комплекс программных средств, предназначенный для подключения внедряемого защитного кода к защищаемому программному модулю. Внедряемый защитный код – это программный модуль, задача которого состоит в противодействии попыткам запуска (исполнения) нелегальной копии защищаемой программы.
Подсистема реализации защитных функций представляет собой программную секцию, решающую задачу распознавания легальности запуска защищаемой программы.
Подсистема противодействия нейтрализации защитных механизмов предназначена для борьбы с возможными попытками нейтрализации системы защиты от несанкционированного копирования и/или её дискредитации.
Блок установки характеристик среды отвечает за получение характеристик, идентифицирующих вычислительную среду.
Блок сравнения характеристик среды устанавливает факт легальности запуска защищаемой программы.
Блок ответной реакции реализует ответные действия системы защиты на попытки несанкционированного исполнения защищаемой программы.
Наличие системы защиты подразумевает наличие злоумышленника, который будет пытаться каким-то образом нейтрализовать защиту для решения задачи несанкционированного копирования. При этом необходимо отчётливо понимать, что не существует абсолютно стойкой защиты, а существуют защиты, время преодоления которых по затратам труда и машинного времени сравнимы с разработкой системы, аналогичной защищённой. Данное положение приводит к парадоксальному на первый взгляд результату – вероятность нейтрализации защиты у элементарных программных продуктов со средним уровнем защищённости гораздо ниже, чем у сложных программ с высоким уровнем защиты.
В отдельных случаях, при относительно невысокой цене одной копии, конечному пользователю бывает выгоднее купить необходимое число инсталляций, чем оплачивать квалифицированный труд хакера.
Поскольку стойкость системы защиты определяется стойкостью каждого её элемента, то в качестве объекта атаки может использоваться любая из описанных подсистем. Здесь необходимо отметить неоднородный уровень как самих идей, лежащих в основе той или иной подсистемы, так и их реализаций, что, в первую очередь связано с развитием приёмов, методов и средств для нейтрализации систем защиты. Учитывая современное состояние вопроса, наиболее актуальной задачей, с точки зрения автора, является разработка подсистемы внедрения управляющих механизмов системы защиты и подсистемы установки характеристик среды, хотя остальные подсистемы должны быть разработаны не менее тщательно. Показательным примером является блок ответной реакции, который может как просто выводить сообщение о незаконности копии (что моментально выдаёт присутствие системы защиты), так и предпринимать более сложные действия, позволяющие на определённое время замаскировать наличие защиты, увеличивая тем самым время атаки.
Но если функционирование блока ответной реакции может влиять на надёжность системы лишь косвенным образом, то зачастую самым слабым местом всей системы является блок сравнения характеристик среды и именно против него в первую очередь направлены атаки злоумышленников.
2.2. Подсистема внедрения управляющих механизмов.
Системы защиты от несанкционированного копирования можно классифицировать по способу внедрения защитного механизма:
- встроенная (внедряется при создании программного продукта);
- пристыковочная (подключается к уже готовому программному продукту).
Наибольшую популярность в последнее время приобрели системы второго типа. Это обусловлено рядом преимуществ, которые даёт их использование:
- простота тиражирования программных систем защиты на объекты заказчика и разработчика;
- простота технологии применения;
- обеспечение достаточного уровня защищённости данных в силу специализации разработчиков;
- более оптимальное соотношение «надёжность функционирования/затраты на разработку» по сравнению со встроенными системами, подготовленными непрофессионалами.
Рассмотрим способы установки защитных механизмов в защищаемые программные модули.
Одним из вариантов встраивания пристыковываемого модуля в исполняемый модуль является дописывание его по вирусному принципу. [4] (Естественно, из рассмотрения исключаются варианты, при которых программа перестаёт работать или нарушается логика её работы.) При этом код защиты дописывается в некоторую область защищаемого файла и защищаемый файл модифицируется таким образом, чтобы управление передавалось на пристыкованный модуль защиты, который проверяет легальность копии, и в случае положительного ответа передаёт управление на исполняемый модуль. Такой подход к внедрению в исполняемые файлы имеет ряд существенных недостатков. Во-первых, исходный код защищаемой программы остаётся практически в неизменном виде, что значительно упрощает нейтрализацию защиты. Во-вторых, если предполагается защищать файлы большого размера и, как следствие, со сложной (может быть и с оверлейной) структурой, то необходимо учитывать то, что код, находящийся в конце загружен не будет, а значит программный модуль не будет отработан. Некоторые недостатки можно устранить, если писать в начало программы не одну команду перехода, в весь код защиты. При этом необходимо модифицировать таблицу перемещения (которая находится в конце заголовка EXE-файла), в случае если защищается файл типа EXE.
Основным недостатком защит такого типа является то, что они могут быть нейтрализованы динамически, путём определения момента, когда защитная часть уже отработала и начал выполняться сам защищаемый код. Примером такого подхода к нейтрализации защит являются программы SNAPSHOT и INTRUDER. Основная идея метода, реализованного в подобных программах, заключается в двукратной загрузке исследуемого модуля по разным адресам памяти с последующим вычислением всей необходимой информации на основе анализа дампов памяти (под необходимой информацией здесь понимается заголовок EXE-файла, содержащий всю информацию, которая требуется операционной системе для загрузки программы).
Другим важным недостатком описанных методов внедрения является то, что существующие защитные механизмы данного типа не могут обеспечить корректную защиту самомодифицирующихся программ, которые в процессе выполнения изменяют свой образ, хранящийся на диске.
Исходя из указанных недостатков, можно сформулировать следующие требования к пристыковываемым модулям:
- пристыковываемый модуль должен подключаться к файлам любого размера;
- результирующий файл, полученный после подключения пристыковываемого модуля, должен быть устроен таким образом, чтобы максимально затруднить выделение исходной защищаемой программы;
- пристыковываемый модуль не должен накладывать ограничений на функционирование защищённой программы, в частности, он должен позволять модифицировать в процессе работы свой собственный дисковый файл.
2.3. Блок установки характеристик среды.
Если структура системы защиты от несанкционированного копирования практически не зависит от применяемых способов защиты, то конкретная реализация блока установки характеристик среды зависит от многих параметров, среди которых можно выделить способ предполагаемой организации распространения программного обеспечения.
В общем случае программное обеспечение может распространяться:
- бесплатно (из альтруизма и соображений саморекламы);
- условно бесплатно (по принципу «попробуй и купи» (try and buy), когда оплата производится добровольно и только тогда, когда пользователь соглашается с реальной пользой для себя данного продукта);
- на коммерческой основе.
Последний случай (распространение программного продукта на коммерческой основе) предусматривает наличие защиты, которая может включать или не включать в себя технические меры.
При наличии технических мер защиты производитель может распространять свой программный продукт тремя основными способами, которые определяют конкретную реализацию блока установки характеристик среды:
- с помощью специальной службы распространения;
- через торговые организации;
- через свободное распространение дистрибутивных (демонстрационных) пакетов с последующей регистрацией.
При наличии специальной службы распространения контроль за дистрибутивными носителями вместо технических мер осуществляется организационными мерами. Сотрудники службы распространения выезжают с дистрибутивными комплектами к заказчикам, где производят установку программного обеспечения на жёсткий диск. Поскольку наличие у пользователя резервных копий не предусматривается, то в случае сбоя требуется повторный выезд сотрудника службы распространения, что обычно рассматривается как определённое неудобство. При данном способе блок установки характеристик среды должен уметь идентифицировать только параметры компьютера, благодаря чему разработка блока несколько упрощается.
В случае распространения программных продуктов через торговые организации возможны следующие варианты:
- программа ассоциирует (связывает) себя с дистрибутивным носителем без «привязки» к конкретному компьютеру;
- программа ассоциирует себя со специальным аппаратным устройством, подключаемым к компьютеру и входящим в дистрибутивный комплект;
- программа ассоциирует себя как с дистрибутивным носителем (при инсталляции), так и с параметрами компьютера (в рабочем режиме).
Первые два варианта удобны тем, что позволяют переносить защищённые программы с компьютера на компьютер, но как плату за это требуют постоянного присутствия либо ключевой дискеты, либо специального аппаратного устройства.
Свободный от этих недостатков третий вариант требует помимо обеспечения надёжности ключевой дискеты решения далеко не простой проблемы счётчика инсталляций.
Достаточно интересен третий способ распространения программного обеспечения – посредством свободного распространения дистрибутивных (демонстрационных) пакетов. Суть этого способа лучше всего описать следующим сценарием. Пользователь, всё равно каким способом, получает программу и запускает её на своём компьютере. При запуске ему сообщается некоторый код, который вместе с квитанцией об оплате он должен передать разработчику. В ответ ему сообщается другой код, являющийся паролем для регистрации копии программы и ассоциации её с компьютером. По такому способу, например, защищён некогда популярный текстовый процессор «Слово и Дело».
Таким образом, в зависимости от выбранного способа распространения программного продукта, блок установки характеристик среды должен уметь идентифицировать параметры компьютера, дистрибутивного носителя, либо специального аппаратного устройства.
2.4. Выбор структуры системы для реализации.
В этом параграфе на основе анализа общей структуры системы защиты от несанкционированного копирования, проведённого в пп. 2.1 – 2.3, выбирается структура системы для реализации.
Для реализации выбрана пристыковочная система защиты от несанкционированного копирования. Этот выбор определили преимущества, даваемые её использованием, которые перечислены в п. 2.2.
Учитывая требования к пристыковываемым модулям, сформулированные в п. 2.2, в программе реализована следующая схема пристыковки. Защищаемый файл шифруется и дописывается в пристыковываемый модуль как данные. Когда пристыкованному модулю необходимо передать управление на защищённую программу, он расшифровывает её во временный файл и запускает при помощи функции DOS Exec. После отработки временный файл удаляется.
Как стало ясно из п. 2.3, реализация блока установки характеристик среды зависит от способа распространения защищённого программного продукта. Автором программы выбран способ распространения через торговые организации. При этом при инсталляции программа ассоциирует себя с дистрибутивным носителем (ключевой дискетой), а в рабочем режиме с параметрами компьютера. Такой способ не требует постоянного присутствия ключевой дискеты.
3. Опытно-конструкторский раздел
3.1. Выбор и обоснование языка программирования.
Языки программирования нельзя сравнивать между собой вне связи с решаемыми задачами. Ведь каждый язык изначально проектировался для максимально эффективного решения какого-то своего класса задач. Язык Фортран (Fortran - FORmula TRANslator – транслятор формул) – для численных вычислений, язык Лисп (Lisp –LISt Processing – обработка списков) – для решения задач искусственного интеллекта, Пролог (Prolog – PRO LOGic) – для программирования в терминах логики и т.д. Таким образом ещё до написания программы встаёт вопрос выбора языка программирования, который бы представлял наиболее подходящие средства для решения поставленной задачи. Постановка задачи должна быть ясна из вышесказанного. Ниже автор постарался сформулировать основные требования к программной реализации и на основе как постановки задачи, так и этих требований выбрать язык программирования.
Требования к программной реализации:
- Как можно меньший объём кода, дописываемого к защищаемому программному продукту.
- Как можно меньшее время работы кода защиты перед передачей управления основной (защищаемой) программе.
Для реализации программы автором выбран язык программирования ассемблер (Assembler). Подчеркнём те особенности языка, которые и определили этот выбор:
1) Ассемблер является языком низкого (машинного) уровня, в отличие от языков высокого уровня (ЯВУ), из которых наиболее часто применяемыми в последнее время являются Бейсик (Basic), Паскаль (Pascal), Си (С). Следовательно язык Ассемблера максимально приближен к аппаратным средствам компьютера и его «натуральным» возможностям, что позволяет организовать непосредственное управление аппаратурой.
2) Программы на языке ассемблера очень детальны. Язык ассемблера требует планирования буквально каждого шага ЭВМ. Человек, который знаком только с языками высокого уровня, вероятно, отнесёт это обстоятельство к недостатку языка. Его можно понять, так как, во-первых, при большом объёме исходного текста резко возрастает вероятность ошибки, а во-вторых, бесконечное число деталей может помешать добиться оптимальности программы в целом. Однако, максимальная детализация (ведь одна мнемоника языка ассемблера соответствует одной машинной команде) позволяет решать задачи управления аппаратурой максимально эффективно, т.е. при небольшом объёме кода (это не означает маленького размера исходного текста) за минимальное время.
3.2. Структура программы.
Программа состоит из трёх модулей:
1) Модуль Frozen - подготавливает ключевую дискету и записывает на неё инсталлятор, в который включает защищаемую программу.
2) Модуль Install, который проверяет дискету и, если она является ключевой, устанавливает на винчестер пользовательскую программу (Task), защищённую модулем Ind.
3) Модуль Ind, который при первом запуске определяет характеристики среды и сохраняет их, а при всех последующих запусках сравнивает текущие характеристики среды с определёнными при первом запуске. Если характеристики не изменились, то модуль расшифровывает и запускает Task. После отработки Task удаляется с винчестера.
Рассмотрим эти модули поподробнее.
3.2.1. Модуль Frozen.
Модуль Frozen подготавливает ключевую дискету следующим образом. На дискете форматируется дорожка с номером 80 (нумерация дорожек начинается с нуля). Так как DOSом на дискетах объёмом 1.44 мегабайта используются только дорожки с номерами от 0 до 79, это действие никак не повлияет на информацию, хранимую обычным способом. Дорожки, находящиеся за стандартным полем форматирования (в случае дискеты 1.44 мегабайта – это дорожки с номерами не менее 80), называют инженерными цилиндрами. В первый сектор восьмидесятой дорожки (длина сектора – 512 байт, нумерация секторов ведётся с единицы) записывается счётчик копий и сигнатура. Счётчик копий представляет собой байт, который содержит оставшееся число инсталляций защищённой программы. Программа Frozen запрашивает у пользователя количество копий и полученным числом инициализирует счётчик копий. Сигнатурой является строка «Copyright © KES_Company, 1998». После этого на подготовленную дискету записывается модуль Install, включающий защищаемую программу Task.
3.2.2. Модуль Install.
Итак, модуль Frozen записывает на ключевую дискету модуль Install.
Модуль Install осуществляет инсталляцию модуля Ind на жёсткий диск только при одновременном выполнении двух условий:
1) программа Install должна быть запущена с ключевой дискеты – дискеты, подготовленной модулем Frozen;
2) счётчик копий не должен быть равен нулю.
Следовательно, одной из задач модуля Install является определение факта подлинности ключевой дискеты. Данная задача решается следующим образом. Программа Install читает первый сектор восьмидесятой дорожки и, если он содержит сигнатуру, то делается вывод о подлинности ключевой дискеты. После каждой инсталляции счётчик копий декрементируется. Если значение счётчика окажется равным нулю, то это означает то, что количество инсталляций (заданное при подготовке дискеты программой Frozen) с данной дискеты исчерпано. После записи на жёсткий диск модуля Ind модуль Install запускает его на выполнение. Смысл этого действия будет понятен из нижеследующего описания модуля Ind.
3.2.3. Модуль Ind.
При первом запуске программы Ind осуществляется привязка к индивидуальным характеристикам компьютера для предотвращения копирования программы на другой компьютер. Программа запоминает характеристики компьютера, на котором она была запущена в первый раз во внутренних полях и при последующих запусках сравнивает их с текущими. При несовпадении делается вывод о несанкционированном копировании. Для того, чтобы привязаться к конкретному компьютеру не достаточно определения какой-нибудь одной характеристики (например, процессора), т.к. по одному параметру нельзя с достаточной уверенностью идентифицировать компьютер (совершенно очевидно, что в мире очень много компьютеров с одинаковыми процессорами).
Даже, учитывая то, что в мире существует множество компьютеров с совершенно одинаковыми характеристиками, идентификация компьютера множеством его характеристик даёт нам вполне надёжную привязку.
Индивидуальные характеристики.
Индивидуальные характеристики, используемые при работе модулем Ind:
1) FDDCount – число накопителей на гибких магнитных дисках (НГМД);
2) FDDType – тип накопителей НГМД;
3) BaseMemory – объём базовой памяти;
4) ExtMemory – объём расширенной памяти (памяти сверх 1 мегабайта);
5) BIOSData – дата издания ROM-BIOS;
6) CPUType – тип центрального процессора;
7) CPUFeature – информация, характеризующая возможности центрального процессора;
8) VESAVersion – версия VBE (VESA BIOS Extension);
9) VideoMemory – объём видеопамяти;
10)VESAOEMString – информация производителя видеокарты.
Рассмотрим теперь процесс определения этих характеристик.
Определение числа НГМД.
В области данных BIOS по адресу 0:0410h хранится двухсловная переменная, называемая списком оборудования. Список оборудования включает в себя число НГМД. Список оборудования заполняется компьютером во время POST (Power-On Self-Test), ROM-программы, выполняемой во время включения ПЭВМ. Биты 6-7 содержат число НГМД, уменьшенное на единицу.
Определение типа накопителей НГМД, объёма базовой и расширенной памяти.
В современных компьютерах для хранения текущей конфигурации аппаратных средств используется энергонезависимая память CMOS. Эта память с точки зрения программиста состоит из набора ячеек, доступ к которым для чтения и записи выполняется через порты ввода-вывода с адресами 70h и 71h. Процедура чтения ячейки CMOS состоит из двух шагов. На первом шаге программа записывает в выходной порт с адресом 70h номер ячейки, из которой необходимо прочитать информацию. На втором шаге программа читает содержимое данной ячейки из входного порта с адресом 71h. В памяти CMOS хранится текущее время и дата, сведения о конфигурации системы, результат тестирования при включении питания и другая информация. В том числе в ячейке с адресом 10h хранится тип накопителей НГМД, в ячейках с адресами 15h-16h – объём основной памяти и в ячейках с адресами 17h-18h – объём расширенной памяти (это значение дублируется в ячейках 30h-31h).
Определение даты издания ROM-BIOS.
Дата издания ROM-BIOS в коде ASCII хранится в области данных BIOS по адресу F000:FFF5 и занимает 8 байт.
Определение типа центрального процессора и информации, характеризующей его возможности.
Для определения процессоров младше Pentium использована методика, изложенная в [14].
Способ распознавания процессоров Intel 8086/8088 основан на том факте, что биты 12-15 регистра FLAGS всегда установлены в единицу. Прежде всего программа переписывает текущее содержимое регистра FLAGS в регистр AX. Для этого используется стек:
PUSHF
POP AX
Далее программа пытается записать нулевые значения в биты 12-15 регистра FLAGS:
AND AX,0FFFh
PUSH AX
POPF
Теперь нужно проверить, изменилось ли содержимое указанных битов регистра FLAGS. Для этого новое содержимое регистра FLAGS переписывается через стек в регистр AX, а затем после наложения маски 0F000h, сравнивается со значением 0F000h:
PUSHF
POP AX
AND AX,0F000h
CMP AX,0F000h
JE this_8086
Если биты 12-15 остались установленными в единичное значение, программа работает на процессоре Intel 8086/8088, если нет – в компьютере установлена более старшая модель процессора.
Программные коды для определения других типов процессора не приводятся, так как они аналогичны приведённым.
В процессоре Intel 80286, когда он работает в реальном режиме адресации, биты 12-15 регистра FLAGS всегда сброшены в нуль, что можно использовать для обнаружения этой модели процессора.
Для того, чтобы отличить процессор Intel 80386 от процессоров старших моделей, можно попробовать установить в регистре EFLAGS бит 18. Этот бит был впервые определён в процессоре Intel 80486 для сигнализации ошибки выравнивания. Его невозможно установить в процессоре Intel 80386.
Отличительная особенность процессора Intel 80486 – невозможность изменения состояния бита 21 регистра EFLAGS. Этот бит используется процессорами Intel Pentium и более старшими моделями процессоров Intel для определения возможности вызова команды идентификации процессора CPUID.
В новых процессорах фирмы Intel (включая все процессоры Pentium и старше) появилась новая команда CPUID, специально предназначенная для определения модели процессора. В программе эту команду можно определить в виде макроса следующим образом:
CPUID MACRO
DB 0Fh
DB 0A2h
ENDM
Для определения модели процессора следует вызвать команду CPUID, загрузив предварительно в регистр EAX значение 1:
MOV EAX,1
CPUID
При этом в регистр EAX будет загружено слово сигнатуры, по которому можно будет определить модель процессора, а в регистр EDX – слово, состоящее из отдельных флагов, характеризующих возможности процессора (feature flags). Именно содержимое этих двух регистров (EAX, EDX) и сохраняется в полях CPUType (EAX) и CPUFeature (EDX) программы в случае, если процессор не младше Pentium. В остальных случаях значение CPUFeature равно нулю, а CPUType кодируется следующим образом:
CPUType | Процессор |
1 | Intel 8086/8088 |
2 | Intel 80286 |
3 | Intel 80386 |
4 | Intel 80486 |
Определение версии VBE, объёма видеопамяти и информации производителя видеокарты.
Определение данных характеристик даёт нам возможность идентифицировать видеоадаптер компьютера.
MOV AX, 4F00h
ES:DI должны указывать на буфер размером 256, первые четыре байта которого должны содержать «VBE2»
INT 10h
Как результат выполнения данной функции поля буфера заполнены информацией, характеризующие видеоадаптер. В числе прочих параметров там содержится версия VBE, объём видеопамяти, представленный в блоках размером по 64 килобайта, указатель на строку формата ASCIIZ, содержащую информацию фирмы производителя видеокарты.
Группы характеристик.
Использование индивидуальных характеристик причиняет пользователю определённые неудобства, связанные с невозможностью изменения (в том числе и расширения) состава аппаратных средств. И это ограничение является существенным, так как в наше время для того, чтобы успевать за прогрессом, требуется постоянный upgrade. Автор программы попытался несколько смягчить это неудобство.
Все индивидуальные характеристики разделены на группы. Каждая группа характеристик идентифицирует какой-либо компонент компьютера (видеокарту, материнскую плату (Motherboard), дисководы (FDD) и т.д.) При изменении характеристик в пределах одной группы не делается вывода о незаконности копии, а осуществляется запоминание изменённых параметров. Такой подход позволит пользователю после замены какого-то одного(!) компонента ЭВМ продолжить работу с защищённой программой. Если изменяется более, чем одна группа, то в этом случае делается вывод о несанкционированном переносе программы на другой компьютер.
Группа | Компонент | Характеристики |
FDD | Дисковод | FDDCount |
| | FDDType |
RAM | ОЗУ | BaseMemory |
| | ExtMemory |
BIOS | Материнская плата, ПЗУ | BIOSData |
CPU | Процессор | CPUType |
| | CPUFeature |
Video | Видеоадаптер | VESAVersion |
| | VideoMemory |
| | VESAOEMString |
Хранение индивидуальных характеристик.
Хранение индивидуальных характеристик организовано так, что их нельзя скопировать стандартными средствами. Кроме того, индивидуальные характеристики хранятся в зашифрованном виде. Применяется шифрование методом XOR с константой 0ABh. Известно, что наименьшей порцией информации, хранимой на жёстком диске является кластер. Если программа занимает не целое число кластеров, то за логическими пределами файла остаётся некоторое пространство, которое и используется для хранения индивидуальных характеристик. При этом возникает проблема – если дискового пространства за логическими пределами файла не хватает для размещения там индивидуальных характеристик. Данная проблема решается удлинением файла на такое количество байт, чтобы гарантированно обеспечить необходимое пространство. Идея некопируемости расположенной таким образом информации состоит в том, что стандартные утилиты копирования (Copy) не копируют такое пространство, ориентируясь по реальной длине файла. При использовании данного метода, оказывается, нельзя «законно» копировать программу не только на другой компьютер, но и на компьютер, на который программа была установлена. Таким образом на жёстком разрешается хранить только одну работающую копию программы. Однако, благодаря алгоритму перемещения операционной системы DOS (при перемещении файла переписывается только номер начального кластера, без копирования файла на новое место), позволяется переносить (Move) программу в другой каталог того же диска без потери работоспособности.
Шифрование защищаемой программы.
Защищаемая программа (Task) хранится в модуле Ind в зашифрованном виде. Из соображений быстродействия (ведь Task расшифровывается при каждом “законном” запуске Ind) выбран чрезвычайно простой метод шифрования – метод XOR с константой 0A5h.
3.2.4. Запуск внешней программы.
В двух случаях нам приходилось запускать из программ другие программы:
1) из Install программу Ind;
2) из Ind программу Task.
Рассмотрим эту процедуру поподробнее. Во время работы программы ей выделяется максимально доступное количество оперативной памяти. Для того, чтобы запустить внешнюю (по отношению к текущей) программу необходимо освободить такое количество памяти, чтобы её хватило для нормальной работы запускаемой программы. Так как мы заранее не знаем сколько памяти потребуется защищаемой программе освободим максимально возможный её объём. Это достигается следующим образом. Сегменты программы располагаются таким образом, чтобы кодовый сегмент оказался первым. В самом начале кодового сегмента кодируется команда JMP. За ней расположены только те данные которые необходимы для запуска внешнего процесса. Затем коды, которые необходимы для запуска внешней программы и заключительных действий после возврате из неё. Непосредственно перед запуском размер выделенного родительской программе блока памяти (с помощью функции DOS 4Ah) уменьшается так, что в памяти остаётся размещённым только запускающий участок кода и его данные. Следующим шагом на него передаётся управление.
3.2.5. Работа с НГМД.
Все действия, связанные с работой с критической информацией ключевой дискеты, как то форматирование дорожки с номером 80, чтение/запись сектора 1 на 80 дорожке осуществляются, используя программирование контроллера НГМД на физическом уровне. Работа с НГМД ведётся через порты. Фрагменты программы, реализующие работу с НГМД на физическом уровне приводятся в приложении 6.3.
4. Выводы
1) Проанализирована общая структура системы защиты от несанкционированного копирования и на основе этого анализа выбрана структура системы для реализации.
2) Разработана система защиты от копирования в соответствии с заданием на курсовой проект.
3) Привязка к конкретному компьютеру осуществлена с использованием множества его индивидуальных характеристик. (Как показано в п. 3.2.3 одной такой характеристики недостаточно.)
4) Разработана концепция объединения индивидуальных характеристик в группы, использование которой уменьшает неудобства пользователя системы. (См. п. 3.2.3.)
5) Использовано программирование контроллера НГМД на физическом уровне, посредством чего организована работа с ключевой дискетой.
5. Литература
1) Абель П. Язык Ассемблера для IBM PC и программирования / Пер. с англ. Ю.В. Сальникова. - М.: Высш. шк., 1992. - 447 с.: ил.
2) Бродин В.Б., Шагурин И.И. Микропроцессор i486. Архитектура, программирование, интерфейс. - М.: «ДИАЛОГ-МИФИ», 1993. - 240 с.
3) Григорьев В.Л. Микропроцессор i486. Архитектура и программирование (в 4-х книгах). Книга 1. Программная архитектура. Книга 2. Аппаратная архитектура. Книга 3. Устройство с плавающей точкой. Книга 4. Справочник по системе команд. - М., ГРАНАЛ, 1993. - с. 382, ил. 54
4) Касперский Е. Компьютерные вирусы в MS-DOS. М.: Издательство «ЭДЭЛЬ», 1992. - 176 с.
5) Нортон П., Соухэ Д. Язык ассемблера для IBM PC: Пер. с англ., - М.: Издательство «Компьютер»; Финансы и статистика, 1992. - 352 с.: ил.
6) Пильщиков В.Н. Программирование на языке ассемблера IBM PC. - М.: «ДИАЛОГ-МИФИ», 1996. - 288 с.
7) Правиков Д.И. Ключевые дискеты. Разработка элементов систем защиты от несанкционированного копирования. – М.: Радио и связь, 1995. – 128 с.: ил.
8) Скляров В.А. Применение ПЭВМ. В 3 кн. Кн. 1. Организация и управление ресурсами ПЭВМ: Практ. пособие. - М.: Высш. шк., 1992. 158 с.: ил.
9) Скляров В.А. Применение ПЭВМ. В 3 кн. Кн. 2. Операционные системы ПЭВМ: Практ. пособие. - М.: Высш. шк., 1992. 144 с.: ил.
10) Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера: Пер. с англ. - 2-е изд., стереотип. - М.: Радио и связь. 1991. - 336 с.: ил.
11) Фодор Ж., Бонифас Д., Танги Ж. Операционные системы - от PC до PS/2: Пер. с франц. - М.: Мир, 1992. - 319 с., ил.
12) Фаронов В.В. Турбо Паскаль (в 3-х книгах). Кн. 3. Практика программирования. Часть 2. - М.: Учебно-инженерный центр «МВТУ - ФЕСТО ДИДАКТИК», 1993. - 304 с., ил.
13) Финогенов К.Г. Самоучитель по системным функциям MS-DOS. - Изд. 2, перераб. и дополн. - М.: Радио и связь, Энтроп, 1995. - 382 с., ил.
14) Фролов А.В., Фролов Г.В. Аппаратное обеспечение персонального компьютера. - М.: ДИАЛОГ-МИФИ, 1997. - 304 с. - (Библиотека системного программиста; Т. 33)
15) Хоган Т. Аппаратные и программные средства персональных компьютеров: Справочник. В 2-х кн. Кн.1. - М.: Радио и связь, 1995. - 384 с.
16) 2B ProGroup: Вегнер В.А., Крутяков А.Ю., Серегин В.В., Сидоров В.А., Спесивцев А.В. Аппаратура персональных компьютеров и её программирование. IBM PC/XT/AT и PS/2. - М: Радио и связь, 1995. - 224 с. - (Библиотека системного программиста).
17) 2B Programmers Group: Спесивцев А.В., Вегнер В.А., Крутяков А.Ю., Серегин В.В., Сидоров В.А. Защита информации в персональных ЭВМ. - М.: Радио и связь, МП «Веста», 1992. - 192 с.: ил. - (Библиотека системного программиста)
6. Приложение
6.1. Требования к аппаратуре.
1) Программа работает только с дискетами размером 3.5” объёмом 1.44 мегабайта, которые форматированы стандартным образом.
6.2. Требования к программному обеспечению.
1) Программы комплекса должны быть запущены в реальном режиме из-под DOS версии 6.22.
2) Так как программы комплекса отмеряют величины задержек, используя встроенный интервальный таймер, он должен быть запрограммирован стандартным образом.
6.3. Фрагменты программ.
Фрагменты программ комплекса, реализующие работу с НГМД на физическом уровне.
1) Макросы, облегчающие работу с процедурами нижнего уровня, непосредственно осуществляющими управление НГМД. (Файл ngmd.mac.)
;Передача байта в контроллер НГМД
out_ngmd MACRO byte
LOCAL @Ok
mov AH,byte
call OutFDC
jnc @Ok
FatalError
@Ok:
ENDM
; Приём байта из контроллера НГМД
in_ngmd MACRO Mem
LOCAL @Ok
push AX
call InFDC
jnc @Ok
jmp @ErrFatal
@Ok: IFNB <Mem>
mov Mem,AL
ENDIF
pop AX
ENDM
; Ожидание прерывания от контроллера НГМД
WaitInt MACRO
LOCAL @Ok
call _WaitInt
jnc @Ok
FatalError
@Ok:
ENDM
; Критическая ошибка
FatalError MACRO
jmp @ErrFatal
ENDM
; Позиционирование головки дисковода
; Вход:
; D – номер накопителя
; HDS – номер головки
; NCN – номер дорожки
ngmdSeek MACRO D,HDS,NCN
LOCAL @Ok
mov DL,D
mov DH,HDS
mov CH,NCN
shl DH,2
or DL,DH
call _ngmdSeek
jnc @Ok
FatalError
@Ok:
ENDM
; Чтение сектора
; D – номер дисковода
; HDS – номер головки (стороны)
; NCN – номер дорожки
; R – номер сектора
; Buf - буфер
ngmdRead MACRO D,HDS,NCN,R,Buf
mov DL,D
mov DH,HDS
mov CH,NCN
mov CL,R
mov AX,DS
mov ES,AX
lea DI,Buf
call _ngmdRead
ENDM
; Запись сектора
; D – номер дисковода
; HDS – номер головки (стороны)
; NCN – номер дорожки
; R – номер сектора
; Buf - буфер
ngmdWrite MACRO D,HDS,NCN,R,Buf
mov DL,D
mov DH,HDS
mov CH,NCN
mov CL,R
mov AX,DS
mov ES,AX
lea DI,Buf
call _ngmdWrite
ENDM
2) Фрагмент модуля Frozen, демонстрирующий форматирование дорожки. (Файл frozen.asm.)
; Переменная для хранения старого вектора 8h
Old_8h dd 0
; Переменная для организации задержек
RtCounter dw 0
; Собственный обработчик прерывания 8h (Timer)
; для организации задержек
Int_8h PROC
push AX
cmp CS:RtCounter,0
je New08IRet
dec CS:RtCounter
New08IRet:
; Стандартные действия по корректировке времени
push DS
mov AX,40h ;Настройка на область данных BIOS
mov DS,AX
add WORD PTR DS:[6Ch],1
adc WORD PTR DS:[6Eh],0
cmp WORD PTR DS:[6Eh],0018h
jne New08Time
cmp WORD PTR DS:[6Ch],00B0h
jne New08Time
mov BYTE PTR DS:[70h],1
mov WORD PTR DS:[6Ch],0
mov WORD PTR DS:[6Eh],0
New08Time: pop DS
mov AL,20h
out 20h,AL
jmp SHORT $+2
pop AX
iret
Int_8h ENDP
; Флаг для установки факта прихода прерывания
f_Int0Eh db 0
; Переменная для хранения старого вектора 0Eh
Old_0Eh dd 0
; Собственный обработчик прерывания 0Eh
; для определения факта прихода прерывания от НГМД
Int_0Eh PROC
push AX
mov CS:f_Int0Eh,1
mov AL,20h
out 20h,AL
jmp SHORT $+2
pop AX
iret
Int_0Eh ENDP
Main PROC
; Пропущено (skip)
; Настройка ES на таблицу векторов прерываний
xor AX,AX
mov ES,AX
; Сохранение вектора 8h (Timer)
GetIntVec 8h,CS:Old_8h
; Установка своего обработчика прерывания 8h
SetIntVec 8h
; Сохранение вектора 0Eh (прерывание от НГМД)
GetIntVec 0Eh,CS:Old_0Eh
; Установка своего обработчика прерывания 0Eh
SetIntVec 0Eh
; Установка скорости передачи данных между контроллером и накопителем
xor AX,AX ;500 килобит/сек
mov DX,03F7h ;CCR
out DX,AL
jmp SHORT $+2
; Сброс контроллера НГМД
call _ngmdReset
; Подготовка таблицы формата
lea SI,FormatBuf
mov BYTE PTR DS:[SI],4Dh ;Код команды FORMAT
mov BYTE PTR DS:[SI+1],0 ;головка 0, накопитель A:
mov BYTE PTR DS:[SI+2],2 ;Размер сектора – 512 байт
mov BYTE PTR DS:[SI+3],18 ;Количество секторов
mov BYTE PTR DS:[SI+4],108 ;Размер GAP3
mov BYTE PTR DS:[SI+5],066h ;Символ-заполнитель
add SI,2
mov CX,18
xor AX,AX
PrepForFormat:
inc AL
add SI,4
mov BYTE PTR DS:[SI],80 ;Цилиндр
mov BYTE PTR DS:[SI+1],0 ;Поверхность
mov BYTE PTR DS:[SI+2],AL ;Номер сектора
mov BYTE PTR DS:[SI+3],2 ;Код длины сектора
loop PrepForFormat
; Позиционирование головки дисковода A:
; головка - 0
; дорожка - 80
ngmdSeek 0,0,80
push DS
pop ES
mov AL,4Ah
mov CX,18*4
lea DI,FormatBuf
add DI,6
; Подготовка канала DMA для передачи данных в НГМД
call SetDMA
; Передача данных в НГМД - форматирование
mov CX,6
lea SI,FormatBuf
cld
FormatTableHeader:
lodsb
out_ngmd AL
loop FormatTableHeader
; Ожидание прерывания от НГМД
WaitInt
in_ngmd ST0
REPT 6
in_ngmd
ENDM
mov AH,ST0
and AH,11000000b
or AH,AH
jz @Ok1
@ErrFatal:
; Критическая ошибка
mov AH,9
lea DX,MesErrFatal
int 21h
jmp @MotorOff
@Ok1:
call _ngmdReset
ngmdWrite 0,0,80,1,Sector
@MotorOff:
; Сброс контроллера НГМД
call _ngmdReset
; Выключение электродвигателя НГМД
mov DX,3F2h
mov AL,0Ch
out DX,AL
mov AX,0
mov ES,AX
; Восстановление вектора 0Eh
RestoreIntVec 0Eh
; Восстановление вектора 8h
RestoreIntVec 8h
; Пропущено (skip)
Main ENDP
3) Процедуры нижнего уровня, непосредственно работающие с контроллером НГМД и контроллером
DMA. (Файлы frozen.asm и install.asm.)
; Передача данных в контроллер НГМД
;
; Вход:
; AH – байт для передачи
; Выход:
; CF = 1 - Ошибка
; CF = 0 - Байт передан
OutFDC PROC
push AX
push BX
push CX
push DX
mov DX,3F4h
mov BL,2
xor CX,CX
OutFDC1: in AL,DX
and AL,11000000b
cmp AL,10000000b
je OutFDC2
loop OutFDC1
dec BL
jnz OutFDC1
stc
jmp SHORT OutFDCRet
OutFDC2: inc DX
mov AL,AH
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
clc
OutFDCRet:
pop DX
pop CX
pop BX
pop AX
ret
OutFDC ENDP
; Приём байта из контроллера НГМД
;
; Выход:
; AL – принятый байт
; CF = 1 - Ошибка
; CF = 0 - Байт принят
InFDC PROC
push BX
push CX
push DX
mov DX,3F4h
InFDC0: mov BL,2
xor CX,CX
InFDC1: in AL,DX
and AL,11000000b
cmp AL,11000000b
je InFDC2
loop InFDC1
dec BL
jnz InFDC1
stc
jmp SHORT InFDCRet
InFDC2: inc DX
in AL,DX
mov BX,29
call WaitTimer2
clc
InFDCRet:
pop DX
pop CX
pop BX
ret
InFDC ENDP
; Инициализация DMA
;
; Вход:
; AL – код операции
; AL = 4Ah – передать в НГМД
; AL = 46h – передавать из НГМД
; ES:DI - адрес буфера
; CX – длина данных
SetDMA PROC
push AX
push CX
cli
push AX
mov AL,00000110b
out 0Ah,AL
jmp SHORT $+2
pop AX
out 0Ch,AL
jmp SHORT $+2
out 0Bh,AL
jmp SHORT $+2
push CX
mov AX,ES
mov CL,4
rol AX,CL
mov CH,AL
and AL,0F0h
add AX,DI
adc CH,0
out 4,AL
jmp SHORT $+2
mov AL,AH
out 4,AL
jmp SHORT $+2
mov AL,CH
and AL,0Fh
out 81h,AL
jmp SHORT $+2
pop AX
dec AX
out 5,AL
jmp SHORT $+2
mov AL,AH
out 5,AL
jmp SHORT $+2
mov AL,2
out 0Ah,AL
jmp SHORT $+2
sti
pop CX
pop AX
ret
SetDMA ENDP
; Ожидание прерывания от НГМД
_WaitInt PROC
mov CS:f_Int0Eh,0
mov CS:RtCounter,2000/55 ;2 сек.
WaitIntLoop:
cmp CS:f_Int0Eh,0
jne WaitIntCF0
cmp CS:RtCounter,0
jne WaitIntLoop
stc
jmp SHORT WaitIntRet
WaitIntCF0: clc
WaitIntRet: ret
_WaitInt ENDP
; Выполнение команды НГМД «Считать состояние прерывания»
; (Sense Interrupt Status)
Sensl PROC
out_ngmd 00001000b
in_ngmd ST0
in_ngmd
ret
Sensl ENDP
; Seek
; DL – номер дисковода и номер головки
; CH – номер дорожки
_ngmdSeek PROC
push AX
out_ngmd 0Fh ; Код команды для поиска
out_ngmd DL ; Номер дисковода и номер головки
out_ngmd CH ; Номер дорожки
WaitInt
Delay 5 ; Время установки головки (225 ms)
call Sensl
mov AL,ST0
and AL,11100000b
cmp AL,00100000b
je @SeekOk
stc
jmp SHORT @SeekRet
@SeekOk: clc
@SeekRet: pop AX
ret
_ngmdSeek ENDP
; Чтение сектора
;
; Вход:
; DL – номер дисковода
; DH – номер головки стороны
; CH – номер дорожки
; CL – номер сектора
; ES:DI - буфер
_ngmdRead PROC
push DX
; Позиционирование головки
and DL,00000011b
and DH,00000001b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,46h
call SetDMA
pop CX
out_ngmd 46h ; Код команды чтения
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdRead ENDP
; Запись сектора
;
; Вход:
; DL – номер дисковода
; DH – номер головки (стороны)
; CH – номер дорожки
; CL – номер сектора
; ES:DI - буфер
_ngmdWrite PROC
push DX
; Позиционирование головки
and DL,00000011b
and DH,00000001b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,4Ah
call SetDMA
pop CX
out_ngmd 45h ; Код команды записи
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdWrite ENDP
; Сброс контроллера НГМД
_ngmdReset PROC
; Начальный сброс
cli
mov AL,00011000b
mov DX,3F2h
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
mov AL,00011100b
out DX,AL
jmp SHORT $+2
sti
; Ожидание прерывания от НГМД
WaitInt
mov CX,4
mov DL,11000000b
ResetSens:
; Считать состояние прерывания
call Sensl
mov AH,ST0
cmp AH,DL
je @Ok3
FatalError
@Ok3: inc DL
loop ResetSens
; Задержка
Delay 1000/55
out_ngmd 00000011b ;Код команды Specify
out_ngmd 0AFh ;Параметры SRT|HUT
out_ngmd 2h ;Параметры HLT|ND
mov CX,2
RecalRestart:
cli
out_ngmd 00000111b ;Код команды Recalibrate
out_ngmd 0 ;Накопитель – A:
sti
; Ожидание прерывания от НГМД
WaitInt
; Считать состояние прерывания
call Sensl
mov AH,ST0
test AH,00100000b
jz RecalTry
and AH,11000000b
test AH,11000000b
jz RecalCompl
RecalTry:
loop RecalRestart
jmp @ErrFatal
RecalCompl:
; Задержка
mov BX,18750
call WaitTimer2
ret
_ngmdReset ENDP
; Передача данных в контроллер НГМД
;
; Вход:
; AH – байт для передачи
; Выход:
; CF = 1 - Ошибка
; CF = 0 - Байт передан
OutFDC PROC
push AX
push BX
push CX
push DX
mov DX,3F4h
mov BL,2
xor CX,CX
OutFDC1: in AL,DX
and AL,11000000b
cmp AL,10000000b
je OutFDC2
loop OutFDC1
dec BL
jnz OutFDC1
stc
jmp SHORT OutFDCRet
OutFDC2: inc DX
mov AL,AH
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
clc
OutFDCRet:
pop DX
pop CX
pop BX
pop AX
ret
OutFDC ENDP
; Приём байта из контроллера НГМД
;
; Выход:
; AL – принятый байт
; CF = 1 - Ошибка
; CF = 0 - Байт принят
InFDC PROC
push BX
push CX
push DX
mov DX,3F4h
InFDC0: mov BL,2
xor CX,CX
InFDC1: in AL,DX
and AL,11000000b
cmp AL,11000000b
je InFDC2
loop InFDC1
dec BL
jnz InFDC1
stc
jmp SHORT InFDCRet
InFDC2: inc DX
in AL,DX
mov BX,29
call WaitTimer2
clc
InFDCRet:
pop DX
pop CX
pop BX
ret
InFDC ENDP
; Инициализация DMA
;
; Вход:
; AL – код операции
; AL = 4Ah – передать в НГМД
; AL = 46h – передавать из НГМД
; ES:DI - адрес буфера
; CX – длина данных
SetDMA PROC
push AX
push CX
cli
push AX
mov AL,00000110b
out 0Ah,AL
jmp SHORT $+2
pop AX
out 0Ch,AL
jmp SHORT $+2
out 0Bh,AL
jmp SHORT $+2
push CX
mov AX,ES
mov CL,4
rol AX,CL
mov CH,AL
and AL,0F0h
add AX,DI
adc CH,0
out 4,AL
jmp SHORT $+2
mov AL,AH
out 4,AL
jmp SHORT $+2
mov AL,CH
and AL,0Fh
out 81h,AL
jmp SHORT $+2
pop AX
dec AX
out 5,AL
jmp SHORT $+2
mov AL,AH
out 5,AL
jmp SHORT $+2
mov AL,2
out 0Ah,AL
jmp SHORT $+2
sti
pop CX
pop AX
ret
SetDMA ENDP
; Ожидание прерывания от НГМД
_WaitInt PROC
mov CS:f_Int0Eh,0
mov CS:RtCounter,2000/55 ;2 сек.
WaitIntLoop:
cmp CS:f_Int0Eh,0
jne WaitIntCF0
cmp CS:RtCounter,0
jne WaitIntLoop
stc
jmp SHORT WaitIntRet
WaitIntCF0: clc
WaitIntRet: ret
_WaitInt ENDP
; Выполнение команды НГМД «Считать состояние прерывания»
; (Sense Interrupt Status)
Sensl PROC
out_ngmd 00001000b
in_ngmd ST0
in_ngmd
ret
Sensl ENDP
; Seek
; DL – номер дисковода и номер головки
; CH – номер дорожки
_ngmdSeek PROC
push AX
out_ngmd 0Fh ; Код команды для поиска
out_ngmd DL ; Номер дисковода и номер головки
out_ngmd CH ; Номер дорожки
WaitInt
Delay 5 ; Время установки головки (225 ms)
call Sensl
mov AL,ST0
and AL,11100000b
cmp AL,00100000b
je @SeekOk
stc
jmp SHORT @SeekRet
@SeekOk: clc
@SeekRet: pop AX
ret
_ngmdSeek ENDP
; Чтение сектора
;
; Вход:
; DL – номер дисковода
; DH – номер головки стороны
; CH – номер дорожки
; CL – номер сектора
; ES:DI - буфер
_ngmdRead PROC
push DX
; Позиционирование головки
and DL,00000011b
and DH,00000001b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,46h
call SetDMA
pop CX
out_ngmd 46h ; Код команды чтения
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdRead ENDP
; Запись сектора
;
; Вход:
; DL – номер дисковода
; DH – номер головки (стороны)
; CH – номер дорожки
; CL – номер сектора
; ES:DI - буфер
_ngmdWrite PROC
push DX
; Позиционирование головки
and DL,00000011b
and DH,00000001b
shl DH,2
or DL,DH
shr DH,2
call _ngmdSeek
; Инициализация контроллера DMA
push CX
mov CX,512
mov AL,4Ah
call SetDMA
pop CX
out_ngmd 45h ; Код команды записи
out_ngmd DL ; Номер головки и накопителя
out_ngmd CH ; Номер дорожки
out_ngmd DH ; Номер головки
out_ngmd CL ; Номер сектора
out_ngmd 2 ; Код длины сектора
out_ngmd 18 ; Количество секторов на дорожке
out_ngmd 108 ; Длина межсекторного промежутка
out_ngmd 0FFh ; Длина передаваемых данных
; Ожидание прерывания от НГМД
WaitInt
REPT 7
in_ngmd
ENDM
pop DX
ret
_ngmdWrite ENDP
; Сброс контроллера НГМД
_ngmdReset PROC
; Начальный сброс
cli
mov AL,00011000b
mov DX,3F2h
out DX,AL
jmp SHORT $+2
mov BX,29
call WaitTimer2
mov AL,00011100b
out DX,AL
jmp SHORT $+2
sti
; Ожидание прерывания от НГМД
WaitInt
mov CX,4
mov DL,11000000b
ResetSens:
; Считать состояние прерывания
call Sensl
mov AH,ST0
cmp AH,DL
je @Ok3
FatalError
@Ok3: inc DL
loop ResetSens
; Задержка
Delay 1000/55
out_ngmd 00000011b ;Код команды Specify
out_ngmd 0AFh ;Параметры SRT|HUT
out_ngmd 2h ;Параметры HLT|ND
mov CX,2
RecalRestart:
cli
out_ngmd 00000111b ;Код команды Recalibrate
out_ngmd 0 ;Накопитель – A:
sti
; Ожидание прерывания от НГМД
WaitInt
; Считать состояние прерывания
call Sensl
mov AH,ST0
test AH,00100000b
jz RecalTry
and AH,11000000b
test AH,11000000b
jz RecalCompl
RecalTry:
loop RecalRestart
jmp @ErrFatal
RecalCompl:
; Задержка
mov BX,18750
call WaitTimer2
ret
_ngmdReset ENDP