Текст
                    2В PROGRAMMERS GROUP БИБЛИОТЕКА СИСТЕМНОГО ПРОГРАММИСТА
А.В. Спесивцев В. А. Вегнер А. Ю. Крутиков В. В. Серегин В. А. Сидоров
ЗАЩИТА ИНФОРМАЦИИ  ЯЕРСОНЛАЬНЫК ЭВМ
Scan Pirat
МОСКВА
•РАДИОИ СВЯЗЬ-
ВЕСТА
1993
ЧТО НАДО ЗНАТЬ ПРИ ВЫБОРЕ СИСТЕМЫ ЗАЩИТЫ ОТ КОПИРОВАНИЯ
Копируется ли ключевая дискета платой OPTION BOARD?
В нашей стране платы OPTION BOARD получили широкое распространение и, скорее всего, защищенная дискета будет копироваться и распространяться.
Используются ли средства системы BIOS для проверки информации о ключевой дискете?
Если используются средства системы BIOS, то система защиты легко вскрывается и формат дискеты вряд ли достаточно сложный.
Применяются ли в системе специальные меры для защиты от отладчиков в процессорах INTEL 80386 и INTEL 80486?
Если такие мерь) не применяются, то легко выполнить трассировку программы на специализированных отладчиках, использующих режим виртуального процессора 8086 для процессоров INTEL 80386 и INTEL 80486.
Имеется ли возможность установки защищенной программы на НЖМД (т. е. привязки программы к характеристикам компьютера)?
Если данная возможность отсутствует, то система обеспечивает привязку защищенной программа только к ключевой дискете, что в ряде случаев не удобно.
Изменяется ли характеристика, к которой система привязывает программу при установке на НЖМД, при сопровождении носителя (изменении параметров разбиения, уплотнении, переформатировании)?
Если при сопровождении носителя данная характеристика изменяется, то система должна обеспечивать функцию снятия.
Имеются ли в системе функции снятия установленной программы с НЖМД с восстановлением счетчика установок на ключевой дискете?
Если такие функции Ьрисутствуют, то при использовании такой система легко получить нелегальную копию.
Оглавление
Введение ........................................... 3
1.	Анализ возможных каналов утечки информации, хранящейся в ПЭВМ ....................................... 8
1.1.	Введение.................................... 8
1.2.	Классификация возможных каналов утечки информации в ПЭВМ ...................................12
2.	Системы защиты информации от НСД.................15
2.1.	Введение....................................15
2.2.	Средства, позволяющие контролировать доступ . . 16
2.2.1.	Главная загрузочная запись............16
2.2.2.	Загрузочная запись ...................18
2.2.3.	Командный процессор ..................18
2.2.4.	ДРАЙВЕР ..............................18
2.2.5.	Вектор прерываний ....................19
2.3.	Реализация функций системы разграничения доступа	19
2.4.	Анализ некоторых систем.....................23
3.	Криптографические методы защиты информации ... 27
3.1.	Введение....................................27
3.2.	Основные криптографические методы ..........29
3.2.1.	Шифрование с помощью датчика псевдослучайных чисел.................................29
3.2.2.	DES — Стандарт США на шифрование данных 33
3.2.3.	ГОСТ 28147-89 — отечественный стандарт на шифрование данных............................34
3.2.4.	Системы с открытым ключом ............39
3.3.	Сравнение криптографических методов ........42
4.	Системы защиты от копирования ...................45
4.1.	Введение....................................45
4.2.	Технические сведения .......................48
4.2.1.	Гибкие магнитные диски (дискеты) .... 48
4.2.2.	Контроллер НГМД.......................51
4.2.3.	Программы, позволяющие исследовать дискету 72
4.2.4.	Программы, позволяющие копировать дискету 80
4.3.	Методы построения систем защиты от копирования 84
4.3.1.	Общие принципы построения систем защиты от копирования ...........................84
4.3.2.	Методы построения защищенных от копирования дискет ...............................89
4.3.3.	Методы противодействия изучению алгоритмов систем защиты .-..............-.......91
4.3.4.	Недостатки некоторых существующих систем защиты от копирования....................102
4.4.	Методы взлома систем защиты от копирования . .105
4.4.1.	Создание копии ключевой дискеты....105
4.4.2.	Модификация кода программы с целью обхода проверки ..............................106
4.4.3.	Моделирование обращений к ключевой дискете 108
4.4.4.	Использование аппарата установки/снятия .109
4.4.5.	Снятие программы из памяти ........НО
4.5.	Как скопировать защищенную от копирования дискету 111
4.6.	Анализ форматов ключевых дискет .......116
4.7.	CERBERUS — Система защиты программ от копирования ....................................125
Приложение 1. ПРОГРАММА КОНТРОЛЯ ВХОДА В ПЭВМ С ПОМОЩЬЮ КОМАНДЫ SHELL	. . . .129
Приложение 2. ПРОГРАММА КОНТРОЛЯ ВХОДА В ПЭВМ С ПОМОЩЬЮ КОМАНДЫ DEVICE	. . . .136
Приложение 3. СТАНДАРТ ШИФРОВАНИЯ ДАННЫХ В США 140
Приложение 4. ПРОГРАММА ШИФРОВАНИЯ ОБЛАСТИ ПАМЯТИ С ПОМОЩЬЮ ПРОГРАММНОГО ДАТЧИКА ПСЧ ......................................150
Приложение 5. ПРОГРАММА ШИФРОВАНИЯ ОБЛАСТИ ПАМЯТИ С ИСПОЛЬЗОВАНИЕМ ДРУГОЙ ОБЛАСТИ .........................................151
Приложение 6. ПРОГРАММА «ДОПИСЫВАНИЯ» (ПО ВИРУСНОМУ ПРИНЦИПУ) COM-ФАЙЛА К EXE- ИЛИ СОМ-ФАЙЛУ.............................154
Приложение 7. ПРОГРАММА ОПРЕДЕЛЕНИЯ ТИПА ПРО-
ЦЕССОРА И РЕЖИМА ЕГО РАБОТЫ . .172
Приложение 8. ПРОГРАММА КОНТРОЛЯ СОСТОЯНИЯ ЛИНИИ А20	 180
Приложение 9. ПРОЦЕДУРА ПРИВРАТНИКА............182
СПИСОК ЛИТЕРАТУРЫ..............................189
ВВЕДЕНИЕ
Появившиеся в начале 80-х персональные ЭВМ (ПЭВМ) прочно вошли во все сферы человеческой деятельности. Вместе с ними у эксплуатирующих ПЭВМ организаций и ведомств возникли и многочисленные проблемы. Одна из них — защита информации. Согласно статистическим данным более 80 % компаний и агентств несут финансовые убытки из-за нарушения безопасности данных.
Проблема защиты информации представляет собой совокупность тесно связанных подпроблем в областях права, организации управления, разработки технических средств, программирования и математики. По-видимому, эффективную систему защиты можно создать, объединив усилия разных специалистов. Одна из центральных задач проектирования систем защиты состоит в рациональном распределении имеющихся людских, материальных и других ресурсов.
Характерная особенность использования ПЭВМ в нашей стране заключается в том, что доступ к ним имеют многие пользователи. В связи с таким «многопользовательским» режимом работы возникает целый набор взаимосвязанных вопросов по защите информации, хранящейся в ПЭВМ. »
В настоящей работе авторы сосредоточили внимание на исследовании средств построения «программно-математического» контура системы защиты информации. Области права, организации управления и проектирования технических средств остались вне рассмотрения.
В качестве объектов исследований в книге были выбраны ПЭВМ типа IBM PC и операционная система MS DOS. Авторы исходили из того, что читатель имеет определенные знания как архитектуры ПЭВМ, так и основных принципов функционирования MS DOS [1,10,12].
Книга состоит из введения, четырех глав, приложений и списка литературы.
В первой главе обсуждается проблема несанкционированного доступа (НСД), анализируются возможные каналы утечки информации и проводится их классификация. На основе этой классификации выделяются следующих
6
Введение
три основных «программных» возможных канала утечки информации:
•	несанкционированный доступ программы к информации;
•	несанкционированная расшифровка программой зашифрованной информации;
•	несанкционированное копирование информации с носителей.
Анализ, проведенный в первой главе, и выделение трех основных «программных» возможных каналов утечки определили содержание трех последующих глав: в каждой из них рассматривается отдельный канал утечки и средства, позволяющие его закрыть.
Во второй главе исследуются средства, с помощью которых можно построить «программный» контур защиты обрабатываемой и хранящейся в ПЭВМ информации. Предлагается схема, увязывающая все эти средства в одну систему. Анализируется ряд отечественных систем защиты информации в ПЭВМ, в том числе наиболее стойкая к взлому система KRYPTON.
В третьей главе исследуются основные криптографические методы защиты информации. Акцент делается на наиболее часто используемых на практике методах. Проводится сравнение методов.
В четвертой главе исследуется достаточно новая проблема — защита программ от копирования. Приводятся сведения, необходимые для понимания основных принципов построения систем защиты от копирования. Обсуждаются методы построения таких систем. Описываются «ноу-хау» разработки систем защиты от копирования — методы создания ключевых (некопируемых) дискет, методы борьбы, позволяющие изучать логику работы системы с помощью отладчиков и дисассемблеров. Приводимые методы значительно «сильнее» методов, изложенных в известных книгах Д. Брэдли [1 ], Р. Джордена [10 ] и П. Нортона [12 ]. Исследуются возможные способы взлома таких систем.
Анализируются отечественные системы защиты от копирования, распространенные на рынке программных средств. Делается вывод о ненадежности большинства из них и показывается, как достаточно просто «сломать» данные системы с помощью известных программных средств. Описывается система CERBERUS — лучшая отечественная система защиты программ от копирования. Она является единственной отечественной системой, ключевые диске
Введение
7
ты которой не копируются не только программными, но и аппаратными средствами высокоточного побитового аналогового копирования типа платы COPYIIPC DeLuxe Option Board. Для пользователя, желающего выбрать систему защиты от копирования, приводятся рекомендации, позволяющие выбрать наилучшую из доступных ему систем.
Заметим, что надежная защита от несанкционированного копирования информации с носителей — последнего из перечисленных возможных каналов утечки — является особенно актуальной в связи с формирующимся в настоящее время рынком программных средств, с одной стороны, и полным отсутствием законодательных мер защиты авторских прав, с другой.
В приложениях приводятся исходные тексты разработанных авторами программ. Эти программы могут служить основой для проектирования надежных средств закрытия возможных каналов утечки информации.
НЕСКОЛЬКО СЛОВ ОБ АВТОРАХ
Книга написана группой авторов, которые называют себя 2В PROGRAMMERS GROUP. В настоящее время они работают в совместном советско-американском предприятии «ДИАЛОГ» в отделе экспертизы и сертификации программного обеспечения*. В состав группы входят высококвалифицированные системные программисты, специализирующиеся в системах компьютерной безопасности, разработке защиты от копирования и программного обеспечения для различных устройств ПЭВМ.
Настоящая книга является первой в серии книг, которые авторы готовят к выпуску. Последующие книги в основном предназначены для программистов, желающих углубить свои знания о работе различных устройств ПЭВМ (мониторов, принтеров, накопителей на гибких и жестких магнитных дисках и т.д.). В книги планируется включить тексты исходных программ.
Авторам хотелось бы знать, какие устройства (и какие вопросы о работе устройств) особенно интересны читателям. Соответствующие книги авторы подготовят в первую очередь.
* Адрес отдела экспертизы и сертификации СП «Диалог»: 117598, Москва, ул. Ягодная, 17. Телефон (095) 329-4611, факс (095) 3294711. E-mail (Relcom): QA-DEP@JVD. MSK.SU.
АНАЛИЗ ВОЗМОЖНЫХ КАНАЛОВ УТЕЧКИ ИНФОРМАЦИИ, ХРАНЯЩЕЙСЯ В ПЭВМ
1.1.	ВВЕДЕНИЕ
При создании и использовании ПЭВМ возникает целый ряд взаимосвязанных теоретических и практических проблем. В коммерческих и военных областях одной из основных проблем является защита информации.
Анализ отечественной [1-7,11,15] и зарубежной [9,10,12-14,16-44] литературы позволил выделить следующие объективные причины, определяющие важность проблемы защиты информации:
•	высокие темпы роста парка ПЭВМ, находящихся в эксплуатации;
•	широкое применение ПЭВМ в самых различных сферах человеческой деятельности;
•	высокая степень концентрации информации в ПЭВМ;
•	совершенствование способов доступа пользователей к ресурсам ПЭВМ;
•	усложнение вычислительного процесса в ПЭВМ.
Усложнение методов и средств организации машинной обработки информации приводит к тому, что информация становится все более уязвимой. Этому способствуют такие факторы, как постоянно возрастающие объемы обрабатываемых данных, накопление и хранение данных в ограниченных местах, постоянное расширение круга пользователей, имеющих доступ как к ресурсам ПЭВМ, так к программам и данным, хранящимся в них, усложнение режимов эксплуатации вычислительных систем и т. п.
Каналы утечки информации, хранящейся в ПЭВМ 9
Учитывая эти факторы, защита информации в процессе ее сбора, хранения и обработки приобретает исключительно важное значение. Под защитой информации понимается совокупность мероприятий, методов и средств, обеспечивающих решение следующих основных задач: • проверки целостности информации;
•	исключения несанкционированного доступа к ресурсам ПЭВМ и хранящимся в ней программам и данным;
•	исключения несанкционированного использования хранящихся в ПЭВМ программ (т. е. защиты программ от копирования).
Во второй, третьей и четвертой главах книги дается сравнение известных методов и средств решения трех вышеизложенных задач. Заметим, что последняя задача, решаемая с помощью системы защиты, приобретает в настоящее время исключительно важное значение из-за отсутствия в нашей стране соответствующих законодательных мер, с одной стороны, и формирующимся рынком программных средств, с другой.
Модели систем защиты информации. В отечественной и зарубежной литературе анализируется достаточно много моделей, позволяющих оценить эффективность системы защиты.
Одной из основных моделей, разработанных зарубежными специалистами, до недавнего времени была модель Бела-Лападулы [22 ]. Она обеспечила базис для анализа защищенности вычислительных систем и позволила продвинуть технологию разграничения доступа к системе. В модели Бела-Лападулы определяется набор ограничений, способных запретить любой работающей в системе программе несанкционированный доступ к защищаемой информации. Модель оперирует понятиями субъекта, инициирующего процессы доступа, и объекта — пассивной категории системы. Субъекты, как и объекты, имеют уровни защиты. Ограничения на доступ субъектов к объектам принимают форму аксиом. Модель Бела-Лападулы вполне пригодна для анализа защищенности информации в ПЭВМ, работающей в автономном режиме. Вместе с тем для анализа защищенности сети, построенной на основе ПЭВМ, модель Белла—Лападулы не пригодна [35, 42 ]. Объясняется это тем, что при обмене информацией в
ю
Глава 1
сетях имеют место асинхронные процессы, которые не могут быть описаны в терминах модели.
В [42] предложена модель, оперирующая терминами вход/выход. В [35] в основу модели, известной под названием модели Лендвера, предлагается положить конкретную сферу применения системы. Это позволит построить совокупность ограничений на систему, вытекающих из режимов ее функционирования. Модель Лендвера предоставляет пользователям возможность разобраться в стратегии защиты. При описании модели используются десять утверждений, таких как определение полномочий пользователей, иерархия классификаций, правила изменения и просмотр сообщений и др.
Наиболее достоверными и соответствующими действительности представляются игровые модели защиты, т. е. модели, в которых имеются (минимум) две стороны. Первая сторона строит систему защиты информации, а вторая — систему преодоления защиты, построенной первой стороной. Игра начинается с построения первой стороной некоторой системы защиты. После этого вторая сторона начинает преодолевать построенную систему защиты, а первая сторона — строить новую. Если вторая сторона преодолела защиту, построенную первой стороной, раньше того момента, как первая построила новую, то первая сторона проиграла. Если к моменту преодоления защиты у первой стороны имеется новая система защиты, то она выиграла. Независимо от исхода первого раунда игра продолжается. Критерием эффективности системы защиты при данном подходе является функция двух аргументов — времени, затрачиваемого первой стороной на построение системы защиты, и времени, затрачиваемого второй стороной на преодоление защиты. Можно рассматривать и более сложные игровые модели, учитывающие не только время, но и стоимость защищаемой информации и затраты на разработку/преодоление системы защиты. В подобных моделях стоимость информации, защищаемой первой стороной, уменьшается со временем, а одним из аргументов критерия эффективности системы защиты является остаточная стоимость информации после «вскрытия» защиты второй стороной.
Принципы проектирования систем. В публикациях отмечается, что разработка системы защиты должна вестись вместе с разработкой самой системы, которую
Каналы утечки информации, хранящейся в ПЭВМ 11
предполагается защитить. Опыт создания систем защиты позволяет выделить следующие основные принципы, которых следует придерживаться при их проектировании.
1.	Простота механизма защиты. Этот принцип общеизвестен, но не всегда глубоко осознается. Действительно, некоторые ошибки, не выявленные в ходе проектирования и эксплуатации, позволяют обнаружить неучтенные пути доступа. Необходимо тщательное тестирование программного или аппаратного средства защиты, однако на практике такая проверка возможна только для простых и компактных схем.
2.	В механизме защиты в нормальных условиях доступ должен отсутствовать, и для работы системы защиты необходимы условия, при которых доступ становится возможным. Кроме того, считается, что запрет доступа при отсутствии особых указаний обеспечивает высокую степень надежности механизма защиты. Ошибка в определении полномочий пользователя в системе защиты, основанной на использовании разрешений, приводит к расширению сферы запретов. Эту ошибку легче обнаружить, и она не нарушит общего статуса защиты.
3.	Все возможные каналы утечки должны быть перекрыты. Этот принцип предполагает проверку полномочий любого обращения к любому объекту и является основой системы защиты. Задача управления доступом с учетом этого принципа должна решаться на общесистемном уровне. При этом следует учитывать-такие режимы работы, как запуск, восстановление после сбоев, выключение и профилактическое обслуживание. Необходимо обеспечивать надежное определение источника любого обращения к данным.
4.	Механизм защиты можно не засекречивать, т.е. не имеет смысла засекречивать детали реализации систем защиты, предназначенной для широкого пользования. Эффективность защиты не должна зависеть от того, насколько опытны потенциальные нарушители, так как гораздо проще обеспечить защиту списка паролей. Несекретность механизма защиты позволяет при необходимости сделать его предметом широкого обсуждения среди специалистов, не затрагивая при этом интересы пользователей.
12_____________________Глава 1______________________
5.	Разделение полномочий, т.е. применение нескольких ключей защиты. В ПЭВМ наличие нескольких ключей защиты удобно в тех условиях, когда право на доступ определяется выполнением ряда условий
6.	Минимальные полномочия. Для любой программы и любого пользователя должен быть определен минимальный круг полномочий, необходимых для выполнения порученной работы. Вследствие этого в значительной мере уменьшается ущерб, причиняемый при сбоях и случайных нарушениях.
7.	Максимальная обособленность механизма защиты. В целях исключения обмена информацией между пользователями рекомендуется при проектировании схем защиты сводить к минимуму число общих для нескольких пользователей параметров и характеристик механизма защиты.
8.	Психологическая привлекательность. Система защиты должна быть простой в эксплуатации. Естественно, чем точнее совпадает представление пользователя о системе защиты с ее фактическими возможностями, тем меньше ошибок возникает в процессе применения. Использование некоторых искусственных языков при обращении к системе защиты обычно служит источником дополнительных ошибок.
При построении систем, основанных на некоторых вышеперечисленных принципах, возникают серьезные препятствия, связанные с большими затратами на их реализацию. Поэтому важным фактором при проектировании систем защиты является их экономическая эффективность. Излишнее «утяжеление» системы дорогостоящими средствами защиты может сделать ее неконкурентноспособной.
1.2.	КЛАССИФИКАЦИЯ ВОЗМОЖНЫХ КАНАЛОВ УТЕЧКИ ИНФОРМАЦИИ В ПЭВМ
Использование ПЭВМ в военной, коммерческой и других областях человеческой деятельности порождает ряд специфических проблем, которые необходимо решить для защиты обрабатываемой и хранящейся в ПЭВМ информации. Одной из них является классификация воз-
Каналы утечки информации, хранящейся в ПЭВМ- 13 можных каналов утечки информации. Под возможным каналом утечки мы будем понимать способ, позволяющий нарушителю получить доступ к обрабатываемой или хранящейся в ПЭВМ информации [11,15]. Необходимо отметить, что цель данной книги заключается в анализе возможных каналов утечки информации, являющихся специфическими для ПЭВМ. Возможные каналы утечки информации, возникающие в построенных на основе ПЭВМ автоматизированных системах управления, передачи и обработки данных, не рассматриваются.
Классификацию возможных каналов утечки информации в первом приближении можно провести исходя из типа средства, являющегося основным при получении информации по возможному каналу утечки. Предлагается различать три типа средств: человек, аппаратура, программа.
В соответствии с каждым типом средства все возможные каналы утечки также разбиваются на три группы. Применительно к ПЭВМ группу каналов, в которых основным средством является человек, составляют следующие основные возможные каналы утечки:
•	хищение носителей информации (магнитных дисков, лент, дискет, карт);
•	чтение информации с экрана посторонним лицом (во время отображения информации на экране законным пользователем или при отсутствии законного пользователя на рабочем месте);
•	чтение информации из оставленных без присмотра распечаток программ.
В группе каналов, в которых основным средством является аппаратура, можно выделить следующие основные возможные каналы утечки:
•	подключение к устройствам ПЭВМ специально разработанных аппаратных средств, обеспечивающих доступ к информации;
•	использование специальных технических средств для перехвата электромагнитных излучений технических средств ПЭВМ.
В группе каналов, в которых основным средством является программа, можно выделить следующие основные возможные каналы утечки:
•	несанкционированный доступ программы к информации;
14 Глава 1
•	расшифровка программой зашифрованной информации; • копирование программой информации с носителей.
Настоящая книга посвящена исследованию средств защиты, обеспечивающих закрытие возможных каналов утечки, в которых основным средством является программа. Заметим, что исследуемые средства защиты позволяют в ряде случаев достаточно надежно закрыть некоторые возможные каналы утечки из других групп. Так, криптографические средства защиты позволяют надежно закрыть канал, связанный с хищением носителей информации.
Во второй, третьей и четвертой главах настоящего отчета рассматриваются средства защиты, обеспечивающие соответственно закрытие первого, второго и третьего возможных каналов из «программной» группы.
СИСТЕМЫ ЗАЩИТЫ ИНФОРМАЦИИ ОТ НСД
2.1.	ВВЕДЕНИЕ
Анализ систем защиты информации от НСД по-
казал, что они обеспечивают выполнение следующих функций:
•	идентификации защищаемых ресурсов, т. е. присвоения защищаемым ресурсам идентификаторов — уникальных признаков, по которым в дальнейшем система производит аутентификацию;
•	аутентификации защищаемых ресурсов, т.е. установления их подлинности на основе сравнения с эталонными идентификаторами;
•	разграничения доступа пользователей к ПЭВМ;
•	разграничения доступа пользователей по операциям над ресурсами (программы, данные, сектора и т. д.), защищаемыми с помощью программных средств;
•	администрирования:
определение прав доступа к защищаемым ресурсам, обработка регистрационных журналов, установка системы защиты на ПЭВМ, снятие системы защиты с ПЭВМ,
•	регистрации событий:
входа пользователя в систему,
выхода пользователя из системы,
нарушения прав доступа к защищаемым ресурсам, реакции на факты неустановления подлинности и нарушения прав доступа, т. е. инициализация ответных мер на факты НСД и неустановления подлинности;
•	контроля целостности и работоспособности систем защиты;
•	обеспечения безопасности информации при проведении ремонтно-профилактических работ;
•	обеспечения безопасности информации в аварийных ситуациях.
16
Глава 2
Контроль и разграничение доступа к ресурсам производится на основе таблиц, описывающих права пользователей и других субъектов защиты, таких как задачи, процессы и т. д., по доступу к объектам защиты или, иначе говоря, защищаемым ресурсам.
Процесс доступа к ресурсам должен контролироваться программными средствами защиты. Если запрашиваемый доступ к защищаемым ресурсам не соответствует имеющемуся в таблице прав доступа, системы зашиты регистрируют факт НСД и инициализируют соответствующую реакцию.
2.2.	СРЕДСТВА, ПОЗВОЛЯЮЩИЕ КОНТРОЛИРОВАТЬ ДОСТУП
Рассмотрим основные механизмы организации контроля доступа.
2.2.1.	Главная загрузочная запись
При загрузке с накопителя на жестком магнитном диске (НЖМД) система BIOS выполняет считывание 1-го сектора 0-го цилиндра 0-й дорожки. Этот сектор называется главной загрузочной записью — MASTER BOOT RECORD (MBR). Обычно программа, записанная в MASTER BOOT RECORD, загружает запись BOOT RECORD (BR) активного раздела. Однако можно использовать MBR для организации контроля входа в ПЭВМ.
Так как размер программы MBR невелик, то на нее можно возложить очень ограниченные функции. Например, можно попробовать «уложить» в нее вместе с основной функцией и программу проверки пароля. Однако эффективнее использовать MBR для загрузки другой, большей по объему программы. При применении стандартной разбивки НЖМД на разделы с помощью программы FDISK сектора с номером, больше или равным 3, 0-й дорожки 0-го цилиндра не используются, поэтому их можно применить для хранения большей по объему программы, выполняющей функ-
________Системы защиты информации от НСД__________17
цию контроля (2-й сектор используется на компьютерах типа PS/2 для хранения характеристик НЖМД).
Помимо этого, в записи MBR хранится первичная таблица описателей логических дисков. Изменение этой таблицы позволяет предотвратить доступ логическому диску (разделу) на уровне системы DOS при загрузке с дискеты. Таблица разделов начинается в записи MBR со смещения IBEh и содержит до четырех элементов. Структура каждого элемента приводится в таблице.
Смещение	Длина	Содержание
0	1	Признак загрузочного раздела: 80h - загрузочный, 0 - не загрузочный
1	1	Номер головки начала раздела
2	2	Номер цилиндра/сектора начала раздела в формате INT 13h
4	1	Код системы: 1 - DOS с 12-битовыми элементами FAT, 4 - DOS с 16-битовыми элементами FAT, 5 - DOS EXTENDED PARTITION, 6 - DOS с разделом больше 32 Мб (элементы FAT 16-битовые)
5	1	Номер головки конца раздела
6	2	Номер цилиндра/сектора конца раздела в формате INT 13h
8	4	Относительный номер сектора начала раздела (0-номер первого сектора 1 - номер второго сектора)
ОСЬ	4	Общее число	секторов в разделе
Конец таблицы разделов отмечается двухбайтным кодом 55h, AAh.
Следует отметить, что описатель раздела EXTENDED PARTITION в записи MBR указывает на аналогичную по структуре запись, описывающую сле
2
18
Глава 2
дующий логический диск. Таблица описания следующего логического диска может, в свою очередь, также содержать описатель следующего раздела EXTENDED PARTITION и т.д.
2.2.2.	Загрузочная запись
Первый сектор активного раздела содержит загрузочную запись BR, осуществляющую загрузку операционной системы. В начале этой записи содержится таблица параметров логического диска.
BR может использоваться для загрузки не операционной системы, а некоторой другой программы, реализующей разграничение доступа. Эта программа в свою очередь должна в конце своей работы загрузить операционную систему. Объем BR достаточен для размещения программы, реализующей загрузку произвольного файла из корневого каталога логического диска.
Модификация таблицы параметров некоторого логического диска может использоваться и для предотвращения доступа к этому логическому диску при загрузке DOS с дискеты.
2.2.3.	Командный процессор
В стандартной среде DOS в качестве командного процессора используется COMMAND.COM. Однако система допускает установку другого командного процессора по команде SHELL в файле CONFIG.SYS (см. приложение 1). С помощью нового командного процессора можно разрешить запуск только определенных программ и запретить запуск любых других. Вообще говоря, написание нового командного процессора является задачей достаточно сложной. Более простой путь — установка программы разграничения запуска задач из файла AUTOEXEC.BAT.
2.2.4.	Драйвер
Функции разграничения доступа можно реализовать с помощью драйвера устройства, определяемого в файле CONFIG.SYS. Этот драйвер может контролиро
Системы защиты информации от НСД 19
вать доступ к файлам и нестандартно определенным логическим дискам. На драйвер можно также возложить запрос пароля на вход в систему (приложение 2).
2.2.5.	Вектор прерываний
Перехват прерываний на различных этапах загрузки системы позволяет организовывать дополнительное разграничение доступа.
Перехват INT 13h дает возможность реализовывать «режим прозрачного шифрования» (РПШ) данных на НЖМД, а также запрещать доступ к НГМД и отдельным частям НЖМД. Этот режим предохраняет от копирования данных с НЖМД при загрузке DOS с дискеты. Запрет доступа к НГМД препятствует копированию файлов с НЖМД на дискету. Перехват INT 13h целесообразно осуществлять до загрузки DOS.
Перехват INT 21h и других прерываний операционной системы DOS позволяет организовывать разграничение доступа к файлам и каталогам. Перехват этих прерываний должен осуществляться после загрузки DOS.
2.3.	РЕАЛИЗАЦИЯ ФУНКЦИЙ СИСТЕМЫ РАЗГРАНИЧЕНИЯ ДОСТУПА
Система разграничения доступа должна обеспечивать выполнение следующих функций:
•	аутентификации пользователя по паролю и, возможно, по ключевой дискете;
•	разграничения доступа к логическим дискам;
•	прозрачного шифрования логических дисков;
•	шифрования выбранных файлов;
•	разграничения доступа к каталогам и файлам, включая посекторную защиту данных для выбранных файлов и запрет модификации областей FAT и DIR для выбранных файлов;
•	разрешения запуска строго определенных для пользователя программ;
2-
20
Глава 2
•	регистрации всех попыток НСД и входа/выхода пользователя в систему;
•	реакции на НСД;
•	защиты от отладчиков.
В общем случае целесообразно использовать следующую схему работы системы разграничения доступа. Она состоит из двух этапов: установки и эксплуатации.
Во время установки системы шифруются таблицы разделов в MBR и логических дисков в записи EXTENDED BOOT RECORD для предотвращения доступа к информации на логических дисках при загрузке с дискеты. При необходимости шифруются области данных на логических дисках. После этого система готова к эксплуатации.
В процессе эксплуатации MBR выполняет загрузку программы первичной настройки. Программа первичной настройки осуществляет аутентификацию, устанавливает таблицу полномочий по доступу к логическим дискам и НГМД, обеспечивает при необходимости установку программы, реализующей РПП1, и выполняет загрузку DOS.
Драйвер, загружаемый из файла CONFIG.SYS, осуществляет перехват функций системы DOS и реализует разграничение доступа к файлам й каталогам и при необходимости к нестандартно определенным логическим дискам. Во взаимодействии с программой перехвата прерывания 13h системы BIOS можно реализовать и посекторную блокировку обращения к НЖМД. Следует отметить, что при этом требуется достаточно большой объем памяти для хранения таблиц посектор-ного разграничения и, следовательно, компьютеры, имеющие достаточные для хранения этих данных размеры расширенной (EXTENDED) или дополнительной (EXPANDED) памяти.
Командный процессор, загружаемый из файла CONFIG.SYS, разрешает запуск строго определенных для данного пользователя задач.
Рассмотренная схема разделения функций системы разграничения доступа между перечисленными в разд. 2.2 средствами является наиболее рациональной и обеспечивает контроль доступа как ко всем логическим, так и физическим элементам НЖМД. Следует отметить, что реализация этих функций в полном объеме
Системы защиты информации от НСД 21
требует от разработчиков детального знания принципов построения файловой системы DOS, а также принципов ее функционирования.
На сегодняшний день не известны системы, реализующие в полном объеме все вышеперечисленные требования. Рассмотрим трудности; возникающие при выполнении некоторых функций.
Аутентификация пользователя. Для корректной аутентификации пользователя обычно требуется введение пароля, по которому происходит выбор полномочий пользователя. Целесообразно дополнительно выполнять аутентификацию пользователя по специальной, защищенной от копирования, дискете, на которой записываются дополнительные данные для организации работы пользователя (ключи шифрования данных, элементов, описывающих пользователей в таблицах полномочий; параметры доступа к сети и т.д.). Этот механизм позволяет улучшить контроль входа в систему, так как знание пароля в ряде случаев не является достаточным условием.
Режим прозрачного шифрования логических дисков. Режим прозрачного шифрования имеет смь^сл использовать только при наличии соответствующей аппаратуры, так как любые программные способы подразумевают хранение ключей в оперативной памяти во время выполнения шифрования. Следовательно, эти ключи могут быть получены несанкционированно. Справедливости ради следует отметить, что доступность ключа зависит от мощности средств защиты от отладчика.
Шифрование выбранных файлов. Шифрование выбранных файлов может осуществляться в прозрачном режиме или по требованию. В случае режима по требованию пользователь сам указывает файл, подлежащий зашифрованию, и вводит конкретные значения ключей. Для получения открытого текста пользователь должен сам выполнить аналогичную процедуру расшифрования.
В случае прозрачного режима пользователь выбирает файл или группу файлов, которые автоматически должны расшифровываться при чтении и зашифровываться при записи. Этот режим имеет ряд существенных недостатков. Во-первых, ключи шифрования хра
22
Глава 2
нятся в оперативной памяти со всеми вытекающими отсюда последствиями (см. выше). Во-вторых, всегда можно получить открытое содержимое файла, переписав его в некоторый файл, расположенный не в группе файлов прозрачного шифрования.
Разграничение доступа к каталогам и файлам. Разграничение доступа к каталогам и файлам включает в себя посекторную защиту от чтения/записи, защиту от переименования и перемещения. Для реализации этой функции необходимо хранить таблицы большого объема, описывающие полномочия по доступу к каждому сектору, и теневые таблицы FAT и DIR для проверки корректности при их перезаписывании. В общем случае эта проблема представляется трудноразрешимой из-за большого объема данных, подлежащих хранению и обработке в системе разграничения доступа.
Контроль запуска программ. Контроль запуска программ также проблематичен. Загрузка и выполнение программ могут реализовываться не средствами DOS, а средствами прерывания 13h системы BIOS (считывание файла в память, настройка таблицы адресов и передача управления этому файлу). Поэтому фактически для всех программ, запуск которых запрещен для пользователя, должен устанавливаться режим недоступности соответствующих файлов. Таким образом, функция контроля запуска программ может быть реализована за счет разграничения доступа к файлам. Если же такое разграничение по каким-либо причинам установить нельзя, то невозможно гарантировать санкционированный запуск программы, реализуя контроль на уровне DOS.
Защита от отладчиков. Защита от отладчика должна реализовываться на всех этапах работы системы. Наиболее важным является этап аутентификации пользователя. При ее выполнении до загрузки DOS желательно проверить, что ни одна программа не загружена в память, а если загружена, то не получит управления. Для этого необходимо убедиться в выполнении следующих условий:
•	все используемые программой или аппаратурой вектора прерываний указаны на области памяти ROM;
Системы защиты информации от НСД
23
•	размер памяти в области данных системы BIOS соответствует размеру памяти ПЭВМ;
•	система не запущена в режиме виртуального процессора 8086;
•	закрыта 20-я адресная линия (А20) на процессорах 80286, 80386, 80486 и т.д.
2.4.	АНАЛИЗ НЕКОТОРЫХ СИСТЕМ
Данный анализ не является исчерпывающим, так как исследуемые системы постоянно развиваются. Кроме того, разработчики систем не стремятся раскрывать принципы их построения.
LATCH — комплекс программ защиты ПЭВМ от НСД. В соответствии с рекламным проспектом этот комплекс обеспечивает безопасность данных, хранящихся на жестком диске. К сожалению, в рекламном проспекте ничего не говорится о самом принципе обеспечения безопасности данных, а только декларирован метод разграничения доступа к ПЭВМ.
В рекламном проспекте указывается, что при несанкционированном доступе происходит «зависание» ПЭВМ типа IBM PC/XT или не обнаруживаются НЖМД при выполнении программы конфигурации для ПЭВМ типа IBM PC/AT и PS/2.
Тезис о невозможности обнаружения НЖМД для ПЭВМ типов IBM PC/AT и PS/2 вызывает серьезные сомнения. Поясним это на нескольких примерах.
При использовании в ПЭВМ типа IBM PC/AT контроллеров НЖМД, например ESDI или SCSI, не требуется определение типа НЖМД в памяти CMOS, так как параметры подключенного НЖМД могут быть считаны с помощью команды контроллера. Система BIOS контроллера обеспечивает правильную установку значений соответствующих характеристик НЖМД.
В компьютерах PS/2, оборудованных шиной MCA, данные оборудования считываются из специальной области, называемой POS, в которую они помещаются с помощью программы конфигурации ПЭВМ. Разруше
24
Глава 2
ние данных области POS приводит к потере работоспособности ПЭВМ, так как после этого не может быть правильно определен режим работы шины MCA с тем или иным адаптером.
Если же имеется в виду только стандартный аппарат определения конфигурации, применяемый в системе DOS, то можно предположить, что комплекс LATCH будет работать.
В случае применения в системе РПШ, о чем в рекламе не говорится, возможность получения доступа к данным на НЖМД действительно может блокироваться.
RANK — пакет защиты от НСД. Этот пакет реализует одну из функций разграничения доступа. В соответствии с рекламой в нем осуществляется контролируемый доступ к .EXE- и .COM-файлам. Следует отметить, что вышеприведенный анализ разграничения доступа к программам ставит под серьезное сомнение возможность реализации такой функции без дополнительных мероприятий.
ASSA. Данные о системе ASSA получены из рекламных описаний, а также из беседы с разработчиками. По мнению авторов книги она является наиболее удачной разработкой. В ней реализованы практически все функции системы разграничения доступа. Отсутству- . ет лишь функция регистрации НСД. Вместе с тем системе присущ ряд недостатков, которые вообще говоря, не всегда можно рассматривать как принципиальные.
Посекторная защита реализована с помощью контроля признаков, указывающих, что обращение к секто-. ру выполняется непосредственно из системы DOS. Не заостряя внимания на том, что стопроцентность такого контроля не доказана, заметим, что подобная реализация посекторной защиты препятствует работе программ, реализующих собственный метод доступа к файловой системе (доступ с помощью областей DIR и FAT), который позволяет значительно ускорить работу программы с файловой системой по сравнению с работой со средствами DOS.
Для хранения признаков доступа к файлу используются резервные поля в элементе D1R. Это может вы
Системы защиты информации от НСД
25
звать конфликт при работе системы ASSA с версиями DOS, разработанными для ПЭВМ других фирм-производителей совместимого оборудования (COMPAQ, TANDY и т.д.) или при работе в клонах DOS. В частности, ASSA не может работать под управлением DOS фирмы Digital Research.
Разработчики системы ASSA сообщили, что реализация криптографических функций (РПШ и шифрование файлов) не базируется на общепринятых алгоритмах, и не привели доказательств криптоустойчивости реализованного в системе алгоритма.
KRYPTON. Система KRYPTON является наиболее надежной отечественной системой. Она обеспечивает защиту данных с гарантированной стойкостью и представляет собой программно-аппаратный комплекс, предназначенный для криптографической защиты данных, размещенных на НЖМД.
Аппаратура системы разработана МП «АНКАД» и включает в себя плату, на которой расположены: • две 32-разрядные однокристальные микроЭВМ, реализующие государственный стандарт шифрования данных с длиной ключа 256 бит (обе микроЭВМ работают в параллельном режиме с контролем результата, что обеспечивает высокую достоверность криптографического преобразования);
• плата ПЗУ, содержащая средства поддержки программной части системы KRYPTON, реализующая и блокировку загрузки ПЭВМ с НГМД.
Программное обеспечение системы разработано авторами книги в СП «ДИАЛОГ». Она обеспечивает функции разграничения доступа к компьютеру и логическим дискам НЖМД. Система осуществляет «прозрачное» шифрование данных на НЖМД. Суть режима «прозрачного» шифрования состоит в том, что всякое обращение к НЖМД средствами BIOS приводит к шифрования/расшифрованию данных. Скорость шифрования составляет до 100 Кб/с.
Программное обеспечение загружается во время загрузки компьютера (до загрузки DOS) и становится составной частью системы BIOS для НЖМД. При этом обеспечивается полное шифрование НЖМД, что предотвращает появление «секретного остатка» данных.
26
Глава 2
Разграничение доступа к данным реализовано посредством предъявления дискеты, содержащей криптографические ключи данных. Сами данные на дискете зашифрованы с использованием пароля пользователя. Наличие в системе внешних ключей обеспечивает стойкость, соответствующую стойкости криптоалгоритма.
Система поддерживает функции «прозрачного» шифрования данных на НГМД. В качестве ключа данных используется пароль пользователя, что обеспечивает безопасность транспортировки данных на дискетах между обслуживаемыми объектами.
Программное обеспечение содержит сервисные программы генерации парольных дискет пользователя. С помощью дополнительного программного обеспечения реализуются различные режимы доступа к логическим дискам на НГМД — чтение/запись, только чтение и недоступен.
Помимо рассмотренных на рынке имеется большое число систем типа «Вход по паролю». Однако их анализ не представляет интереса — реализации только функции аутентификации недостаточно для того, чтобы рассматривать их как системы разграничения доступа. Две такие системы приводятся соответственно в приложениях 1 и 2.
КРИПТОГРАФИЧЕСКИЕ МЕТОДЫ ЗАЩИТЫ ИНФОРМАЦИИ
3.1.	ВВЕДЕНИЕ
Защита данных с помощью шифрования — одно из возможных решений проблемы их безопасности. Зашифрованные данные становятся доступными только для того, кто знает, как их расшифровать, и поэтому похищение зашифрованных данных абсолютно бессмысленно для несанкционированных пользователей.
Коды и шифры использовались задолго до появления ЭВМ. С теоретической точки зрения не существует четкого различия между кодами и шифрами. Однако в современной практике различие между ними, как правило, является достаточно четким. Коды оперируют лингвистическими элементами, разделяя шифруемый текст на такие смысловые элементы, как слова и слоги. В шифре всегда различают два элемента: алгоритм и ключ.
Алгоритм позволяет использовать сравнительно короткий ключ для шифрования сколь угодно большого текста. Для защиты данных в ЭВМ в основном используются шифры, поэтому далее речь пойдет именно о них. Авторы не претендуют ни на роль экспертов в области криптографии, ни на детальное изложение. В этой главе будут приведены основные полезные для практики концепции криптографической защиты информации, а также обсуждены преимущества и недостатки наиболее распространенных методов защиты.
Определим ряд терминов, используемых в криптографии.
Гаммирование — процесс наложения по определенному закону гаммы шифра на открытые данные.
Под гаммой шифра понимается псевдослучайная дво
28
Глава 3
ичная последовательность, вырабатываемая по заданному алгоритму, для зашифрования открытых данных и расшифрования зашифрованных данных.
Зашифрованием данных называется процесс преобразования открытых данных в зашифрованные с помощью шифра, а расшифрованием данных — процесс преобразования закрытых данных в открытые с помощью шифра.
Шифрованием называется процесс зашифрования или расшифрования данных.
Дешифрованием будем называть процесс преобразования закрытых данных в открытые при неизвестном ключе и, возможно, неизвестном алгоритме.
Имитозащита — защита от навязывания ложных данных. Для обеспечения имитозащиты к зашифрованным данным добавляется имитовставка, которая представляет собой последовательность данных фиксированной длины, полученную по определенному правилу из открытых данных и ключа.
Ключ — конкретное секретное состояние некоторых параметров алгоритма криптографического преобразования данных, обеспечивающее выбор одного варианта из совокупности всевозможных для данного алгоритма.
Криптографическая защита — это защита данных с помощью криптографического преобразования, под которым понимается преобразование данных шифрованием и (или) выработкой имитовставки.
Синхропосылка — исходные открытые параметры алгоритма криптографического преобразования.
Уравнение зашифрования — соотношение, описывающее процесс образования зашифрованных данных из открытых данных в результате преобразований, заданных алгоритмом криптографического преобразования.
Уравнение расшифрования — соотношение, описывающее процесс образования открытых данных из зашифрованных данных в результате преобразований, заданных алгоритмом криптографического преобразования.
Под шифром понимается совокупность обратимых преобразований множества открытых данных на множество зашифрованных данных, заданных алгоритмом криптографического преобразования.
Криптостойкостью называется характеристика шифра, определяющая его стойкость к дешифрованию. Обычно эта характеристика определяется периодом времени, необходимым для дешифрования.
Системы защиты от копирования
29
3.2.	ОСНОВНЫЕ КРИПТОГРАФИЧЕСКИЕ МЕТОДЫ
3.2.1.	Шифрование с помощью датчика псевдослучайных чисел
Принцип зашифрования заключается в генерации гаммы шифра с помощью датчика псевдослучайных чисел (ПСЧ) и наложении полученной гаммы на открытые данные обратимым образом (например, при использовании логической операции «исключающее ИЛИ»).
Процесс расшифрования данных сводится к повторной генерации гаммы шифра при известном ключе и наложению такой гаммы на зашифрованные данные. Полученный зашифрованный текст является достаточно трудным для раскрытия в том случае, когда гамма шифра не содержит повторяющихся битовых последовательностей. По сути дела гамма шифра должна изменяться случайным образом для каждого шифруемого слова. Фактически если период гаммы превышает длину всего зашифрованного текста и неизвестна никакая часть исходного текста, то шифр можно раскрыть только прямым перебором (подбором ключа). В этом случае криптостойкость определяется размером ключа.
Чтобы получить линейные последовательности элементов гаммы, длина которых превышает размер шифруемых данных, используются датчики ПСЧ. На основе теории групп было разработано несколько типов таких датчиков.
В настоящее время наиболее доступными и эффективными являются конгруэнтные генераторы ПСЧ. Для этого класса генераторов ПСЧ можно сделать математически строгое заключение о том, какими свойствами обладают выходные сигналы этих генераторов с точки зрения периодичности и случайности.
Одним из хороших конгруэнтных генераторов является линейный конгруэнтный датчик ПСЧ. Он вырабатывает последовательности псевдослучайных чисел T(i), описываемые соотношением
Г(г+1) = (A*T(i)+C)modM,
где А и С — константы, Т(0)— исходная величина, выбранная в качестве порождающего числа.
30
Глава 3
Такой датчик ПСЧ генерирует псевдослучайные числа с определенным периодом повторения, зависящим от выбранных значений А и С. Значение М обычно устанавливается равным 2°, где b — длина слова ЭВМ в битах. Датчик имеет максимальный период М до того, как генерируемая последовательность чисел начнет повторяться. По причине, отмеченной ранее, необходимо выбирать числа Л и С таким образом, чтобы период М был максимальным. Как показано в книге Д.Кнута (Искусство программирования для ЭВМ.— М.: Мир, 1976. — Т.2), линейный конгруэнтный датчик ПСЧ имеет максимальную длину М тогда и только тогда, когда С — нечетное и A mod 4 = 1.
Выше было сказано, что при определенных условиях криптостойкость растет с увеличением размера ключа. Для шифрования данных с помощью датчика ПСЧ может быть выбран ключ любого размера. Например, пусть ключ состоит из набора чисел X(j) размерностьюх Ь, где /= 1, 2, ..., N. Тогда создаваемую гамму шифра G можно представить как объединение непересекающихся множеств Н(j):
G = Я(1)иЯ(2)и...иЯ(АГ),
где H(j) — множество соответствующих j-му сегменту данных и полученных на основе порождающего числа Y(j), определеного как функция от X(j) (например, ПСЧ, полученное на основе Х(j)).
Разумеется, возможны и другие, более изощренные варианты выбора порождающих чисел для гаммы шифра. Более того, гамму шифра необязательно рассматривать как объединение непересекающихся множеств. Например, гамма шифра может быть представлена в следующем виде:
G = £(1) (+) £(2) (+) ... (+) L(N).
Здесь символ (+) обозначает операцию «Исключающее ИЛИ», а множества Щ), мощность каждого из которых равна мощности гаммы, представляют собой объединение следующих множеств:
Uj) =
где V(j) и W(j) — множества нулей, H(j) — множество ПСЧ, соответствующих /-му сегменту данных. Причем мощности всех трех множеств выбраны на основе ключа исходя из того, что мощность Цj) равна мощности G.
Криптографические методы защиты информации 31
Пример простейшей программы шифрования области памяти методом гаммирования с использованием датчика псевдослучайных чисел приведен в приложении 4.
Шифрование с помощью датчика ПСЧ является довольно распространенным криптографическим методом. Во многом качество шифра, построенного на основе датчика ПСЧ, определяется не только и не столько характеристиками датчика, сколько алгоритмом получения гаммы. Один из фундаментальных принципов криптологической практики гласит: даже очень грозно выглядящие шифры могут быть чувствительны к простым воздействиям. Кроме этого, шифры могут быть легко раскрыты, когда не применяются меры предосторожности. В качестве иллюстрации данного принципа рассмотрим проблему известного исходного текста.
Перспективный с практической точки зрения шаг на пути раскрытия любого зашифрованного файла — получить часть некоторого исходного текста и соответствующую ему часть зашифрованного. Общеизвестная стандартная информация (например, гриф «СОВ. СЕКРЕТНО») часто является уязвимой. Предположим, что можно добавлять записи к файлу и проверять зашифрованный файл до и после добавления известной записи. Если гамма шифра представляет собой последовательность псевдослучайных чисел, каждое из которых может быть сгенерировано из предыдущего, то весь исходный текст можно легко восстановить из зашифрованного текста. Рассмотрим последовательность Р = р( 1р(п) из п исходных слов в файле, к которым после у-го слова, 1<у<п, добавляется новый элемент текста, содержащий w слов. В результате получается обновленный текст
р' = рЧ1),-, p'(n+w).
Очевидно, что
p’(i) = p'(i), i = 1, 2, ..., у,
р(0 = P4z+w)»—> z = У+1, у+2, ..., n.
Здесь рЧу+1)> ••• >Р (y+w) являются известными словами исходного текста.
Пусть G = g( 1), g(2) ...— последовательность слов гаммы шифра, используемых для шифрования как Р, так
32
Глава 3
и Р '. Тогда зашифрованные тексты для Р и Р ' можно представить в виде
С = с(1),	с(п),
где c(i) = p(i) (+)	= 1, 2, га;
С = с'(1),..., с'(га),
где c’(i) = р'(г) (+) г = 1, 2, .... n+w.
Теперь можно вычислить слово гаммы, которое использовалось для закрытия известного исходного текста:
g(y+l) = p'(y+i) (+) c'(y+i), i = 1 ,2 w.
Но эти слова гаммы использовались для шифрования Р. Следовательно,
рО+1) = gfcy+i) (+) c(y+z), i = 1, 2,..., w.
Видно, что дешифрование можно повторить, подставив y+w вместо у. Таким образом, все сегменты текста после позиции у могут быть дешифрованы. Легкое дешифрование текста стало возможным в связи с тем, что алгоритм шифрования не зависит ни от длины шифруемого файла, ни от содержимого самого файла. Но более или менее серьезное усовершенствование алгоритма получения гаммы шифра приводит к существенному повышению криптостойкости. Ряд таких усовершенствований уже был предложен. Хорошие результаты дает и метод гаммирования с обратной связью, который заключается в том, что для получения сегмента гаммы используется контрольная сумма определенного участка шифруемых данных. Например если рассматривать гамму шифра как объединение непересекающихся множеств H(j), то процесс шифрования данных можно представить следующими шагами:
•	определение контрольной суммы участка данных, соответствующего сегменту гаммы Н( 1);
•	генерация сегмента гаммы Н( 1) и наложение его на соответствующий участок шифруемых данных;
•	генерация с учетом контрольной суммы уже зашифрованного участка данных следующего сегмента гаммы Н(2) (обычно контрольная сумма используется в процессе генерации порождающего числа для очередного сегмента гаммы);
Криптографические методы защиты информации 33
•	подсчет контрольной суммы участка данных, соответствующего сегменту гаммы Н(2), и наложение этого сегмента гаммы на соответствующий участок шифруемых данных и т. д.
Под контрольной суммой здесь понимается функция f(t( 1), t(n)), где t(i) — i-e слово шифруемых данных. Разумеется, метод гаммирования с обратной связью может быть реализован с помощью другого алгоритма. Здесь изложены только общие принципы метода обратной связи (использование некоторых характеристик шифруемых данных для генерации гаммы).
В приложении 5 приведен текст программы, обеспечивающей шифрование одной области памяти на основе информации в другой области памяти. Эта программа может быть использована для шифрования методом гаммирования с обратной связью.
3.2.2.	DES — стандарт США на шифрование данных
Одним из наиболее распространенных криптографических стандартов на шифрование данных, применяемых в США, является DES (Data Encryption Standard) [11]. Первоначально метод, лежащий в основе данного стандарта, был разработан фирмой IBM для своих целей. Он был проверен Агентством Национальной Безопасности США, которое не обнаружило в нем статистических или математических изъянов. Это означало, что дешифрование данных, защищенных с помощью DES, не могло быть выполнено статистическими (например, с помощью частотного словаря) или математическими («прокручиванием» в обратном направлении) методами.
После этого метод фирмы IBM был принят в качестве федерального стандарта. Стандатр DES используется федеральными департаментами и агентствами для защиты всех достаточно важных данных в компьютерах (исключая некоторые данные, методы защиты которых определяются специальными актами). Его применяют многие негосударственные институты!, в том числе большинство банков и служб обращения денег. Оговоренный в стандарте алгоритм криптографической защиты данных опубликован для того, чтобы большинство пользователей могли использовать проверенный и апробированный
34
Глава 3
алгоритм с • хорошей криптостойкостью. Заметим, что, одной стороны, публикация алгоритма нежелательна, поскольку может привести к попыткам дешифрования закрытой информации. Но, с другой стороны, это не столь существенно (если стандарт сильный) по сравнению со слабыми методами защиты данных, используемыми государственными институтами. Иначе говоря, потери от публикации алгоритма криптографической защиты намного меньше, чем потеря от применения методов защиты с низкой криптостойкостью. Разумеется, стандартный алгоритм шифрования данных должен обладать такими характеристиками, чтобы его опубликование не сказалось на криптостойкости.
Подробное описание федерального стандарта на шифрование данных приведено в приложении 3.
3.2.3.	ГОСТ 28147-89 — отечественный стандарт на шифрование данных
В нашей стране установлен единый алгоритм криптографического преобразования данных для систем обработки информации в сетях ЭВМ, отдельных вычислительных комплексах и ЭВМ, который определяется ГОСТ 28147-89 [7].
Алгоритм криптографического преобразования данных предназначен для аппаратной или программной реализации, удовлетворяет криптографическим требованиям и не накладывает ограничений на степень секретности защищаемой информации.
Из-за сложности этого алгоритма здесь будут приведены только основные его концепции. Чтобы получить подробные спецификации алгоритма криптографического преобразования, следует обратиться к ГОСТ 28147-89. Безусловно, приведенный ниже материал не должен ни при каких условиях использоваться для программной или аппаратной реализации алгоритма криптографического преобразования.
При описании алгоритма используются следующие обозначения.
Если L и R — это последовательности бит, то LR будет обозначать конкатенацию последовательностей L и R. Под конкатенацией последовательностей L и R пони-
Криптографические методы защиты информации 35 мается последовательность бит, размерность которой равна сумме размерностей L и R. В этой последовательности биты последовательности R следуют за битами последовательности L. Конкатенация битовых строк является ассоциативной, т. е. запись ABCDE обозначает, что за битами последовательности А следуют биты последовательности В, затем С и т. д.
Символом (+) будет обозначаться операция побитового сложения по модулю 2, символом [+] — операция сложения по модулю двух 32-разрядных чисел. Числа суммируются по следующему правилу:
А [+ ] В = А + В если А + В 232,
А [+] В = А + В — 232, если А + В * 232.
Символам {+} обозначается операция сложения по модулю 2dZ — 1 двух 32 разрядных чисел. Правила суммирования чисел следующие:
А {+} В = А + В , если А + В 232 — 1,
А {+} В = А + В — (232 — 1), если А + В = 232 — 1.
Алгоритм криптографического преобразования предусматривает несколько режимов работы. Но в любом случае для шифрования данных используется ключ, который имеет размерность 256 бит и представляется в виде восьми 32-разрядных чисел X(i). Если обозначить ключ через W, то
W = Х(7)Х(6)Х(5)Х(4)Х(3)Х(2)Х( 1 )Х(0).
Расшифрование выполняется по тому же ключу, что и зашифрование, но этот процесс является инверсией процесса зашифрования данных.
Первый и самый простой режим — замена. Открытые данные, подлежащие зашифрованию, разбивают на блоки по 64 бит в каждом, которые можно обозначить T(j).
Очередная последовательность бит T(j) разделяется на две последовательности В(0) (левые или старшие биты) и А(0) (правые или младшие биты), каждая из которых содержит 32 бита. Затем выполняется итеративный процесс шифрования, который описывается следующими формулами:
з-
36
Глава 3
A(i) = f(A(i—\) [+] X(J) (+) 5(z-l),
B(i) = A(i-1), если i = 1, 2,	24, j = (i— 1) mod 8;
Л(0 = /(Л(г-1) [+] X(j) (+)
B(i) = A(i—1), если i = 25, 26,	31, j = 32—г;
Л(32) = Л(31), 5(32) = /(Л(31) [+] Х(0)) (+) 5(31), если г = 32.
Здесь i обозначает номер итерации (i = 1, 2,	32).
Функция f называется функцией шифрования. Ее аргументом является сумма по модулю 232 числа A(i), полученного на предыдущем шаге итерации, и числа X(j) ключа (размерность каждого из этих чисел равна 32 знакам).
Функция шифрования включает две операции над полученной 32-разрядной суммой. Первая операция называется подстановкой К. Блок подстановки К состоит из восьми узлов замены К(1)... К(8) с памятью 64 бит каждый. Поступающий на блок подстановки 32-разряд-ный вектор разбивается на восемь последовательно идущих 4-разрядных векторов, каждый из которых преобразуется в 4-разрядный вектор соответствующим узлом замены, представляющим собой таблицу из шестнадцати целых чисел в диапазоне 0... 15.
Входной вектор определяет адрес строки в таблице, число из которой является выходным вектором. Затем 4-разрядные выходные векторы последовательно объединяются в 32-разрядный вектор. Таблицы блока подстановки К содержит ключевые элементы, общие для сети ЭВМ и редко изменяемые.
Вторая операция — циклический сдвиг влево 32-раз-рядного вектора, полученного в результате подстановки К. 64-разрядный блок зашифрованных данных Тш представляется в виде
Тш = А(32)В(32).
Криптографические методы защиты информации 37
Остальные блоки открытых данных в режиме простой замены зашифровываются аналогично.
Следует иметь в виду, что режим простой замены допустимо использовать для шифрования данных только в ограниченных случаях. К этим случаям относится выработка ключа и зашифрование его с обеспечением ими-тозащиты для передачи по каналам связи или хранения в памяти ЭВМ.
Следующий режим шифрования называется режимом гаммирования. Отрытые данные, разбитые на 64-разряд-ные блоки T(i) (i = I, 2, ..., ш, 1де m определяется объемом шифруемых данных), зашифровываются в режиме гаммирования путем поразрядного сложения по модулю 2 с гаммой шифра Гш, которая вырабатывается блоками по 64 бит, т.е.
Гш = (Г(1), Г(2), ..., Г(г), ..., Г(т)).
Число двоичных разрядов в блоке Т(гп) может быть меньше 64, при этом неиспользованная для шифрования часть гаммы шифра из блока Г(т) отбрасывается.
Уравнение зашифрования данных в режиме гаммирования может быть представлено в следующем виде:
Ш(1) = A(Y(i-l) [+] С2, Z(i-l) {+} С(1) (+) T(i) = = Г(1) (+) T(i).
В этом уравнении Ш (0 обозначает 64-разрядный блок зашифрованного текста, А — функцию шифрования в режиме простой замены (аргументами этой функции являются два 32-разрядных числа), С1 и С2 — константы, заданные в ГОСТ 28147-89. Величины Y(i) и Z(i) определяются итерационно по мере формирования гаммы, следующим образом:
(Y(0), Z(0)) = A(S), где S — 64-разрядная двоичная последовательность (синхропосылка);
(Y(i), Z(i)) = (Y(i-l) [+} С2, Z(i-l) {+} C(l),
для i = J, 2,..., m.
Расшифрование данных возможно только при наличии синхропосылки, которая не является секретным элементом шифра и может храниться в памяти ЭВМ или передаваться по каналам связи вместе с зашифрованными данными.
38
Глава 4
Режим гаммирования с обратной связью очень похож на режим гаммирования. Как и в режиме гаммирования, отрытые данные, разбитые на 64-разрядные блоки T(i) (i = J, 2, т, где т определяется объемом шифруемых данных), зашифровываются- путем поразрядного сложения по модулю 2 с гаммой шифра Гш, которая вырабатывается блоками по 64 бит:
Гш - (Г(1), Г(2), ..., Г (О,	Г(т)).
Число двоичных разрядов в блоке Т(т) может быть меньше 64, при этом неиспользованная для шифрования часть гаммы шифра из блока Г (т) отбрасывается.
Уравнение зашифрования данных в режиме гаммирования с обратной связью может быть представлено в следующем виде:
Ш(1) = A(S) (+) Т(1) = Г(1) (+) Т(1),
Ш(0 = А(Ш(г-7)) (+) Т(1) = Г(1) (+) T(i)
для i = 2, 3, ..., m.
Здесь IU(i) обозначает 64-разрядный блок зашифрованного текста, А — функцию шифрования в режиме простой замены. Аргументом функции на первом шаге итеративного алгоритма является 64-разрядная синхропосылка, а на всех последующих — предыдущий блок зашифрованных данных 111(7-7,).
В ГОСТ 28147-89 определяется процесс выработки имитовставки, который единообразен для любого из режимов шифрования данных. Имитовставка — это блок из р бит (имитовставка Ир), который вырабатывается либо перед шифрованием всего сообщения, либо параллельно с шифрованием по блокам. Первые блоки открытых данных, которые участвуют в выработке имитовставки, могут содержать служебную информацию (например, адресную часть, время, синхропосылку) и не зашифровываться. Значение параметра р (число двоичных разрядов в имитовставке) определяется криптографическими требованиями с учетом того, что вероятность навязывания ложных помех равна 1/2р.
Для получения имитовставки отрытые данные представляются в виде 64-разрядных блоков T(i) (i= J, 2, ..., т, где т определяется объемом шифруемых данных).
Криптографические методы защиты информации 39
Первый блок открытых данных Т( 1) подвергается преобразованию, соответствующему первым 16 циклам алгоритма зашифрования в режиме простой замены. Причем в качестве ключа для выработки имитовставки используется ключ, по которому шифруются.данные.
Полученное после 16 циклов работы 64-разрядное число суммируется по модулю 2 со вторым блоком открытых данных Т(2). Результат суммирования снова подвергается преобразованию, соответствующему первым 16 циклам алгоритма зашифрования в режиме простой замены.
Полученное 64-разрядное число суммируется по модулю 2 с третьим блоком открытых данных Т(3) и т. д. Последний блок Т(ш), при необходимости дополненный до полного 64-разрядного блока нулями, суммируется по модулю 2 с результатом работы на шаге ш—1, после чего зашифровывается в режиме простой замены по первым 16 циклам работы алгоритма. Из полученного 64-разрядного числа выбирается отрезок Ир длиной р бит.
Имитовставка Ир передается по каналу связи или в память ЭВМ после зашифрованных данных. Поступившие зашифрованные данные расшифровываются и из полученных блоков открытых данных T(i) вырабатывается имитовставка Ир, которая затем сравнивается с имито-вставкой Ир, полученной из канала связи или из памяти ЭВМ. В случае несовпадения имитовставок все расшифрованные данные считают ложными.
3.2.4.	Системы с открытым ключом
Наиболее перспективными системами криптографической защиты данных являются системы с открытым ключом. В таких системах для зашифрования данных используется один ключ, а для расшифрования другой. Первый ключ не является секретным и может быть опубликован для использования всеми пользователями системы, которые зашифровывают данные. Расшифрование данных с помощью известного ключа невозможно. Для расшифрования данных получатель зашифрованной информации использует второй ключ, который является секретным. Разумеется, ключ расшифрования не может быть определен из ключа зашифрования.
В настоящее время наиболее развитым методом
40
Глава 3
криптографической защиты информации с известным ключом является RSA, названный так по начальным буквам фамилий ее изобретателей (Rivest, Shamir и Adleman). Перед тем как приступить к изложению концепции метода RSA, необходимо определить некоторые термины.
Под простым числом будем понимать такое число, которое делится только на 1 и на само себя. Взаимно простыми числами будем называть такие числа, которые не имеют ни одного общего делителя, кроме 1.
Наконец, под результатом операции i mod. j будем считать остаток от целочисленного деления i на /. Чтобы использовать алгоритм RSA, надо сначала сгенерировать открытый и секретный ключи выполнив следующие шаги.
1. Выберем два очень больших простых числа р и q.
1. Определим п как результат умножения ря& q(n = р* q).
3.	Выберем большое случайное число, которое назовем d. Это число должно быть взаимно простым с результатом умножения (р — !)*(</ — 1).
4.	Определим такое число е, для которого является истинным следующее соотношение (е * d) mod ((р — 1) * <q — 1» = 1.
5.	Назовем открытым ключом числа е и п, а секретным ключом — числа d и п.
Теперь, чтобы зашифровать данные по известному ключу {е, л}, необходимо сделать следующее:
•	разбить шифруемый текст на блоки, каждый из которых может быть представлен в виде числа M(i) = О, 1, ..., п-1;
•	зашифровать текст, рассматриваемый как последовательность чисел M(i) по формуле C(i) = (M(if) mod п. Чтобы расшифровать эти данные, используя секретный ключ {d, п}, необходимо выполнить следующие вычисления: M(i) = (C(i)a) mod п. В результате будет получено множество чисел M(i), которые представляют собой исходный текст.
Приведем простой пример использования метода RSA для шифрования сообщения «САВ». Для простоты будем использовать очень маленькие числа (на практике используются намного большие числа).
Криптографические методы защиты информации 41
1.	Выберем р = 3 и q = 11.
2.	Определим п = 3 * 11 = 33.
3.	Найдем (р — 1) * (q — 1) = 20. Следовательно, в качестве d выберем любое число, которое является взаимно простым с 20, например d = 3.
4.	Выберем число е. В качестве такого числа может быть взято любое число, для которого удовлетворяется соотношение (е * 3) mod 20 = 1, например 7.
5.	Представим шифруемое сообщение как последовательность целых чисел в диапазоне 0... 32. Пусть буква А изображается числом 1, буква В — числом 2, а буква С — числом 3. Тогда сообщение можно представить в виде последовательности чисел 3 12. Зашифруем сообщение, используя ключ {7, 33}:
Cl = (З7) mod 33 = 2187 mod 33 = 9,
С2 = (I7) mod 33 = 1 mod 33 = 1,
СЗ = (27) mod 33 = 128 mod 33 = 29.
6.	Попытаемся расшифровать сообщение {9, 1, 29}, полученное в результате зашифрования по известному ключу, на основе секретного ключа {3, 33}:
Ml = (97) mod 33 = 729 mod 33 = 3,
М2 = (I7) mod 33 = 1 mod 33 = 1,
М3 = (297) mod 33 = 24389 mod 33 = 2.
Таким образом, в результате расшифрования сообщения получено исходное сообщение «САВ».
Криптостойкость алгоритма RSA основывается на предположении, что исключительно трудно определить секретный ключ по известному, поскольку для этого необходимо решить задачу о существовании делителей целого числа. Данная задача является NP-полной [8 ] и, как следствие этого факта, не допускает в настоящее время эффективного (полиномиального) решения. Более того, сам вопрос существования эффективных алгоритмов решения NP-полных задач является до настоящего времени открытым. В связи с этим для чисел, состоящих из 200 Цифр (а именно такие числа рекомендуется использовать) , традиционные методы требуют выполнения огромного числа операций (около 10 ц.
42
Глава 3
3.3.	СРАВНЕНИЕ КРИПТОГРАФИЧЕСКИХ МЕТОДОВ
Метод шифрования с использованием датчика ПСЧ наиболее часто используется в программной реализации системы криптографической зашиты данных. Это объясняется тем, что, с одной стороны, он достаточно прост для программирования, а с другой стороны, позволяет создавать алгоритмы с очень высокой криптостойкостью. Кроме того, эффективность данного метода шифрования достаточно высока. Системы, основанные на методе шифрования с использованием датчика ПСЧ, позволяют зашифровать в секунду от нескольких десятков до сотен килобайт данных (здесь и в дальнейшем все характеристики приведены для персональных компьютеров).
Однако простота метода может сыграть злую шутку с разработчиком собственного алгоритма шифрования данных. Как уже было показано выше (проблема известного текста), очень грозно выглядящий шифр может быть чувствителен к простым воздействиям. Поэтому каждый новый алгоритм шифрования данных перед его применением должен быть подвергнут всестороннему математическому, статистическому и криптографическому анализам. Только после устранения всех слабых сторон алгоритма он может использоваться для шифрования данных. В противном случае, результаты могут быть катастрофическими.
Основным преимуществом метода DES является то, что он является стандартом. Как утверждает Национальное Бюро Стандартов США алгоритм обладает следующими свойствами:
•	высокий уровень защиты данных против дешифрования и возможной модификации данных;
•	простота в понимании;
•	высокая степень сложности, которая делает его раскрытие дороже получаемой при этом прибыли;
•	метод защиты основывается на ключе и не зависит ни от какой «секретности» алгоритма;
•	экономичен в реализации и эффективен в быстродействии.
Важной характеристикой этого алгоритма является его гибкость при реализации и использовании в различных приложениях обработки данных. Каждый блок данных шифруется независимо от других, что позволяет расшифровывать отдельный блок в зашифрованном сообщении и
Криптографические методы защиты информации 43 структуре данных. Поэтому можно осуществлять независимую передачу блоков данных и произвольный доступ к зашифрованным данным. Ни временная, ни позиционная синхронизация для операций шифрования не нужна.
Алгоритм вырабатывает зашифрованные данные, в которых каждый бит является функцией от всех битов открытых данных и всех битов ключа. Различие лишь в одном бите данных дает в результате равные вероятности изменения для каждого бита зашифрованных данных.
Конечно, эти свойства DES выгодно отличают его от метода шифрования с использованием датчика ПСЧ, поскольку большинство алгоритмов шифрования, построенных на основе датчиков ПСЧ, не характеризуются всеми преимуществами DES. Однако и DES обладает рядом недостатков.
Самым существенным недостатком DES специалисты признают размер ключа, который считается слишком малым. Стандарт в настоящем виде не является неуязвимым, хотя и очень труден для раскрытия (до сих пор не были зарегистрированы случаи дешифрования информации, зашифрованной с использованием метода DES). Для дешифрования информации методом подбора ключей достаточно выполнить 2° ° операций расшифрования (т. е. всего около 7 * (101 ”) операций). Хотя в настоящее время нет аппаратуры, которая могла бы выполнить в обозримый период времени подобные вычисления, никто не гарантирует, что она не появится в будущем. Некоторые специалисты предлагают простую модификацию для устранения этого недостатка: исходный текст Р зашифровывается сначала по ключу К1, затем по ключу К2 и, наконец, по ключу КЗ. В результате время, требующееся для дешифротания, возрастает до 21”8 операций (приблизительно, до 1034 операций).
Еще один недостаток метода DES заключается в том, что отдельные блоки, содержащие одинаковые данные (например, пробелы), будут одинаково выглядеть в зашифрованном тексте, что с точки зрения криптоанализа неправильно.
Метод DES может быть реализован и программно. В зависимости от быстродействия и типа процессора персонального компьютера программная система, шифрующая данные с использованием метода DES, может обрабатывать от нескольких килобайт до десятков килобайт данных в секунду. В то же время необходимо отметить, что базовый алгоритм все же рассчитан на реализацию в электронных устройствах специального назначения.
44
Глава 3
Алгоритм криптографического преобразования, являющийся отечественным стандартом и определяемый ГОСТ 28147-89, свободен от недостатков стандарта DES и в то же время обладает всеми его преимуществами. Кроме того, в стандарт уже заложен метод, с помощью которого можно зафиксировать необнаруженную случайную или умышленную модификацию зашифрованной информации.
Однако у алгоритма есть очень существенный недостаток, который заключается в том, что его программная реализация очень сложна и практически лишена всякого смысла из-за крайне низкого быстродействия. По оценкам авторов, за одну секунду на персональном компьютере может быть обработано всего лишь несколько десятков (максимально сотен байт) байт данных, а подобная производительность вряд ли удовлетворит кого-либо из пользователей. Хотя сейчас уже разработаны аппаратные средства, реализующие данный алгоритм криптографического преобразования данных, которые демонстрируют приемлемую производительность (около 70 Кб/с для IBM PC АТ с тактовой частотой 12 Мгц), все же складывается впечатление, что разработчики алгоритма совершенно не заботились об эффективности его программной реализации и о стоимости шифрования данных.
Теперь остановимся на методе RSA. Он является очень перспективным, поскольку для зашифрования информации не требуется передачи ключа другим пользователям. Это выгодно отличает его от всех вышеописанных методов криптографической защиты данных. Но в настоящее время к этому методу относятся с подозрительностью, поскольку в ходе дальнейшего развития может быть найден эффективный алгоритм определения делителей целых чисел, в результате чего метод шифрования станет абсолютно незащищенным. Кроме того, не существует строгого доказательства, что не существует другого способа определения секретного ключа по известному, кроме как определения делителей целых чисел.
В остальном метод RSA обладает только достоинствами. К числу этих достоинств следует отнести очень высокую криптостойкость, довольно простую программную и аппаратную реализации. Правда, следует заметить, что использование этого метода для криптографической защиты данных неразрывно связано с очень высоким уровнем развития вычислительной техники.
СИСТЕМЫ ЗАЩИТЫ ОТ КОПИРОВАНИЯ
4.1. ВВЕДЕНИЕ
В настоящее время в стране практически отсутствует законодательство, защищающее авторские права программистов. Кроме этого, сформировались прочные традиции «приобретения» новых программ. В результате программное обеспечение не покупается, а воруется. Раз выпустив на рынок незащищенную от копирования программу, производитель может навсегда распрощаться с доходами. Это приводит к медленному развитию рынка программного обеспечения. Системы защиты от копирования предотвращают использование ворованных копий программного обеспечения и являются в настоящее время единственно надежным средством, как защищающим авторские права программистов-разработчиков, так и стимулирующим развитие рынка. Под системой защиты от копирования понимается система, которая обеспечивает выполнение программой своих функций только при опознании некоторого уникального некопируемого элемента. Таким элементом (называемым ключевым) может быть дискета, определенная часть компьютера или специальное устройство, подключаемое к ПЭВМ. В дальнейшем наше внимание будет сосредоточено в основном на системах защиты, использующих в качестве некопируе-мых элементов дискеты. Разработка таких систем является делом достаточно сложным и требует определенной квалификации и опыта.
На формирующемся рынке программного обеспечения существует ряд систем, предназначенных для защиты программного обеспечения от копирования. Некоторые из этих систем не являются оригинальной отечественной разработкой и, как правило, используются несанкционированно (системы защиты скопированы с помощью соответствующей аппаратуры или программ копирования),. Использование таких копий фактически препятствует
46
Глава 4
продаже защищенного программного обеспечения на внешний рынок. К тому же для большинства импортных систем защиты от копирования существуют средства снятия защиты (также импортного производства).
Материалом для написания этой главы помимо системы CERBERUS (собственной разработки авторов) послужили следующие отечественные системы защиты от копирования: SUPER GUARD и GUARD (разработчик Kami), НОТА (Новинтех), STAS-3 (Слот), SHIELD и CONVOJ (Элиас), ALFA-2.05 (Анкад), ЕСР (ЦЭИ МФТИ), FILE_PROTECTION (Новекс), DEFENSE (Мультибайт), PROTECT (ПласТОП), INST_FD (разработчик не известен) и др.
В настоящее время в нашей стране отсутствует общепринятый термин для обозначения программного продукта, предназначенного для защиты программ от несанкционированного распространения путем изготовления копий с помощью стандартных средств DOS или иных программных средств с большими возможностями в части копирования. Авторам книги наиболее точным представляется термин «программная система защиты программ от несанкционированного копирования». Поясним назначение и смысл употребления образующих данный термин слов. Слово «программная» подчеркивает тот факт, что все функции системы реализованы на программном (а не аппаратном) уровне. Слово «система» отражает наличие в программном продукте нескольких частей, каждая из которых выполняет свою функцию, причем все части объединены для достижения одной цели защиты от несанкционированного копирования. Слово «защита» указывает на то, что реализуемые системой функции типичны для систем защиты. Слово «программ» подчеркивает то обстоятельство, что защищаются именно программы, а не данные. Слово «несанкционированный» акцентирует то, что система защищает только от этого вида копирования, но позволяет осуществить санкционированное копирование программ. Слово «копирование» указывает на действие, от выполнения которого система защищает объекты своей защиты — программы.
Вместе с тем, несмотря на точность, термин «программные системы защиты от несанкционированного копирования» является достаточно громоздким. Вследствие этого в дальнейшем изложении используется термин «система защиты от копирования».
Системы защиты от копирования 47
Заметим, что система защиты от копирования выполняет ряд функций, являющихся общими для всех систем защиты:
•	идентификация среды, из которой будет запускаться программа;
•	аутентификация среды, из которой запущена программа;
•	реакция на запуск из несанкционированной среды;
•	регистрация санкционированного копирования;
•	противодействие изучению алгоритмов работы системы.
Под средой, из которой будет запускаться программа, подразумевается либо дискета, либо ПЭВМ (если установка происходит на НЖМД). Идентификация среды заключается в том, чтобы некоторым образом поименовать среду с целью дальнейшей ее аутентификации. Идентифицировать среду — значит закрепить за ней некоторые специально созданные или измеренные редкоповторяющиеся и трудноподделываемые характеристики — Идентификаторы. Идентификация дискет может быть проведена двумя методами.
Первый метод идентификации дискеты основан на нанесении повреждений на некоторой части поверхности дискеты. Распространенный способ идентификации дискеты, основанный на первом методе, — «лазерная дыра». При таком способе идентификации дискета прожигается в некотором месте лазерным лучом. Очевидно, что сделать точно такую же дырку в дискете-копии и в том же самом месте, как на дискете-оригинале, достаточно сложно.
Второй метод идентификации основан на нестандартном форматировании дискеты. Задача нахождения «неко-пируемого» формата является в большей степени эмпирической и ее решение основывается на глубоком понимании процесса функционирования контроллера. Реакция на запуск из несанкционированной среды обычно сводится к выдаче соответствующего сообщения. Регистрация санкционированного копирования заключается в изменении счетчика установок. Более детально эти функции рассматриваются в подразд. 3.3.1, методы идентификации среды, из которой будет запускаться программа, — в подразд. 3.3.2. Методы противодействия изучению алгоритмов работы систем защиты от копирования — в подразд. 3.3.3. Часто при рассмотрении систем защиты от копирования перечисленные функции именуются с учетом специфики этих систем.
48
Глава 4
4.2. ТЕХНИЧЕСКИЕ СВЕДЕНИЯ
В настоящем разделе рассматриваются технические сведения, необходимые в дальнейшем для понимания основных принципов работы систем защиты программ от несанкционированного копирования, а также основных принципов «взлома» этих систем. В подразд. 4.2.1 рассматриваются гибкие магнитные диски — среда, на которой размещается" и хранится защищаемая от копирования программа, приводится логическая структура дорожки в формате IBM System 34 Format. В подразд. 4.2.2 содержится описание контроллера 82077 фирмы Intel, даются рекомендации по его программированию. В подразд. 4.2.3 приводится описание программы DISK EXPLORER, позволяющей исследовать логическую структуру дискеты. В подразд. 4.2.4 рассматриваются программные средства копирования дискет DISKCOPY и COPYIIPC.
4.2.1.	Гибкие магнитные диски (дискеты)
В настоящее время для IBM-совместимых ПЭВМ используются гибкие магнитные диски двух размеров — диаметром 5,25 и 3,5". Дискеты 5,25” выпускаются для работы с форматами, обеспечивающими объем 360К (двойная плотность) или 1,2М (высокая плотность). Дискеты 3,5" выпускаются для работы с форматами, обеспечивающими объем 720К (двойная плотность) или 1,44М (высокая плотность).
Дискета			Формат	
Размер	Емкость	Цилиндр	Г ОЛОВКИ	Секторы
5,25"	360 К	40	2	9
5,25"	1,2 М	80	2	15
3,5"	720 К	80	2	9
3,5"	1,44 М	80	2	18
Рассмотрим подробно физическую структуру формата данных дискеты. Структура приводится в соответствии с
Системы защиты от копирования
49
форматом IBM System 34 Format (способ записи MFM), используемый в IBM-совместимых контроллерах гибких дисков.
Каждая дорожка состоит из записей трех типов:
•	начало дорожки;
•	сектор на дорожке;
•	конец дорожки.
На отформатированной дорожке содержится по одной записи начала и конца дорожки и одна или несколько записей секторов. Рассмотрим структуру записей каждого типа.
НАЧАЛО ДОРОЖКИ
GAP4A	SYNC	IAM	GAP1
80х	12х	Зх	FC	50х
4Е	00	С2	4Е
GAP4 — поле, записываемое контроллером при форматировании дорожки. Содержит 80 байт заполненных шестнадцатеричным числом 4Е.
SYNC — поле, записываемое контроллером при форматировании дорожки. Содержит 12 байт заполненных шестнадцатеричным числом 00.
IAM — поле, содержащее адресный маркер начала дорожки, записываемый контроллером при форматировании дорожки. Содержит 3 байта заполненных шестнадцатеричным числом С2 со специальным нарушением последовательности бит синхронизации и шестнадцатеричное значение FC.
GAP1 — поле, записываемое контроллером при форматировании дорожки. Содержит 50 байт заполненных шестнадцатеричным числом 4Е.
СЕКТОР НА ДОРОЖКЕ
SYNC 12х 00	IOAM		С Y L	Н Е А D	S Е С	N 0	С R С	GAP2 22х 4Е	SYNC 12х 00	DATA AM		DATA	С R С	GAP3
	Зх А1	FE								Зх Al	FB F8			
SYNC — поле, записываемое контроллером при форматировании дорожки. Содержит 12 байт заполненных шестнадцатеричным числом 00.
50
Глава 4
IDAM — поле, содержащее адресный маркер идентификатора сектора, записываемый контроллером при форматировании дорожки. Содержит 3 байта заполненных шестнадцатеричным числом А1 со специальным нарушением последовательности бит синхронизации и шестнадцатеричное число FE — признак маркера идентификатора.
Следующие четыре байта содержат идентификатор сектора, включающий поля:
CYL — номер цилиндра (один байт), записывается при форматировании дорожки.
HEAD — номер головки (дорожки, один байт), записывается при форматировании дорожки.
SEC — номер сектора (один байт), записывается при форматировании дорожки.
NO — код размера сектора (один байт), записывается при форматировании дорожки. Определяет размер поля данных в секторе по формуле 128*2N (для NO = О размер поля данных 128 байт, NO = 1 — 256 байт, NO = 2 — 512 байт и т.д.).
CRC — контрольная сумма идентификатора сектора (два байта).
GAP2 — поле, записываемое контроллером при форматировании дорожки. Содержит 22 байта заполненных шестнадцатеричным числом 4Е.
SYNC — поле, записываемое контроллером при форматировании дорожки или при записи данных. Содержит 12 байт заполненных шестнадцатеричным числом 00.
DATA AM — адресный маркер данных, записывается контроллером при форматировании дорожки или при записи данных. Содержит 3 байта заполненных шестнадцатеричным числом А1 со специальным нарушением последовательности бит синхронизации и шестнадцатеричное значение FB (обычные данные) или F8 (стертые данные).
DATA — поле данных. Длина поля определяется параметром NO, как описано выше.
CRC — контрольная сумма данных (два байта).
GAP3 — поле, записываемое при форматировании дорожки. Длина поля определяется в параметрах форматирования.
КОНЕЦ ДОРОЖКИ
GAP4B
Системы защиты от копирования
51
GAP4B — поле, записываемое контроллером при форматировании дорожки. Содержит шестнадцатеричные значения числа 4Е. Длина поля определяется остатком дорожки до индексного маркера.
СТАНДАРТНЫЕ ПАРАМЕТРЫ ДЛЯ ФОРМАТОВ ДИСКЕТ
В IBM-совместимых ПЭВМ приняты стандартные параметры формата дискет, приводимые в табл. 4.1. Значение GAP3 и число секторов приводятся в десятичном формате.
Таблица 4.1
Тип дискеты	Размер сектора	GAP3	Число секторов на дорожке
5,25"/360	NO = 2 (512К)	80	9
5,25"/1,2	NO = 2 (512К)	84	15
3,5'7720	NO = 2 (512К)	80	9
3,5'71,44	NO = 2 (512К)	108	18
4.2.2.	Контроллер НГМД
В IBM-совместимых ПЭВМ применяются различные типы контроллеров, которые выполняют одинаковые функции. К каждому контроллеру можно подключить до двух накопителей. Ниже приводится описание интегрированного контроллера 82077 фирмы INTEL. Этот контроллер может быть применен во всех классах ПЭВМ фирмы IBM, включая PS/2. При описании контроллера дополнительно будут указываться особенности использования регистров и команд для различных типов IBM-совместимых ПЭВМ.
РЕГИСТРЫ КОНТРОЛЛЕРА
Адреса регистров контроллера НГМД для IBM-совместимых ПЭВМ находятся в диапазоне 3F0...3F7. В табл. 4.2 приводятся относительные адреса и условные найме-
52
Глава 4
нования регистров НГМД. Адрес порта ввода/вывода регистра вычисляется путем сложения базового адреса (3F0) с относительным адресом. Ряд регистров, имеющихся в контроллере 82077, не описывается, так как они не используются в IBM-совместимых ПЭВМ. В поле «Режим доступа» приняты следующие обозначения: R — регистр можно читать; W — в регистр можно записывать.
Таблица 4.2
Адрес	Режим доступа	Наименование
0	R	SRA - Регистр состояния А
1	R	SRB - Регистр состояния В
2	W	DOR - Регистр управления
4	R	MSR - Основной регистр состояния
5	R/W	DR - Регистр данных
7	R	DIR - Регистр сигналов входа
7	W	CCR - Регистр конфигурации
РЕГИСТР СОСТОЯНИЯ A (SRA)
Этот регистр используется только на ПЭВМ серии PS/2, оборудованных шиной MCA. На других ПЭВМ он не используется. Регистр имеет следующую структуру: бит 7 — контроллер хранит прерывание, бит 6 — установлен второй накопитель.' бит 5 — выполняется установка, бит 4 — сигнал «Дорожка 0», бит 3 — сигнал «Головка 1», бит 2 — сигнал обнаружения индекса, бит 1 — сигнал «Запись запрещена», бит 0 — направление перемещения головок.
Биты 6, 4, 2 и 1 отображают состояние сигналов от накопителя.
Системы защиты от копирования
53
РЕГИСТР СОСТОЯНИЯ В (SRB)
Этот регистр используется только на ПЭВМ серии PS/'2, оборудованных шиной MCA. На других ПЭВМ он не используется. Регистр имеет следующую структуру: биты 7, 6 — зарезервированы, бит 5 —	выбор номера накопителя,
бит 4 —	выполняется запись,
бит 3 —	выполняется чтение,
бит 2 —	запись разрешена,
бит 1 —	включен мотор накопителя 1,
бит 0 —	включен мотор накопителя 2.
РЕГИСТР УПРАВЛЕНИЯ (DOR)
Этот регистр используется на ПЭВМ всех классов. Регистр предназначен для управления накопителями. Регистр имеет следующую структуру: биты 7, 6 — зарезервированы, бит 5 —	включить мотор накопителя 1,
бит 4 —	включить мотор накопителя О,
бит 3 — разрешение работы с прерываниями и с DMA (1 — передача прерываний в систему и работа с DMA разрешены; для PS/2 всегда 1), бит 2 — сброс контроллера (0 — сброс, 1 — контроллер доступен), бит 1 — зарезервирован, бит 0 — выбор накопителя (0 — НГМД 0; 1 — НГМД 1).
На ряде контроллеров НГМД, например на компьютерах класса PS/2, бит 3 не играет никакого значения, так как аппаратное включение контроллера всегда устанавливает режим работы с передачей прерываний в систему и использование DMA.
ОСНОВНОЙ РЕГИСТР СОСТОЯНИЯ (MSR)
Этот регистр предназначен для определения разрешения и направления передачи данных между микропроцессором и контроллером. Регистр имеет следующий формат: бит 7 —	если 1, то передача данных разрешена,
бит 6 —	если 1, то направление передачи данных от
контроллера к микропроцессору,
54
Глава 4
О —	направление передачи данных от микропро-
цессора к контроллеру,
бит 5 —	если 1, то контроллер не в режиме DMA,
бит 4 —	если 1, то выполняется команда чтения/за-
писи,
биты 3, 2 — зарезервированы,
бит 1 —	если 1, то накопитель 1 в режиме установки,
бит 0 —	если 1, то накопитель 2 в режиме установки.
РЕГИСТР ДАННЫХ (DR)
Через этот регистр передается байт данных между микропроцессором и контроллером. Разрешение на прием/передачу данных и направление передачи определяется состоянием битов 7 и 6 основного регистра состояния (MSR).
РЕГИСТР СИГНАЛОВ ВХОДА (DIB)
Регистр определен только на контроллерах, поддерживающих накопители с несколькими плотностями записи/чтения. Регистр отсутствует на контроллерах базовых моделей IBM PC/XT. Этот регистр определяет смену дискеты в накопителе. Это позволяет установить необходимость выполнения процедуры выбора плотности записи/чтения (двойная или повышенная). Регистр имеет следующий формат:
бит 7 — если 1, то произошла замена дискеты, биты 6...1 — зарезервированы,
бит 0 — если 1, то выбрана двойная плотность, если О — выбрана высокая плотность.
Следует отметить, что на ряде контроллеров значение бита 0 не отражает реально выбранной плотности.
РЕГИСТР КОНФИГУРАЦИИ (CCR)
Регистр определен только на контроллерах, поддерживающих накопители с несколькими плотностями записи/чтения. Регистр отсутствует на контроллерах базовых моделей IBM PC/XT, определяет скорость передачи данных. Регистр имеет следующий формат:
Системы защиты от копирования 55
биты 7...2 — зарезервированы,
биты 1,0 — определяют скорость передачи данных, задающую плотность записи/чтения: 00 — 500 Кбит/с; 01 — 300 Кбит/с; 10 — 250 Кбит/с; 11 — зарезервировано.
СИСТЕМА КОМАНД КОНТРОЛЛЕРА НГМД
Каждая команда может состоять из трех фаз: команд, выполнения и результата. Некоторые фазы в ряде команд могут отсутствовать. В фазе команд контроллеру передаются данные, необходимые для выполнения команды. В фазе выполнения контроллер выполняет запрошенную команду. В фазе результата контроллер передает результат выполнения команды. В дальнейшем описании принимаются следующие сокращения:
С — н — R — N — EOT —	номер цилиндра, номер головки, номер сектора, код длины сектора, конец дорожки (номер последнего сектора на дорожке, число секторов на дорожке),
GPL— DTL —	длина межсекторного промежутка, длина передаваемых данных [действительно для сектора длиной 128 байт (код длины 0) ], в остальных случаях значение FF,
STO — STI — ST2 — ST3 — HDS — DS — HLT — HUT — MT —	статус регистр 0, статус регистр 1, статус регистр 2, статус регистр 3, выбор номера головки, выбор номера накопителя, время загрузки головок, время разгрузки головок, многодорожечная операция (обе дорожки цилиндра рассматриваются как непрерывный цилиндр),
NCN —	новый номер цилиндра,
56
Глава 4
PCN — текущий номер цилиндра,
SK — признак пропуска стертых данных,
SRT — интервал между последовательными сигналами на перемещение головок.
Чтение данных
Фаза
Чтение/ запись
ДАННЫЕ
D7 D6 D5 D4 D3 D2 DI DO
Примечания
Ком.
МТ 1 SK 0	0	1	1 О
Код команды
Данные сект.
Вып.
Рез.
Передача данных от от контроллера к системе Информация состояния
Данные сект.
Эта команда предназначена для чтения данных сектора в память компьютера. Команда обычно применяется для чтения данных с дискеты. По команде читаются данные, содержащие признак FB в адресном маркере данных. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
Системы защиты от копирования
57
Чтение стертых данных
Фаза	Чте-	ДАННЫЕ	
	ние/		
	за-	D7 D6 D5 D4 D3 D2 DI DO	Примечания
	пись		
Ком.	W	МТ 1 SK D 1	1	0	0	Код команды
	W	0	0	0	0	0 HDS 0 DS	
	1/		
			
	1/		
			
	1/		
			
	и		
			
	и		
			
	W		 GPL 		
	W		 DTL 		
Вып.			Передача
			данных от
			контроллера
			к системе
Рез.	R		 STO 		Информация
	R		 ST1 		СОСТОЯНИЯ
	R		 ST2 			
	R D		 С 		Данные сект.
	R		 R 		
	R		 N 			
Эта команда предназначена для чтения данных, отмеченных как стертые, в память компьютера. По команде читаются данные, содержащие признак F8 в адресном маркере данных. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
Запись данных
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 D2 DI DO	Примечания
Ком. Вып. Рез.	W W W W W W W W W R R ' R R R R R	МТ	1	0	0	0	1	0	1 0	0	0	0	0	HDS 0	DS 	 С 		—	 	 н 	 	 R 	 	 N 		—— 	 EOT 	 	 GPL 	 	 DTL 	—	 	 STO 	 	 ST1 	 	 ST2 	 	 C	 	 H 	 	 R 	 	 N		Код команды Данные сект. Передача данных от контроллера к системе Информация состояния Данные сект.
58
Глава 4
Эта команда предназначена для записи данных сектора из памяти компьютера. Команда обычно применяется для записи данных на дискету. По команде записываются данные, содержащие признак FB в адресном маркере данных. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
Запись стертых данных
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 D2 DI DO	Примечания
Ком. Вып. Рез.	W W W W W W W W W R R R R R R R	МТ	1	0	0	1	0	0	1 0	0	0	0	0	HDS 0	DS г	Код команды Данные сект. Передача данных от контроллера к системе Информация состояния Данные сект.
		ц	
		11 О	
		к kJ	
		п РПТ	
		L.U 1 CPI	
		UI L ПТ1	
		U 1 L СТ Л	
		«А 1 U CTi	
		j 1 X СТ7	
		Г	
		Ь Ц	
		Г1 о	
		к и	
			 п	
Эта команда предназначена для записи стертых данных, из памяти компьютера. По команде записываются данные, содержащие признак F8 в адресном маркере данных. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
Системы защиты от копирования
59
Чтение дорожки
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 D2 DI D0	Примечания
Ком.	W W W W W W W W W R R R R R R R	0	1	0	0	0	0	1	0 0	0	0	0	0	HDS 0	DS 	 С 		Код команды Данные сект.
Вып. Рез.			 R 	 	 N 	 	— EOT 	 	 GPL 	 	 DTL 		Передача данных от контроллера к системе Информация состояния Данные сект.
		1 и 	 STI 	 	ST2	 	c	 	н 	 	R	 	N		
Эта команда предназначена для чтения данных со всей дорожки. По этой команде контроллер сразу после обнаружения индекса начинает читать данные из секторов в непрерывный буфер. Если обнаруживается ошибка в поле адресного маркера идентификатора или поле данных, то контроллер продолжает выполнение команды, устанавливая соответствующие признаки ошибки при завершении команды. Контроллер сравнивает значение идентификатора сектора, заданное в команде, с прочитанными адресными маркерами секторов и, если сектор не найден, то устанавливает признак ND в ST1. Команда завершается, когда прочитано число секторов, заданное в поле EOT команды. Если ни один адресный маркер идентификатора на дорожке не найден, то признак IC в ST0 устанавливается в 01 и признак МА в ST1 — в 1. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
60
Глава 4
Форматирование дорожки
Эта команда предназначена для форматирования дорожки. Параметр N определяет код размера сектора. SC — число секторов, которое требуется записать на дорожку, GPL — размер GAP3, D — значение, записываемое в поле данных каждого сек-Гора. Во время фазы выполнения должны передаваться значения С, Н, R и N для каждого сектора. Эти значения заносятся в адресный маркер идентификатора. Команда начинает выполняться при обнаружении индекса и прекращает выполняться при повторном обнаружении индекса. Рекомендуемые значения поля GPL приводятся в табл. 4.3.
Системы защиты от копирования
61
Чтение идентификатора
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 03  D2 DI D0	Примечания
Ком. Вып. Рез.	W W R R R R R R R	0	10	0	10	10 0	0	0	0	0 HDS 0 DS стл	Код команды Читается первый встреченный идентификатор сектора не содержащий ошибок Информация состояния
		о 1 U СТ1	
			
		и 1 С г	Данные идентификатора сектора
		ц	
			R	 	 N 		
Эта команда предназначена для определения местоположения головок. В фазе результата передаются данные прочитанного идентификатора сектора, который встретился первым и прочитан без ошибок.
Рекалиброватъ
Фаза	Чтение/ запись	D7	D6	ДАННЫЕ				D1	D0	Примечания
				D5	04	D3	D2			
Ком.	W	0	0	0	0	0	1	1	1	Код команды
Вып.	W	0	0	0	0	0	0	0	DS	Г ОАОВКИ перемещаются к цилиндру 0
62
Глава 4
Эта команда предназначена для установки начального положения головок. Она обязательно должна выполняться после сброса контроллера. По команде контроллер начинает выдавать сигналы управления перемещением головок. Команда завершается при обнаружении сигнала «Дорожка 0» со стороны привода, либо после выдачи 77 сигналов перемещения головок. Команда не имеет обычной фазы результата. Результат выполнения команды должен быть получен по команде «Получить результат прерывания».
У становшпъ
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 02 DI D0	Примечания
Ком. Вып.	W W	0	0	0	0	0	1	1	1 0000000 DS	Код команды Головки перемещаются к цилиндру 0
Эта команда предназначена для установки головок на требуемый цилиндр. По команде контроллер начинает выдавать сигналы управления перемещением головок. В зависимости от текущего положения головок сигналы выдаются для перемещения в прямом либо в обратном направлении. Число сигналов определяется разницей между текущим и требуемым номерами цилиндра. Команда не имеет обычной фазы результата. Результат выполнения команды должен быть получен по команде «Получить результат прерывания».
Следующая после «Установить» команда работы с носителем (чтение/запись/форматирование) должна выдаваться не ранее определенного временного интервала, необходимого для успокоения головок, которое составляет не менее 15-20 мс.
Системы защиты от копирования
63
Получить результат прерывания
Фаза	Чтение/ запись	D7	D6	D5	ДАННЫЕ				Примечания
					D4 D3	D2	D1	D0	
Ком.	W	0	0	0	0	1	0	0	0	Код команды
	W	0	0	0	0	0	HDS	0	DS	
Рез .	R		—		— STO —				Информация
	R				— PCN —				СОСТОЯНИЯ
Эта команда предназначена для получения результата прерывания после выполнения команд «Рекалибро-вать» и «Установить». Команда используется и для снятия результата прерывания после программного сброса контроллера. Результат завершения команды передается в STO в признаках IC и SE. Признак SE устанавливается равным 1 после команд «Рекалибровать» и «Установить». Признак IC = 00 при успешном завершении команды «Рекалибровать» или «Установить», признак IC = 01 при неуспешном завершении этих команд. Команда не имеет фазы выполнения и данные результата читаются сразу после выдачи команды.
Получить состояние устройства
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 D2 DI D0	Примечания
Ком. Рез.	W W R	0	0	0	0	0	1	0	0 0	0	0	0	0	HDS 0	DS 	 ST3 		Код команды Информация состояния
Эта команда предназначена для определения ST3, содержащего значения сигналов по некоторым линиям контроллер — НГМД. Команда не имеет фазы выполнения и данные результата читаются сразу после выдачи команды.
64
Глава 4
Определить
Фаза	Чтение/ запись	ДАННЫЕ D7 D6 D5 D4 D3 D2 DI 00	Примечания
Ком.	W W W	0	0	0	0	0	0	1	1 	 SRT 	 	 HUT 	 	 HLT 	 ND	Код команды
Эта команда предназначена для программирования внутренних таймеров контроллера. Параметр SRT определяет время между сигналами управления перемещением головок, HUT — время разгрузки головок, HLT — время загрузки головок. Параметр ND задает режим работы контроллера с DMA. Единичное значение этого бита определяет режим работы без DMA. Команда не имеет фаз выполнения и результата.
Для каждого типа НГМД и типа применяемой дискеты используются свои значения параметров команды «Определить». В табл. 4.3 приводятся значения первого и второго байтов команды для различных типов НГМД и дискет. Значение бита ND установлено в 0. В табл. 4.3 приводятся значения скорости передачи данных для установки в регистре конфигурации (CCR) и размеры GPL для команд чтения/записи и форматирования. Все значения даются в шестнадцатеричном формате.
Таблица 4.3
Тип НГМД	Тип дискеты	SRT+ нит	HLT	Скорость регистр CCR	GPL	
					чтение/ запись	формат
5,25’7360	360К	DF	02	02	 2А	50
5,25’71,2	360К	DF	02	01	2А	50
5,25'71,2	1,2М	DF	02	00	1В	54
3,5’7720	720К	DF	02	02	2А	50
3,5'71.44	720К	DF	02	02	2А	50
3,5'71.44	1.44М	AF	02	00	1В	6С
Системы защиты от копирования
65
РЕГИСТРЫ СОСТОЯНИЯ
В табл. 4.4 — 4.7 приводятся значения бит в регистрах состояния STO, STI, ST2 и ST3.
РЕГИСТР СОСТОЯНИЯ О (STO)
Таблица 4.4
Номер бита	Обозначение	Наименование	Описание
7.6	IC	Interrupt code ( код прерывания)	00-нормальное завершение. 01-ненормальное завершение. 10-недействительная команда, 11-зарезервировано
5	SE	Seek end (завершение установки)	Завершена команда "Рекалибровать" или "Установить"
4	ЕС	Equipment check ( сбой оборудования)	Установлен в 1, если при выполнении команды "Рекалибровать" после 77 сигналов управления перемещением головок не получен сигнал "Дорохка 0"
3			Не используется
2	HD	Head Adress ( Номер головки)	Номер выбранной головки
1.0	DS	Drive select ( номер НГМД)	Номер выбранного НГМД
66
Глава 4
РЕГИСТР СОСТОЯНИЯ 1 (ST1)
Таблица 4.5
Номер бита	Обозначение	Наименование	Описание
7	EN	End of cylinder (конец цилиндра )	Установлен в 1 при попытке получить доступ к сектру за последним сектором на цилиндре
6			Не используется
5	DE	Data Error (ошибка в данных)	Ошибка контрольной суммы (CRC) в поле данных или в адресном маркере сектора
4	OR	Overrun (перегрузка)	Установлен в 1, если запрос контроллера не обслухен со стороны CPU или DMA за определенный период времени
3			Не используется
2	ND	No data (нет данных)	Равен 1 в следующих случаях: - не найден запрошенный сектор в командах чтения, - адресный маркер сектора не мохет быть прочитан без ошибки в команде "Чтение идентификатора", - не найден сектор, определенный в команде "Чтение дорохки"
1	NW	Not writable (запись невозмохна)	Равен 1, если активен сигнал "Защита записи" со стороны НГМД при выполнении команд записи или форматирования
0	МА	Missing adress mark (нет адресного маркера )	Равен 1 в следующих случаях: -не найден адресный маркер сектора при повторном обна-рухении индекса, -не найден адресный маркер данных - бит MD в ST2 такхе устанавливается в 1
Системы защиты от копирования
67
РЕГИСТР СОСТОЯНИЯ 2 (ST2)
Таблица 4.6
Номер бита	Обозначение	Наименование	Описание
7			Не используется
6	см	Control mark (управляющий маркер)	Установлен в 1 при попытке получить доступ к сектору с отметкой стертые данные по команде "Чтение данных"
5	DD	Data error in data field (ошибка в поле данных >	Ошибка контрольной суммы (CRC) в поле данных
4	WC	Wrong cylinder (неправильный цилиндр	Установлен в 1, если внутренний номер цилиндра контроллера не совпал с номером цилиндра из идентификатора сектора
3			Не используется
2			Не используется
1	ВС	Bad cylinder (плохой цилиндр	Установлен в 1. если внутренний номер цилиндра контроллера не совпал с номером цилиндра из идентификатора сектора и равен FF. При этом установлен бит ND
0	MD	Missing data Adress mark ( нет адресного маркера данных)	Равен 1, если во время выполнения команд чтения не найден адресный маркер данных
68
Глава 4
РЕГИСТР СОСТОЯНИЯ 3 (ST3)
Таблица 4.7
Номер бита	Обозначение	Наименование	Описание
7			не используется
6	WP	Write protect (защита записи)	Установлен в 1 сигнал "Защита записи” со стороны НГМД
5			Не используется
4	то	Track 0 (дорохка 0)	Установлен в 1 сигнал "Дорохка 0" со стороны НГМД
3			Не используется
2	HD	Head adress (номер головки)	Номер выбранной головки со стороны НГМД
0,1			Не используется
РЕКОМЕНДАЦИИ ПО ПРОГРАММИРОВАНИЮ
В дальнейшем изложении будет предполагаться, что контроллер DMA работает в режиме прерываний. Этот режим всегда используется в IBM-совместимых ПЭВМ. Подразумевается, что установлен в 1 бит 3 в регистре управления DOR и установлен в 0 бит ND в команде «Определить».
Настоятельно рекомендуется выполнять команду JMP $+2 после каждой команды записи в порты контроллера НГМД.
Работа с регистром данных. Передача данных в контроллер через регистр данных (3F5) возможна только в случае, когда в основном регистре состояния (3f4) бит 7 установлен в 1, а бит 6 — в 0.
Прием данных из контроллера через регистр данных
Системы защиты от копирования
69
(3F5) возможен только в случае, когда в основном регистре состояния (3f4) бит 7 установлен в 1, а бит 6 — в 1.
Между операциями чтения/записи регистра данных (3F5) необходима временная задержка для выполнения внутренних операций контроллера. Минимально допустимая задержка называется временем восстановления БИС контроллера и составляет 23 мкс. В компьютерах IBM PC/AT и PS/2 система BIOS использует для отсчета задержки временной цикл регенерации памяти. При этом длительность задержки составляет 35... 45 мкс.
Особенности обработки прерываний для ЭВМ PS/2 с шиной MCA. На ПЭВМ класса PS/2 с шиной MCA обработка прерывания от контроллера НГМД не должна завершаться командой EOI, так как контроллер НГМД сохраняет запрос на прерывание после того, как оно произошло. Запрос на прерывание снимается после выдачи команд IN/OUT в порты контроллера НГМД. Команда EOI должна выдаваться, когда бит 7 в статус регистре A (SRA) станет равным 0.
Инициализация контроллера. Перед началом работы с НГМД рекомендуется выполнить сброс контроллера и осуществить установку начальных значений. Этот процесс рассматривается при условии, что бит 3 регистра DOR устанавливается в 1, т. е. используется работа с прерываниями.
Перед сбросом контроллера необходимо установить требуемые значения скорости передачи в регистре конфигурации (CCR — 3F7), если регистр используется в контроллере. После записи в регистр конфигурации прерываний не происходит.
Сброс контроллера осуществляется в следующей последовательности.
1.	Устанавливается в 0 бит 2 регистра DOR (остальные биты устанавливаются в зависимости от выбранного номера НГМД).
2.	Выполняется задержка на время не менее времени восстановления БИС контроллера.
3.	Устанавливается в 1 бит 2 регистра DOR (остальные биты устанавливаются в зависимости от выбранного номера НГМД).
4.	Выполняется ожидание прерывания от контроллера.
70
Глава 4
5.	Четыре раза выполняется команда «Получить результат прерывания». Четырехкратное выполнение команды объясняется тем, что контроллер дает состояние сброса для четырех устройств. После каждой команды «Получить результат прерывания» в регистре STO должно содержаться двоичное значение ПООООхх, где хх принимают значения 00, 01, 10 и 11, т. е. индицируют номер устройства. Наличие других значений указывает на неисправность контроллера.
После сброса выполняется команда «Определить» для программирования внутренних таймеров контроллера. Команда «Определить» не вызывает прерываний.
Если производилось включение мотора, то необходимо обеспечить ожидание времени полного раскручивания. Для НГМД, используемых в IBM-совместимых ПЭВМ это время составляет не менее 500 мс.
Команда «Рекалибовать» выполняется для установки начального положения головок. При использовании НГМД с 80 цилиндрами первая команда «Рекалибовать» может дать ошибку, если головки находились за цилиндром 77 (контроллер выдает 77 сигналов управления перемещением головок). В этом случае следует повторить команду. Повторная ошибка указывает на неисправность НГМД.
На этом инициализация завершена и можно начинать работу с НГМД.
ОРГАНИЗАЦИЯ РАБОТЫ С КОНТРОЛЛЕРОМ DMA
В ряде команд контроллера (чтение/запись/форматиро-вание) во время фазы выполнения происходит обмен данными между контроллером и основной системой. Аппаратура IBM-совместимых ПЭВМ позволяет использовать средства DMA с целью организации этого обмена. Для работы с контроллером НГМД выделен второй канал DMA. Рассмотрим регистры, необходимые для программирования DMA при работе с контроллером НГМД.
РЕГИСТР МАСОК КАНАЛОВ 0-3
Этот регистр имеет адрес 0А и следующую структуру: биты 7... 3 — зарезервированы (должен быть установлен 0),
Системы защиты от копирования 71
бит 2 — если 0, то открыть канал, если 1, то закрыть канал,
биты 1,0 — номер канала (10 для НГМД).
РЕГИСТР РЕЖИМА
Этот регистр имеет адрес 0В и следующую структуру: биты 7... 4 — зарезервированы (должен быть установлен 0, кроме бита 6, устанавливаемого в 1);
биты 3, 2 — 00 — блокировка обращения в память, 01 — запись в память, 10 — чтение из памяти, 11 — резерв,
биты 1,0 — номер канала (10 для НГМД).
Блокировка обращения в память используется для выполнения операций проверки сохранности данных в секторах без чтения данных в память.
РЕГИСТР УСТАНОВКИ ПОСЛЕДОВАТЕЛЬНОСТИ БАЙТ Запись любого значения в данный регистр определяет, что при записи/чтении 16-битовых регистров сначала передается младший байт, а потом старший. Регистр имеет адрес ОС.
РЕГИСТРЫ АДРЕСА И СТРАНИЦЫ
В этих регистрах передается полный адрес памяти, из которой будет осуществляться запись/чтение. В данной книге рассматривается работа процессора только в режиме реального адреса, когда полный адрес занимает 20 бит. Регистр адреса для второго канала задается через порт 4, а регистр страницы — через порт 81. В регистр адреса записываются младшие 16 бит 20-разрядного адреса, а в регистр страницы — старшие 4 бита. Регистр адреса 16-битовый, а регистр страницы 8-битовый.
РЕГИСТР СЧЕТЧИКА
Регистр счетчика определяет число передаваемых байтов и имеет адрес 5. В регистр записывается уменьшенное на 1 число передаваемых байтов. Регистр 16-битовый.
72
Глава 4
ПОРЯДОК РАБОТЫ С КОНТРОЛЛЕРОМ DMA Контроллер DMA необходимо запрограммировать до выдачи команды контроллера НГМД, требующей передачи данных в фазе выполнения. Порядок программирования контроллера DMA следующий:
•	закрыть канал 2;
•	установить последовательность байт (младший/стар-ший);
•	указать с помощью регистра режима соответствующий режим работы канала 2 контроллера DMA (чтение/ запись/блокировка);
•	записать значения в регистры адреса, страницы и счетчика;
•	открыть канал 2.
После этого контроллер DMA готов к взаимодействию с контроллером НГМД. Следует учитывать, что адреса данных (адрес+счетчик), передаваемых через контроллер DMA, не должны пересекать границу, адрес которой кратен 64К, т.е. сегменты lOOOh, 2000h, 3000h и т.д.
4.2.3. Программы, позволяющие исследовать дискету
В настоящем разделе будут рассмотрены некоторые функции программы DISK EXPLORER (версии апреля 1987 г.). Эта программа может быть использована как для исследования дискет, так и для создания их копий. Рассматриваемые в настоящем разделе функции программы DISK EXPLORER пригодятся в подразд. 4.5, где показывается, как с помощью программ COPYWRITE и DISK EXPLORER достаточно просто копируются ключевые дискеты, созданные некоторыми системами защиты от копирования.
Программа DISK EXPLORER обеспечивает выполнение следующих функций:
•	анализа логической структуры дорожки;
•	чтения дорожки;
•	чтения/записи секторов на дорожке;
•	создания (нестандартных) форматов дорожки;
•	короткого чтения/записи информации из сектора;
•	создания, проверки и тестирования слабых битов;
*	копирования формата дорожки одной дискеты на другую.
Системы защиты от копирования
73
Основной экран. После вызова программы на экране дисплея появляется основной экран DISK EXPLORER (рис. 4.1). В его левой части приводятся общие сведения о программе, используемых клавишах управления и авторах программы.
Disk Explorer April	1987	FUNCTION	OPTION
Technology: 360k floppy	Recover file	d:
KEYS PURPOSE	Read directory Read layout Sides Diskette type	d: d: 2 low density
F4	color Enter do function v	select	function <	>	select	option +	-	change	option	Position Analyze track Read track Other	0.0.0 detai 1 N=6 read id
Authors: Robert T McQuaid Frank Klein	License Exit to DOS Screen Color	fast
Copyright (c) 1987 Quaid Software Ltd		
Рис. 4.1
В правой части основного экрана перечисляются команды (функции), которые выполняет программа, и параметры (опции), которые необходимо определить для выполнения команды. Меню команд приводится в первом столбце правой части основного экрана, меню параметров (соответствующих каждой команде) — во втором. Выбор команды осуществляется с помощью клавиш А и v, выбор параметров для конкретной команды — с помощью клавиш < и >, изменение параметров — с помощью клавиш + и - . Для выполнения выбранной команды следует нажать клавишу Enter. Рассмотрим следующие команды:
•	Recover file — восстановить файл,
•	Diskette type — тип дискеты,
•	Position — позиция,
•	Analyze track — анализ дорожки,
74
Глава 4
•	Read track — чтение дорожки,
•	Other — другие,
•	Exit to DOS — выход в DOS.
Команда Recover file позволяет выбрать логический диск, с которым в дальнейшем будет осуществляться работа. Выбор логического диска может быть осуществлен и с помощью команд Read directory и Read layout, в которых в качестве параметра необходимо задать имя логического диска.
Команда Diskette type позволяет определить тип дискеты: high density — высокая плотность, low density — низкая плотность.
Команда Position позволяет задать адрес сектора. С помощью данной команды может определяться адрес дорожки, т.е. номера цилиндра и головки.
По команде Exit to DOS осуществляется выход в DOS.
Рассмотрим более подробно команды Analyze track, Read track и Other.
Команда Analyze Track. Команду Analyse Track можно выполнить, определив ее параметр как detail (детальный) или breif (краткий). После выполнения данной команды на экране дисплея появится окно команды Analyse Track (рис. 4.2).
								cluster
Track Analysis	pos	arc	C	H	R	N	SC	flags
	9	37.7	0	0	1	2	1	
drive:track.head a:0.0	47	37.6	0	0	2	2	1	
	84	37.7	0	0	3	2	1	
N SC GPL D kind	122	37.6	0	0	4	2	1	
2	9 80 246	160	37.7	0	0	5	2	1	
	197	37.7	0	0	6	2	1	
timing consistency +.04%	235	37.7	0	0	7	2	1	
track estimate	5826	273	37.6	0	0	8	2	1	
	310	58.7	0	0	9	2	1	
flag meaning
detail skipped
key purpose v select sector enter display sector Esc - main menu
F7	edit format
F2	read all sectors
Home/End adjacent track
Рис. 4.2
Системы защиты от копирования
75
В левой части окна содержится общая информация о прочитанной дорожке: drive:trackJiead — адрес дорожки; N — параметр, определяющий длину секторов; SC — число секторов на дорожке; GPL — длина межсекторного интервала; D — символ-заполнитель интервала. Если команда выполнена с параметром detail, то приводится расшифровка значений переменной flag в правой части окна. Если команда выполнена с параметром breif, то расшифровки этих значений (как и отображение самих значений в правой части окна) не производится.
Управляющие клавиши окна:
Л и v — select sector (выбор сектора), Enter — display sector (отображение сектора), Esc — main menu (выход в основное меню), F7 —	edit format (редактирование формата),
F2 —	read all sectors (чтение всех секторов),
Home/End — adjacent track (смежная дорожка).
В правой части окна отображаются следующие параметры:
•	С, Н, R и N, прочитанные из IDAM секторов,
•	pos и arc, определяющие относительное расположение секторов на дорожке;
•	flags — флаги, определяющие дополнительные характеристики.
Выбрав интересующий нас сектор с помощью клавиш Л и v и нажав клавишу Enter, мы попадем в окно команды select sector (рис. 4.3).
Sector Text
drive a: track 0
head 0 CHRN 001 STO, 000 1.2
F5 write sector	key purpose
F6 write with bad CRC	Esc - return
F7 write deleted data	Home/End next sector
F8 short write	F3/F4 delete/add bit
F9 write weak bits	+ other display
FlOshort deleted data	“v<> cursor 0
Alt F7 find weak bits	cFl/cF2 save/restore
Alt F8 test weak bits	cF3/cF4 swap/compare
64 128 192 256
320 384 448
Non-Sys tern disk or disk error Replace and strike any key when ready Oisk Boot failure
Рис. 4.3
76
Глава 4
Это- окно содержит четыре поля: три верхних и одно нижнее. В нижнем поле отображается информаци<>из прочитанного сектора. Верхнее левое поле содержит адрес дорожки, байты С, Н, R и N из поля ШАМ прочитанного сектора и байты состояния STO, ST1 и ST2 после операции чтения. Два других верхних поля содержат описание управляющих клавиш окна. Верхнее поле, находящееся посередине, содержит описание следующих управляющих клавиш:
F5 — write sector (записать сектор),
F6 — write with bad CRC (записать с плохим CRC), F7 — write deleted data (записать удаленные данные), F8 — short write (короткая запись)',
F9 — write weak bits (записать слабые биты),
F10 — short deleted data (короткая запись удаленных данных),
Alt F7 —find weak bits (найти слабые биты), Alt F8 —test weak bits (проверить слабые биты).
Верхнее правое поле содержит описание следующих управляющих клавиш: Esc —	return (возврат),
Нотс/End — next sector (следующий сектор), F3/F4 —	delete/add bit (удалить/добавить бит),
+ —	other display (другое отображение нижнего
окна),
~v — cursor (позиция курсора), cFl/cF2—	save/restore (сохранить/восстановить),
cF3/cF4 — swap/compare (обмен ять/сравнить).
Смысл команд, выполняемых при нажатии управляющих клавиш, следует из их названия. Ряд команд, изменяющих информацию на внешнем носителе, требует подтверждения от пользователя его намерений. После того как пользователь подтвердил свой запрос, т. е. нажал запрашиваемые программой клавиши, происходит собственно выполнение команды. Заметим, что по команде short write запись информации в сектор производится с первой позиции нижнего поля и до позиции, в которой расположен курсор. После выполнения команды расположенная после курсора информация может исказиться из-за нарушения синхронизации. Для записи слабых бит с помощью команды write weak bits необходимо предварительно указать поле, в которое предполагается записать
Системы защиты от копирования
слабые биты, и отметить байты поля буквой w. После этого следует выполнить саму команду.
Нажав управляющую клавишу F7 в окне команды Analyse track, мы перейдем в окно команды Edit format (рис. 4.4).
Edit Format
drive:track.head a:0.0
N SC GPL D kind 2	9 80 246
timing consistency +.04 X track estimate 5826
C H 0	0
0	0
0	0
0	0
0	0
0	0
0	0
0	0
0	0
R	N	SC flag
1	2	1
2	2	1
3	2	1
4	2	1
5	2	1
6	2	1
7	2	1
8	2	1
9	2	1
key
*v<>
PgUp PgDn Esc
F5 enter
purpose select field edit command edit id 's return change field format track read sector
Рис. 4.4
В левой части последнего окна отображается адрес дорожки, параметры ее форматирования N, SC, GPL и D, а также приводится описание следующих управляющих клавиш:
v, <, >, — select field (выбор поля),
PgUp — edit command (редактирование параметров команды),
PgDn — edit id s (редактирование парамет poBCHRN),
Esc —	return (возврат),
+,---- change field (изменение поля),
F5 —	format track (форматирование дорожки),
enter — read sector (чтение сектора).
В правой части окна отображается следующая информация:
•	параметры CHRN, прочитанные из IDAM;
*	число SC логических секторов в каждом секторе;
•	флаги flags.
78
Глава 4
После редактирования соответствующих полей в левой и правой частях окна команды Edit format следует нажать клавишу F5 и подтвердить свое намерение нажатием клавиш Ctrl-F.
Нажав управляющую клавишу F2 в окне команды Analyse track, мы перейдем в окно команды Read all sectors (рис. 4.5).
Sector Text
drive a:
track 0
head 0 CHRN 001 STO,1,2 000
.key purpose Esc - return Home/End next sector F3/F4 delete/add bit + other display ”v<> cursor 0 cFl/cF2 save / restore cF3/cF4 swap / compare
0 64
128 192 256 320 384 448
Non-Sys tern disk or disk error Replace and strike any key when ready Disk Boot failure
Рис. 4.5
Это окно аналогично окну команды Select sector. Единственное отличие состоит в том, что описание управляющих клавиш, находящихся в верхнем среднем поле окна Select sector, отсутствует в окне Read all sectors, и, следовательно, использовать эти клавиши нельзя.
Нажав управляющую клавишу Home/End в окне команды Analyse track, мы прочитаем предыдущую/следу-ющую дорожку, характеристики которой отобразятся в левой и правой частях окна.
Команда Read Track. По команде Read track, выполненной из основного меню программы DISK EXPLORER, осуществляется чтение всей дорожки, начиная с поля DATA — первого от индексного отверстия сектора. Окно команды Read track совпадает с окном команды Read all sectors. Параметр N при выполнении команды Read track является параметром команды «Чтение дорожки» (см. подразд. 4.2.2) Задав параметр N
Системы защиты or копирования 79
достаточно большим, эту команду можно использовать для чтения/анализа структуры дорожки, т. е. всех полей дорожки, начиная с поля DATA (первого от индексного отверстия сектора).
Другие Команды. Команда Other может быть выполнена со следующими тремя параметрами:
•	Read id (прочитать id);
*	Spin (определить скорость вращения);
*	ST3 (прочитать байт ST3).
При выполнении команды Other с параметром Read id мы переходим в окно команды Read id (рис. 4.6).
Disk Explorer	Delay	iTO	STI	ST2	c	H	R	N
April 19B7	15B0	0	0	0	0	0	8	2
	4613	0	0	0	0	0	9	2
Technology: 1,2M floppy	7185	0	0	0	0	0	1	2
	4616	0	0	0	0	0	2	2
Lap: 44554	4613	0	0	0	0	0	3	2
Degree: 459	4610	0	0	0	0	0	4	2
	4610	0	0	0	0	0	5	2
KEYS PURPOSE	461B	0	0	0	0	0	6	2
	4616	0	0	0	0	0	7	2
F4 color	4618	0	0	0	0	0	8	2
Enter do function	4614	0	0	0	0	0	9	2
v select function	7184	0	0	0	0	0	1	2
< > select option	4612	0	0	0	0	0	2	2
+ - change option	4613	0	0	0	0	0	3	2
	4611	0	0	0	0	0	4	2
	4610	0	0	0	0	0	5	2
	4614	0	0	0	0	0	6	2
Authors:	4617	0	0	0	0	0	7	2
Robert T McQuaid	4617	0	0	0	0	0	В	2
Frank Klein	4613	0	0	0	0	0	9	2
	7185	0	0	0	0	0	1	2
Copyright (c) 1987	4616	0	0	0	0	0	2	2
Quaid Software Ltd	4612	0	0	0	0	0	3	2
	4611	0	0	0	0	0	4	2
Рис. 4.6
В правом поле окна отображаются следующие параметры:
Delay —	значение задержки при чтении ID,
STO, STI, ST2 — байты состояния при чтении ID, CHRN —	значения соответствующих параметров
из ID.
80 Глава 4
Первыми в правом поле отображаются параметры того ID, который первым прошел под головками запи-си/считывания. Эти параметры отображаются в том порядке, в котором они считываются с соответствующих полей дорожки.
При выполнении команды Other с параметром Spin в нижней части основного экрана программы DISK EXPLORER отображается скорость вращения накопителя.
При выполнении команды Other с параметром ST3 в строке, соответствующей этой команде, отображается значение байта состояния ST3.
4.2.4. Программы, позволяющие копировать дискету
Методы копирования дискет. Основным признаком, по которому все методы копирования дискет можно разделить на три группы, является способ получения информации о параметрах формата дискеты:
•	получение параметров от оператора;
•	чтение параметров из заранее определенного места на дискете-оригинале;
•	определение параметров формата дискеты-оригинала с помощью ее исследования.
Авторам не известны программные средства копирования на основе первого метода. Однако идея этого метода используется для форматирования дискет.
Второй метод копирования используется достаточно многими средствами копирования, в частности программой DISKCOPY. Этот метод предназначен для копирования дискет с определенной логической структурой.
Третий метод копирования применяется в основном в программах типа COPYIIPC для получения несанкционированных копий программного обеспечения.
Далее рассматриваются основные принципы работы программных средств, основанных соответственно на втором и третьем методах.
Средства, ориентированные на определенную логическую структуру. Копирование дискет с определенной логической структурой является наиболее простой
Системы защиты от копирования
81
задачей, поскольку для копирования таких дискет нет необходимости в анализе их логической структуры. В качестве примера строго определенной логической структуры рассмотрим логическую структуру дискет, обеспечиваемую операционной системой MS/PC DOS (в дальнейшем DOS). В качестве программного средства копирования дискет возьмем программу DISKCOPY.EXE, реализующую внешнюю команду DOS DISKCOPY. Сразу отметим, что при рассмотрении логической структуры дискеты нас не будут интересовать данные, содержащиеся на дискете, т. е. мы не будем останавливаться на копировании файлов, содержащихся на дискете. Мы рассмотрим только точное повторение логической структуры дискеты и информации в рамках данной логической структуры.
Копирование дискет с определенной логической структурой заключается в последовательном считывании секторов с дискеты-оригинала и последующей записи их на дискету-копию. При этом может потребоваться операция форматирования дискеты-копии, если ее логическая структура не отвечает требуемой (например, в случае неотформатированной дискеты).
DOS обеспечивает строго определенную логическую структуру дискет, удовлетворяющую следующим требованиям:
•	размер сектора равен 512 байт, что в терминах формата дорожки означает N = 2;
•	цилиндры нумеруются от 0 до максимального номера для данного типа дискеты;
*	номера дорожек принимают значения, равные 0, для односторонних и 0 и 1 — для двусторонних дискет;
•	сектора нумеруются от 1 до максимального номера для данного типа дискеты;
•	сектор 1 на дорожке 0 цилиндра 0 по смещению 11 содержит блок ВРВ (BIOS PARAMETER BLOCK), описывающий характеристики дискеты (число цилиндров, дорожек и секторов).
Дискеты характеризуются размером и плотностью записи. Сисиема DOS поддерживает дискеты диаметром 3,5 и 5,25". Различают дискеты двойной и высокой плотности. Приведем поддерживаемые DOS форматы дискет:
82
Глава 4
•	дискеты двойной плотности, размер 5,25":
40 цилиндров, 1 сторона, 8 секторов (емкость 160К), 40 цилиндров, 1 сторона, 9 секторов (емкость 180К), 40 цилиндров, 2 стороны, 8 секторов (емкость 320К), 40 цилиндров, 2 стороны, 9 секторов (емкость 360К),
•	дискеты высокой плотности,-размер 5,25":
80 цилиндров, 2 стороны, 15 секторов (емкость 1,2М),
•	дискеты двойной плотности, размер 3,5":
80 цилиндров, 2 стороны, 9 секторов (емкость 720К),
•	дискеты высокой плотности, размер 3,5":
80 цилиндров, 2 стороны, 18 секторов (емкость 1.44М).
Поскольку информация, описывающая дискету, хранится на самой дискете, то программа DISKOPY.EXE не занимается анализом типа дискеты, а считывает характеристики дискеты из блока ВРВ.
Из описанного выше алгоритма работы можно сделать вывод, что программные средства, ориентированные на определенную логическую структуру, не позволяют скопировать дискеты со структурой, отличной от поддерживаемой ими. Так, программа DISKCOPY.EXE не может скопировать дискету, у которой сектор 1 дорожки 0 цилиндра 0 не содержит корректные данные блока ВРВ. В частности, дискеты операционной системы СР/М не могут быть скопированы этой программой. Сектор с номером, не соответствующим описанному выше формату, вообще не будет обнаружен на дорожке и, следовательно, не будет переписан.
Средства, адаптирующиеся к логической структуре данных. В отличие от программных средств, ориентированных на заранее определенную логическую структуру, средства, адаптирующиеся к логической структуре, производят анализ логической структуры дискеты. Цель анализа состоит в том, чтобы определить параметры дискеты-оригинала, для того чтобы полностью повторить их. При этом, как правило, анализ проводится на уровне структуры каждой дорожки.
В качестве программного средства, адаптирующегося к логической структуре дискеты, рассмотрим программу COPYIIPC.EXE фирмы Central Point Software. Основным назначением данной программы является создание архивных копий дискет, в тот числе защищенных от копирования.
Системы защиты от копирования
83
Копирование дискеты с произвольной логической структурой данных включает следующие этапы:
•	анализ структуры дорожек дискеты-оригинала;
•	чтение данных на дорожках дискеты-оригинала;
•	форматирование дорожек дискеты-копии с целью повторения логической структуры данных дискеты-оригинала;
•	запись данных на дорожки дискеты-копии.
Как правило, для повышения производительности объединяют первый и последние два этапа. Все этапы обычно выполняются при «ручном» копировании защищенных от копирования дискет, когда необходим тщательный анализ логической и физической структур дискеты, а также когда невозможно повторение формата дискеты-оригинала автоматизированным способом.
На этапе анализа структуры дорожек дискеты-оригинала производится анализ, аналогичный описанному в подразд. 4.5. Это означает, что выявляются:
•	идентификаторы (CHRN) секторов на дорожке;
•	геометрические характеристики секторов на дорожке (отклонение начала сектора относительно индекса, угловой размер сектора и т. п.);
•	возможные дефекты в физической структуре дорожки (например, больший размер сектора, чем определен в поле N идентификатора сектора, либо недействительное поле CRC в области маркера данных или идентификатора сектора);
•	скрытые данные (например, данные в межсекторных промежутках), которые потом считываются.
На этапе форматирования делаются попытки повторить формат дискеты-оригинала с помощью различных приемов нетандартного программирования контроллера НГМД.
Программа COPYIIPC.EXE показывает достаточно высокие результаты в повторении формата защищенных от копирования дискет, изготовленных с использованием программных способов. Неспособность повторения программой форматов некоторых систем защиты от несанкционированного копирования объясняется ограниченными возможностями анализа логической структуры дискеты автоматизированными методами и в некоторых случаях невозможностью повторения формата дискеты из-за ограниченных возможностей НГМД.
84
Глава 4
4.3.	МЕТОДЫ ПОСТРОЕНИЯ СИСТЕМ ЗАЩИТЫ ОТ КОПИРОВАНИЯ
4.3.1.	Общие принципы построения систем защиты от копирования
Несмотря на разнообразие имеющихся на отечественном рынке систем защиты от копирования, все они в той или иной мере выполняют совокупность функций (идентификация, аутентификация, реакция и регистрация нарушения), характерных для любой системы защиты. В настоящем разделе рассматриваются основные функции и исследуется структура систем защиты от копирования.
Основные функции систем защиты от копирования. Система защиты от копирования должна выполнять следующие функции:
•	создания дискет, защищенных от копирования,
•	проверки ключевой дискеты,
•	установки программ на НЖМД,
•	защиты программ от отладчика и модификации.
Рассмотрим кратко способы реализации этих функций.
Функция создания дискет, защищенных от копирования, состоит в записи на дискету информации, не копируемой обычными средствами. Наиболее эффективно данную функцию можно реализовать, использовав приемы нестандартного (с точки зрения обычного программного обеспечения) программирования контроллера НГМД. Отметим, что при выполнении этой функции не следует пользоваться стандартными функциями системы BIOS, потому что, во-первых, функции BIOS являются синхронными и с их помощью нельзя выполнить операции нестандартного форматирования, и, во-вторых, обращение к функциям BIOS может быть перехвачено программой-взломщиком, что даст возможность проанализировать алгоритмы работы системы защиты от копирования.
Функция проверки ключевой дискеты состоит в чтении записанной ранее информации и сравнении ее с эталонной. Наряду с функцией проверки ключевой
Системы защиты от копирования
85
дискеты необходимо предусмотреть функцию сопровождения (проверки и модификации) определенных счетчиков, содержащихся в данных, «скрытых» на ключевой дискете. Данные могут быть расположены либо в секторах, «невидимых» для операционной системы, либо в межсекторных промежутках. Все сказанное ранее об использовании BIOS, относится и к данной функции.
Функция установки программы на НЖМД состоит в «привязке» программы к конкретной ПЭВМ. Эта функция установки обеспечивает защиту от несанкционированного копирования программы с НЖМД. В ряде систем она отсутствует. Эти системы обеспечивают работу защищенной программы только при наличии ключевой дискеты и не позволяют «привязывать» программу к компьютеру. Для ряда пользователей это может показаться неудобным, так как каждый раз при запуске программы необходимо вставлять ключевую дискету в накопитель, кроме этого, дискету необходимо еще и хранить. Функция установки может быть реализована несколькими способами. Рассмотрим некоторые из них.
Одним из самых простых способов является закрепление за программой конкретного местоположения на НЖМД. В этом случае во время установки программы сохраняется дисковый адрес расположения программы. В ряде систем кроме дисковых адресов кластеров файлов установленной программы может быть сохранен порядок следования этих кластеров. Копирование такой программы обычными средствами DOS приведет к изменению местоположения файлов программы, что можно легко обнаружить при запуске программы. Данный способ является одним из наиболее простых в реализации, но обладает крупным недостатком — файлы программы становятся неперемещаемыми. Это означает, что для обеспечения сопровождения НЖМД (создания архивных копий программы, повторной инициализации логического накопителя, уплотнения дискового накопителя и т. п.) необходимо обеспечить снятие программы с НЖМД. Наличие в системе сразу двух функций установки и снятия приводит к легкогому несанкционированному распространению. Действительно, для этого после установки необходимо сбросить образ диска
86
Глава 4
на магнитную ленту, выполнить снятие, получив исходную дискету с полным счетчиком установок, а затем восстановить диск с ленты, получив одну несанкционированную копию защищенной программы. Таким образом, наличие в системе функций установки и снятия позволяет получить произвольное число нелегальных копий без потери исходного счетчика установок. Разумеется, хакеры уже поняли, что устройство сброса на ленту может с успехом заменить программный продукт NORTON ADVANCED UTILITIES, который очень широко распространен во всем мире.
Другой способ заключается в том, что при установке программы на НЖМД сохраняются характеристики ПЭВМ, специфичные только для данного компьютера. Поскольку в ПЭВМ как таковой отсутствуют данные, аналогичные серийному номеру процессора IBM/370, то можно снять сигнатуру с оборудования ПЭВМ. В состав сигнатуры могут входит различные данные, например контрольная сумма системы BIOS. В качестве других данных могут служить некоторые временные характеристики оборудования ПЭВМ (следует отметить, что в качестве такой характеристики не следует использовать тактовую частоту процессора, поскольку ряд ПЭВМ оборудован переключателями частоты и времени цикла обращения к памяти). Данный способ свободен от недостатков способа привязки к местоположению на НЖМД, поскольку файлы программы могут находится в любом месте накопителя и могут копироваться любым доступным способом. Однако процесс выявления неповторяемых характеристик, по которым можно надежно опознать ПЭВМ, является достаточно сложным. Например, временные характеристики оборудования ПЭВМ могут зависеть от внешних факторов (температуры окружающей среды, напряжения питания и т. п.).
В некоторых системах при установке программы на НЖМД осуществляется привязка к аппаратному ключу. Простейший аппаратный ключ — это пассивное устройство, в состав которого входит постоянное запоминающее устройство, подключаемое к интерфейсу ввода/вывода ПЭВМ (последовательному или параллельному). В качестве аппаратного ключа можно рассматривать дополнительные адаптеры для ПЭВМ, имеющие серийный номер, например сетевые адаптеры.
Системы защиты от копирования
87
При выполнении установки сохраняется содержимое ключа, а при запуске проверяется наличие аппаратного ключа и его значение. Данный способ обладает целым рядом достоинств. Так, копия программы может быть расположена на произвольном числе ПЭВМ, но работоспособной она будет на ПЭВМ, в которой установлен ключ.
Функция защиты программ от отладчика служит для предотвращения анализа алгоритмов программ, как входящих в состав системы защиты от копирования, так и защищенных этой системой. Защита программ от модификации препятствует несанкционированному изменению кода программ. Кроме того, поскольку имя программы входит в объект авторского права, средства защиты от модификации должны не допускать изменения имени программы. Защита от отладки и модификации заключаются в основном в использовании самой программой средств отладки для перехода в среду, недоступную любопытному специалисту (так называемую закрытую программу). Разумеется, код закрытой программы должен быть предварительно зашифрован, а во время ее выполнения расшифрован (при этом процесс расшифрования также должен быть защищен от отладчика и модификации). Защита программ от модификации обычно реализуется путем подсчета контрольных сумм по определенному алгоритму.
Структура систем защиты от копирования. Рассмотрим структуру программы, реализующей функцию создания защиты от копирования дискеты. Эта программа состоит из следующих этапов:
•	идентификации дискеты, которая может осуществляться, например, путем нестандартного форматирования;
•	шифрования исходной программы;
•	модификации исходной программы с целью добавления программного кода, производящего аутентификацию дискеты и, может быть;
•	установки защищенной программы на НЖМД (в этом случае можно добавить код, производящий идентификацию и аутентификацию ПЭВМ, на которую производится установка защищенной программы);
•	записи модифицированной программы на дискету.
88
Глава 4
На некоторых из указанных этапов должны использоваться функции системы DOS (например, чтение и запись файла), а часть этапов следует защищать от попыток проанализировать алгоритмы их выполнения (нестандартное форматирование дискеты, шифрование защищаемой программы). В программе, защищенной от отладчика, нежелательно использовать стандартные средства DOS и BIOS, поскольку обращения к этим средствам могут быть перехвачены отладчиком. Вследствие этого программы, использующие средства DOS и BIOS, не могут быть надежно защищены от отладчика. Для разработки защищенной от отладчика программы необходимо разделить программный код на открытый и закрытый. При этом требуется обеспечить процессы перехода из отрытого участка кода в закрытый и обратно, управление последовательностью выполнения участков и обмен информацией между ними.
Модификация защищаемой программы с целью добавления необходимого программного кода реализуется вирусым методом (см. приложение 6). Для программы в формате ЕХЕ-файла в конец файла добавляется необходимый код, корректируются точка входа и размер файла. Для программ в формате COM-файла, если длина результирующего файла не превышает 64К, требуемый код добавляется в конец файла, а часть кода, находящегося в начале программы, корректируется для безусловного перехода на добавленный код. В противном случае программа преобразуется в формат ЕХЕ-файла. Получив управление, добавленный код должен выполнить аутентификацию дискеты. Эту функцию следует выполнять в закрытом от изучения коде. Если дискета аутентифицирована, то защищенная программа загружается в память, расшифровывается и ей передается управление. В противном случае выполнение программы прекращается и может быть, например, выдано сообщение о несанкционированном копировании программы. При необходимости проведения установки на НЖМД выполняется идентификация ПЭВМ и защищенная программа переписывается на НЖМД с добавлением в нее кода аутентификации ПЭВМ. Защищенная программа, расположенная на НЖМД, отличается от защищенной программы, находящейся на дискете, только тем, что добавленный в нее код осуществляет аутентификацию ПЭВМ, а не дискеты.
Системы защиты от копирования
89
4.3.2.	Методы построения защищенных от копирования дискет
Одним из методов защиты дискет от копирования является их нестандартное форматирование. Построение нестандартного формата относится к области эмпирической деятельности, однако можно выявить несколько базовых подходов к нестандартному форматированию дискет.
Нарушение последовательности секторов. Этот подход заключается в нарушении стандартной последовательности секторов, т. е. сектора на дорожке в процессе форматирования нумеруются не последовательно, начиная с единицы, а в другом порядке (вообще номера секторов могут выбираться произвольно). Можно нарушать и другие значения в параметрах CHRN сектора. Нарушение последовательности секторов и другие нарушения в параметрах CHRN проверяются при выполнении команды «Чтение идентификатора».
Нарушение стандартного значения поля N позволяет читать/записывать данные за пределами реального сектора. Следует отметить, что программа COPYIIPC неверно копирует дорожку, на которой последний сектор имеет N, большее или равное 6. При копировании разрушаются первые сектора на дорожке.
Изменение межсекторной дистанции. Этот подход заключается в изменении размера GAP3 при форматировании дискеты. Относительные промежутки между секторами вычисляются на основе измерения временных интервалов между последовательно выполняемыми командами «Чтение идентификатора».
Стойкость данного подхода по отношению к программам типа COPYIIPC должна проверяться для каждого конкретно выбранного размера GAP3. Однако авторам не удалось получить устойчивый к копированию формат.
Форматирование с кодом длины 0 или 1. Этот подход наиболее широко распространен при создании защищенных от копирования дискет. Суть его состоит в том, что при форматировании дорожки код длины сектора выбирается равным 0 или 1, однако коды длины,
90
Глава 4
записываемые в параметры CHRN секторов, могут быть другими. Этот подход позволяет, варьируя значения GAP3, создавать резервные сектора для записи информации о ключевой дискете. Кроме того форматируя дорожку с кодом длины 0 или 1, но указывая другие величины в кодах длины в CHRN, и затем записывая данные в эти сектора, можно получать другие форматы. Это объясняется тем, что запись длинных данных в короткий сектор разрушает маркеры идентификаторов следующих секторов и позволяет получать другой формат. Наиболее просто эти возможности можно исследовать с помощью программы DISK EXPLORER, рассмотренной в подразд. 4.2.3.
Контроль длины дорожки. При форматировании дорожки контроллер после исчерпания данных форматирования записывает GAP4B. Длина GAP4B зависит от скорости вращения дискеты. На разных приводах скорости могут различаться, поэтому размеры GAP4B различны. Суть подхода состоит в том, что при форматировании дорожки последний сектор записывается с кодом длины большим чем код длины форматирования, и чтение этого сектора позволяет определять и контролировать размер GAP4B. Исследования показывают, что размер GAP4B может контролироваться с точностью до одного байта. Более высокая точность недостижимы из-за разброса параметров контроллеров НГМД.
Прерывание операции и выключение мотора. Достаточно любопытные результаты можно получить, прервав текущую команду (сброс контроллера) или включив/выключив мотор во время выполнения команды. Прерывание текущей команды используется программой DISK EXPLORER для выполнения операции короткой записи.
Заключение. Построение алгоритмов защиты дискет от копирования относится к области экспериментальной деятельности. Применяя описанные выше подходы, можно получать достаточно сложные схемы, которые устойчивы к копированию как программными, так и аппаратными средствами.
Системы защиты от копирования
91
4.3.3.	Методы противодействия изучению алгоритмов систем защиты
Краеугольным камнем проектирования систем защиты является разработка средств, препятствующих изучению алгоритмов работы систем. Если в системе защиты будут отсутствовать такие средства, то все усилия на ее создание не будут иметь никакого смысла, поскольку квалифицированный системный программист сможет разобраться в логике работы любого модуля системы и, следовательно, преодолеть любую систему защиты.
Изучение логики работы программы можно выполнить в двух режимах: статическом и динамическом. Суть статического режима заключается в дисассемблировании программы (преобразовании выполняемого программного модуля в исходный текст или листинг исходного текста) и изучении результатов дисассемблирования. Суть динамического режима состоит в трассировке программы. Под трассировкой программы понимается выполнение программы на вычислительной машине в некоторой среде, позволяющей осуществить доступ к регистрам, областям памяти, произвести останов программы по некоторым адресам и т. п. В динамическом режиме изучение логики работы программы осуществляется либо в процессе трассировки, либо по сохраненным результатам трассировки.
Заметим, что программы, защищенные только от дисассемблирования, могут легко трассироваться, и наоборот — программы, защищенные только от трассировки, могут быть дисассемблированы. В следствие этого для противодействия изучению алгоритмов систем защиты необходимо иметь средства, препятствующие как дисассемблированию, так и трассировке.
Принципы работы отладчиков. Трассировку программы легче всего выполнить с помощью программных продуктов, которые называются отладчиками. Основное назначение отладчиков — обнаружение ошибок в неправильно работающей программе. В настоящее время на рынке программного обеспечения предлагается много разнообразных отладчиков, среди которых есть просто уникальные по возможностям, предоставляемым для отладки программы. Вместе с тем принципы работы этих отладчиков одинаковые. Базисом для построения любого
92
Глава 4
отладчика служат методы покомандного выполнения программы и контрольной точки.
Покомандное выполнение осуществляется с помощью средств процессора ПЭВМ. Для установки режима покомандного выполнения в процессоре имеется специальный флажок TF. Если установлен флажок-TF, то процессор после выполнения каждой команды генерирует прерывание типа 1 и в соответствии с принципами операций подключается соответствующая процедура обработки прерывания. Когда процедура обработки прерывания получает управление, флажок TF сбрасывается и процессор начинает работать обычным образом. После завершения процедуры флажок TF восстанавливается и процессор снова переводится в пошаговый режим работы.
Контрольной точкой называется любое место в программе, где нормальное ее выполнение приостанавливается и предоставляется возможность некоторой специальной обработки. Обычно для реализации метода контрольной точки в код программы динамически вставляют команду INT 3 (прерывание 3 специально зарезервировано для этих целей). Процедура обработки прерывания 3 (процедура контрольной точки) после выполнения своих функций восстанавливает код, который был замещен командой INT 3 для останова по контрольной точке, и выполнение программы продолжается.
Следует обратить внимание на то, что для останова по контрольной точке не обязательно использовать команду INT 3, хотя это и самый удобный способ (команда INT 3 имеет длину 1 байт, остальные команды INT п — двухбайтные). Некоторые отладчики позволяют использовать и другие команды INT.
Кроме того, в процессорах INTEL 80386/80486 предусмотрены специальные аппаратные средства контрольной точки. В этих процессорах существуют специальные регистры средств отладки, используя которые можно устанавливать до черырех контрольных точек одновременно. Следующие программные события вызывают срабатывание любой из контрольных точек:
•	обращение к участку памяти;
•	изменение участка памяти;
•	выборка команды по определенному адресу.
В процессорах INTEL 80386/80486 предусмотрена выработка прерывания при обращении к заранее определенным портам ввода-вывода. Более того, возможен режим
Системы защиты от копирования 93
работы, при котором команды, изменяющие или считывающие состояние признаков процессора, вызывают прерывание (при выполнении задачи в режиме виртуального процессора 8086 с параметром IOPL < 3).
Наиболее мощные отладчики позволяют использовать на процессорах INTEL 80386/80486 и дополнительные аппаратные средства отладки. В связи с этим для защиты от трассировки необходимо предпринимать дополнительные меры предосторожности, учитывая, что трассировка программы может быть выполнена и на процессорах данного типа.
Система противодействия. Попробуем теперь предложить некоторые меры для защиты от трассировки и дисассемблирования. Будем называть весь комплекс таких мер системой противодействия. Поскольку создание надежной системы противодействия — довольно сложное дело, будем делать это последовательно. Начав с некоторой системы противодействия, подвергнем ее критическому анализу, усовершенствуем, получим новую систему и так до тех пор, пока очередная система не обеспечит удовлетворяющую нас сложность преодоления системы противодействия.
Введем основные понятия системы противодействия. Любую программу, защищенную от трассировки, можно разделить на четыре основные части (рис. 4.7).
НЕСЕКРЕТНАЯ ЧАСТЬ выполняет начальную настройку и подключение привратника
ПРИВРАТНИК открывает "двери” в секретную часть программы и делает невозможной дальнейшую ее трассировку
СЕКРЕТНАЯ ЧАСТЬ выполняет действия, которые надо "спрятать" от постороннего наблюдателя
НЕСЕКРЕТ. НАЯ ЧАСТЬ выполняет завершающие действия, которые не являются критическими для понимания логики работы программы
Рис. 4.7.
94
Глава 4
Разумеется, в начале программы должны быть выполнены определенные действия, которые невозможно скрыть от трассировки. Поэтому программа всегда начинается с несекретной части, в которой выполняются действия, не являющиеся принципиальными для понимания логики работы программы. Перед тем как перейти к выполнению функций программы, которые должны быть защищены от трассировки, необходимо подключить процедуру, предотвращающую возможность дальнейшей трассировки. Такую процедуру будем в дальнейшем называть привратником (привратник открывает «двери» и только через него можно попасть в секретную часть программы). После того как отработает привратник, управление получает секретная часть программы, в которой выполняются все основные действия (или те действия, без знания которых невозможно понять логику работы всей программы).
Следует иметь в виду, что для обеспечения безопасной работы системы противодействия в привратнике и секретной части должны быть запрещены все внутренние и внешние прерывания, обработка которых не может быть проконтролирована. Внутренние прерывания инициируются по определенным состояниям процессора или командой INT, а внешние — сигналами, подаваемыми в процессор от других компонентов. Такое требование не является чрезмерным, если учесть, что вместо стандартной процедуры обработки любого прерывания может использоваться некоторая процедура, разработанная лицом, желающим понять логику работы программы, и служащая для выполнения трассировки. Прерывания должны быть запрещены как на уровне процессора (флаг IF=O), так и на уровне программируемого контроллера прерываний. Более того, процедуры обработки тех прерываний, которые не маскируются (например, внутренние прерывания процессора из-за ошибок при выполнении машинных команд), должны быть заменены на собственные процедуры привратника, так как системный программист может воспользоваться и этими прерываниями для трассировки программы.
С учитом вышесказанного становится понятным наличие второй несекретной части программы, получающей управление непосредственно после секретной части и выполняющей действия, которые невозможно выполнить при запрете прерываний. Эта несекретная часть программы может использовать команды INT, обращаться к one-
Системы защиты от копирования
95
рационной системе для выполнения тех действий, которые не могли быть выполнены в секретной части и т. п.
Необходимо учесть, что привратник и секретная часть программы должны обнулить свой код и данные либо в процессе выполнения, либо перед своим завершением. Это совершенно необходимо в связи с тем, что при трассировке несекретной части программы можно получить доступ к памяти, занятой привратником и секретной частью, и разобраться в логике работы этих компонентов, если соответствующая память не обнулена. Из этого следует, что программа защищенная от трассировки, не может быть повторно используема. Для повторного выполнения такой программы в оперативную память надо загрузить ее новую копию.
Определив структуру программы, защищенной от трассировки, можно предложить простейшую систему противодействия. Она включает привратника, основной задачей которого является противодействие отладчику. Секретная часть программы следует сразу за привратником (поэтому ее трассировка становится невозможной) и выполняется в среде с запрещенными прерываниями, установленной привратником.
Даже неглубокий анализ предложенной системы противодействия показывает ее недостатки. Обратим внимание на следующие очевидные факты.
Во-первых, совершенно ясно, что если привратник и секретную часть можно дисассемблировать, то вся система противодействия теряет смысл, поскольку можно будет понять логику программы и без трассировки ее выполнения.
Во-вторых, если привратник не передает никакие параметры секретной части, то привратника можно обойти и осуществить трассировку всей программы без выполнения привратника.
Наконец, хотелось бы иметь стандартную процедуру-привратник для всех программ, которые надо защитить от трассировки.
Первые две проблемы можно решить, зашифровав коды привратника и секретной части программы. Тогда привратник должен расшифровывать себя по мере выполнения, а также код секретной части программы перед тем, как передать ей управление. В большинстве исследованных систем противодействия используется именно этот метод, поскольку он наиболее надежен. Для большей
96
Глава 4
надежности можно шифровать и вторую несекретную часть программы.
Более того, метод динамического расшифрования программы хорошо согласуется с принципом унификации процедуры-привратника. Расшифрование может выполняться по заложенному в привратник алгоритму, использующему ключ, который определяется основной программой. В результате для каждой защищаемой программы будет получена уникальная гамма шифра.
Таким образом, для построения надежной системы обеспечения противодействия необходимо уделить особое внимание привратнику и интерфейсу привратника с секретной частью программы. Как следует из вышеизложенного, привратник должен выполнять следующие основные функции: • сохранение среды функционирования в момент подключения и создание среды, затрудняющей трассировку программы (за восстановление среды функционирования должна отвечать секретная часть программы);
•	динамическое расшифрование своего кода по мере выполнения;
•	расшифрование кода основной программы по заданному ключу шифра;
•	передача управления в заданное место расшифрованного кода.
Остановимся более подробно на проблемах, которые могут возникнуть в процессе реализации каждой из этих функций.
Установка среды, затрудняющей трассировку программы, на первый взгляд является не слишком сложным делом. Действительно, во-первых, надо запретить все прерывания и установить собственные обработчики всех прерываний, которые невозможно замаскировать (например, прерываний 0, 2, 4 и т. д.). Заодно можно перехватить обработку прерываний, приходящих от клавиатуры или мыши, а также установить собственный обработчик прерывания, используемого для обращения к BIOS видеоадаптера, чтобы лишить пользователя, выполняющего трассировку программы, возможности интерактивного управления трассировкой на время работы привратника и секретной части программы.
Затем следует установить свои процедуры обработки прерываний 1 и 3, которые используются отладчиком для
Системы защиты от копирования
97
трассировки программы, и применить их в привратнике для внутренних целей (например, для динамического расшифрования кода привратника). В результате трассировка программы с помощью отладчика станет невозможной (ведь обработчики прерываний 1 и 3 используются самим привратником!) и все проблемы как будто решены.
Однако все не так просто. Во-первых, разработчику системы противодействия необходимо иметь в виду, что отладчик или другая программа, с помощью которой выполняется трассировка (например, монитор виртуальной машины, работающий на процессоре INTEL 80386), способен контролировать действия трассируемой программы. Например, запрет всех прерываний и модификация векторов некоторых прерываний отслеживаются большинством отладчиков. Отладчики всегда создают для своей работы такую среду, которая необходима для их функционирования, а при выполнении любой команды трассируемой программы восстанавливают ту среду, которую она установила. В противном случае любой отладчик просто не смог бы обеспечить выполнение своих функций. Другое дело, насколько это корректно делается отладчиком.
Даже если отладчик не отслеживает какие-нибудь изменения среды выполнения, то это может сделать сам системный программист в интерактивном режиме трассировки. Данный факт лучше всего пояснить на примере.
Предположим, что привратник заменяет процедуры обработки прерываний 1 и 3 на собственные процедуры. Системный программист в интерактивном режиме трассировки привратника не допускает такого изменения, поскольку данные вектора прерываний используются отладчиком (большинство отладчиков не рассчитано на изменение этих векторов прерываний). Вместо этого выполняется процедура, осуществляющая следующие действия: • запоминается содержимое векторов прерываний 1 и 3 (эти вектора установлены отладчиком и указывают на его обработчики);
•	заносятся в вектора прерываний 1 и 3 адреса процедур обработки привратника;
•	модифицируются процедуры обработки прерываний 1 и 3 так, чтобы они заканчивались не командой возврата из процедуры, а командой перехода на первую команду соответствующего обработчика прерываний самого отладчика.
98
Глава 4
Назовем такое включение собственной процедуры привратника в среду отладчика адаптацией. На рис. 4.8 приведен пример адаптации вектора прерываний 1.
Рис. 4.8.
На основании примера адаптации вектора прерывания можно сделать довольно безрадостный вывод: системный программист, трассирующий программу в интерактивном режиме, всегда сможет пресечь все нежелательные изменения среды отладчика, которые пытается Сделать привратник, и включить (адаптировать) эти изменения в среду отладки. Даже если после изменения среды функционирования привратник постоянно проверяет, действительно ли изменена среда, с точки зрения системного программиста в этом ничего страшного нет: такую проверку всегда можно обойти или подсунуть привратнику те данные, которые он хочет увидеть (назовем такой метод виртуализацией среды привратника).
Более того, с учетом наличия дополнительных аппаратных средств отладки на процессорах INTEL 80386/80486 перспективы создания надежной системы противодействия вроде бы вообще сводятся к нулю. Однако на самом деле это не совсем так. Недаром мы все время говорили о создании среды, затрудняющей процесс трассировки, а не блокирующей его. Разумеется, привратник любого уровня сложности не способен предотвратить процесс трассировки, но он может сделать его очень сложным и дорогостоящим. В результате «взлом» системы защиты от копирования станет настолько дорогим, что потеряет всякий смысл (см. подразд. 1.1).
Для начинающих разработчиков системы противодействия сейчас будет предложена одна из схем по-
Системы защиты от копирования
99
строения привратника, которая является довольно мощным оружием против попыток трассировки программы (рис. 4.9).
ОСНОВНАЯ ПРОГРАММА ПРИВРАТНИКА
ПРОЦЕДУРЫ ПРИВРАТНИКА
иницирует покомандное выполнение безумного кода привратника
БЕЗУМНЫЙ КОД
состоит из N команд, после выполнения каждой из которых возникает прерывание типа 1
расшифровывает секретный код передает управление на указанную команду
1 постоянно модифицируют свой код вносят отдельные изменения в среду функционирования выполняют верификацию среды функционирования и кода процедур расшифровывают безумный код привратника на основе результатов верификации передают управление на "случайную" команду безумного кода
Рис. 4.9.
Привратник состоит из основной программы и М процедур. Схема построения привратника базируется на том, что в нем выделяются команды, которые выполняются в пошаговом режиме (такие команды будем называть безумным кодом). После выполнения любой команды безумного кода возникает прерывание типа 1 и управление получает первая процедура привратника. Передача управления следующей процедуре осуществляется либо с помощью команды INT, либо с помощью простой команды перехода, либо при появлении определенных состояний аппаратуры, создаваемых в текущей процедуре. Все процедуры привратника выполняют примерно одинаковые функции. Основными функциями каждой процедуры являются следующие:
1.	Модификация в процессе выполнения своего кода
100
Глава 4
(в том числе и расшифрование его), приводящая к тому, что результат последующего прохода через процедуру отличается от результата текущего прохода.
2.	Внесение отдельных изменений в среду функционирования. Желательно добиться того, чтобы вносимые изменения зависели от характеристик‘уже установленной среды. В этом случае при каждом новом проходе через процедуру изменения состояния среды будут различаться. Следовательно, сама среда каждый раз будет новой (это затрудняет автоматизацию процесса трассировки) .
3.	Верификация среды функционирования. Верификация среды не должна сводиться к простой проверке тех или иных параметров, установленных в процессе предыдущего выполнения. Такие проверки можно легко обойти. Предлагается просто использовать те или иные характеристики установленной среды выполнения для расшифрования безумного кода или кода других процедур, а также для установки новых параметров среды функционирования привратника. Кроме верификации среды необходимо обязательно выполнять проверку правильности кодов процедур привратника.
Для этого предлагается подсчитывать их контрольные суммы (обратите внимание на то, что контрольные суммы процедур не являются константами), которые затем можно использовать для расшифрования безумного кода или кода других процедур, а также для установки новой среды функционирования привратника.
Управление должно передаваться между процедурами «случайным» образом. Это означает, что последовательность вызова процедур привратника определяется на основе некоторых переменных характеристик (например, параметров среды функционирования, контрольных сумм и т. п.). Исходный текст первой процедуры привратника приведен в приложении 9.
Самая последняя процедура в цепочке подключаемых процедур привратника (разумеется, это не обязательно всегда одна и та же процедура) выполняет еще одну важную функцию — возврат управления на безумный код. Причем, команда безумного кода, получающая управление, выбирается из N возможных для выполнения, где N о 4. Передача управления на «случайную» команду безумного кода является принципиальным мо
Системы защиты от копирования
101
ментом, поскольку в этом случае установка контрольной точки после каждой команды безумного кода становится бессмысленной. В свою очередь это приводит к резкому увеличению количества команд, выполняемых в пошаговом режиме, и, следовательно, к увеличению объема трассируемых данных. Число N выбирается большим 4 исходя из того, что в процессорах INTEL 80386/80486 можно одновременно устанавливать не более четырех контрольных точек.
Предлагаемая схема построения привратника позволяет существенно затруднить трассировку программы. Во-первых, в процессе трассировки уже нельзя использовать в полном объеме аппарат контрольной точки, поскольку невозможно предсказать место очередной контрольной точки (к тому же все время требуется отслеживать изменения среды функционирования в режиме пошагового выполнения программы). Во-вторых, от системного программиста, пытающегося преодолеть систему противодействия, требуется постоянное сохранение и восстановление среды функционирования для обеспечения работы в интерактивном режиме. Наконец, маловероятна возможность автоматизации процесса трассировки программы из-за постоянных изменений среды выполнения и модификации кода самого привратника.
Таким образом, стоимость преодоления системы противодействия начинает определяться числом машинных команд, трассируемых в интерактивном режиме, и числом ручных операций восстановления среды функционирования. Можно считать, что трассировка секретной части программы, следующей за привратником, станет практически невозможной при большом числе трассируемых команд привратника (несколько сотен тысяч или миллионов команд), а также при большом числе операций восстановления среды. К сожалению, очень трудно количественно оценить сложность преодоления системы противодействия, поскольку еще не разработаны точные математические методы оценки сложности программ (во всяком случае авторам они не известны). Поэтому надежность системы противодействия обычно определяют экспертным путем с привлечением системных программистов высокой квалификации.
После решения проблемы защиты от трассировки бальные функции привратника могут быть реализо
102
Глава 4
ваны без особых сложностей. Единственное, на что следует обратить внимание, заключается в следующем: адрес первой команды секретного кода не должен определяться явно при подключении привратника. Например если привратник вызывается по команде CALL, то первая команда секретного кода не Должна быть следующей за командой CALL. Необходимо помнить, что первая команда секретного кода является идеальным местом для установки контрольной точки (например, контрольной точки, срабатывающей при выборке команды по определенному адресу). Поэтому рекомендуется передавать привратнику адрес первой команды секретного кода в качестве зашифрованного параметра, который расшифровывается в процессе выполнения привратника.
Разработчику привратника следует обратить особое внимание на защиту от аппаратных средств отладки на процессорах INTEL 80386/80486. Это является довольно сложной, но в то же время интересной задачей. Чтобы идентифицировать процессор и уровень привелегий IOPL (при выполнении задачи в режиме виртуального процессора 8086), можно использовать процедуру, приведенную в приложении 7.
4.3.4.	Недостатки некоторых существующих систем защиты от копирования
В настоящем разделе мы расскажем о тех недостатках, которые были замечены авторами в ряде систем. Названия самих систем (с целью исключения их дискредитации) приводиться не будут. Заметим сразу, что не все указанные во введении системы имеют перечисляемые ниже недостатки, однако по крайней мере один из них обязательно присутствует. Итак, наиболее распространенные недостатки систем защиты от копирования:
•	отсутствие некоторых типовых функций систем защиты;
•	хранение информации о ключевой дискете на инженерных цилиндрах;
•	контроль ключевой информации с помощью прерывания 13Н системы BIOS;
Системы защиты от копирования
103
•	однотипность используемых методов форматирования ключевых дискет;
•	простой (и вследствие этого легко копируемый) формат ключевой дискеты;
•	небольшое число ключевых признаков на дискете;
•	отсутствие поддержки всех типов дискет;
•	ключевые дискеты копируются с помощью платы COPYIIPC DELUXE OPTION BOARD (Copywrite платы — 1987 г., используемого программного обеспечения платы — 1988, 1989 гг.).
Коротко прокомментируем эти недостатки.
Наиболее часто в системе защиты от копирования отсутствует функция, обеспечивающая возможность установки защищенной программы на НЖМД. Отсутствие этой функции в ряде случаев существенно усложняет пользователю работу. Вместе с тем достаточно часто присутствует функция, обеспечивающая снятие (деин-сталяцию) защищенной программы с винчестера на дискету с одновременным увеличением счетчика установок на 1. Наличие данной функции в системе позволяет легко получать произвольное число несанкционированных копий. Конечно, система защиты не должна обладать этой функцией.
Инженерные цилиндры предназначаются для проведения тестовых операций проверки правильности работы НГМД. Однако их число зависит от типа НГМД. В спецификации на НГМД вы никогда не найдете сведений об инженерных цилиндрах и их числе. Кроме этого, никто не гарантирует, что в будущем выпускаемые типы НГМД вообще не будут поддерживать инженерные цилиндры. Вследствие этого представляется правильным не использовать инженерные цилиндры для хранения информации о ключевой дискете. Сложный (некопируе-мый) формат можно создать в области специфицированных номеров цилиндров. Большинство систем, использующих инженерные цилиндры, имеют крайне слабый (с точки зрения возможности копирования) формат. Собственно говоря, их основным секретом является то, что, как, вероятно, считают разработчики этих систем, только они знают о наличии цилиндров с номерами, отсутствующими в спецификации!
Любая система защиты должна проверять наличие
104
Глава 4
ключевого элемента. Однако если это осуществляется с помощью прерывания 13Н системы BIOS, то можно перехватить данное прерывание и легко «сломать» систему защиты. Для того чтобы прерывания нельзя было перехватить, их просто не следует использовать. Конечно, применение в системах защиты команд непосредственного обращения к аппаратуре, в частности к контроллеру НГМД, требует от их разработчиков значительно большего опыта и времени разработки.
Многие системы защиты от копирования имеют чрезвычайно «слабые» ключевые дискеты. Слабость ключевой дискеты заключается, с одной стороны, в простом формате ключевых дорожек и, с другой стороны, в малом числе ключевых признаков. Формат ключевых дорожек легко переносится на дискету-копию с помощью широко распространенных программ типа DISK EXPLORER. Малое число ключевых признаков позволяет быстро «подобрать ключ» с помощью непосредственного эксперимента, в процессе которого на дискету-копию последовательно переносятся «подозрительные» элементы, которые могут не копироваться стандартными средствами. После того как аутентифицирующая часть системы защиты опознает дискету-копию как ключевую, процесс копирования прекращается.
Важным вопросом при использовании систем защиты на разной аппаратуре является обеспечение поддержки всех типов дискет. Пользователям и разработчикам необходимо уделять внимание этому вопросу.
Одним из наиболее опасных методов взлома систем защиты от копирования, рассматриваемых в следующем разделе, является копирование ключевой дискеты. Наиболее просто это сделать с помощью платы COPYIIPC DELUXE OPTION BOARD, предназначенной исключительно для создания архивных копий. Возможности данной платы поистине уникальны — она копирует ключевые дискеты всех известных авторам отечественных систем (исключая CERBERUS). Кроме платы программисты, желающие сделать «архивные» копии с защищенных программ, пользуются и менее сильными средствами типа COPYIIPC, COPYWRIT и MASTERCOPY, а также своими собственными «архиваторами».
Системы защиты от копирования
105
4.4.	МЕТОДЫ ВЗЛОМА СИСТЕМ ЗАЩИТЫ ОТ КОПИРОВАНИЯ
С появлением на рынке систем защиты от копирования на них сразу начались атаки. Кто из чистого интереса, а кто и нет, но хакер стал разными методами вскрывать системы. Разные методы вскрытия требуют различных специализаций хакера и времени для вскрытия. Тот, кто хочет «покопаться» во внутренностях системы, использует одни методы, а тот кто просто хочет побыстрей сломать ее, — другие. Наиболее распространенные методы взлома систем описаны ниже.
4.4.1.	Создание копии ключевой дискеты
Один из универсальных и эффективных методов взлома систем защиты от копирования — создание копии ключевой дискеты. Действительно, если «полностью» перенести как структуру, так и информацию в соответствующих полях дискеты-оригинала на дискету-копию, то аутентификационная часть системы защиты не сможет отличить разницы между этими дискетами. Следовательно, дискета-копия будет работоспособной. К сожалению, авторы не знают универсального алгоритма, позволяющего программным способом «полностью» скопировать дискету-оригинал. Заметим, что для получения работоспособной дискеты-копии полное повторение дискеты-оригинала является достаточным условием. Необходимым условием работоспособности дискеты-копии является наличие на ней характеристик, проверяемых аутентификационной частью системы защиты. Итак, для получения работоспособной дискеты-копии необходимо повторить лишь эти, проверяемые системой защиты характеристики. Таким образом, центральная задача данного метода — понять, какие характеристики проверяются системой защиты и как их повторить на дискете-копии. Авторам не известно решение и этой более простой задачи. Однако каждую конкретную систему, по-видимому, с помощью этого метода можно взломать . Для этого, конечно, может потребоваться и некоторая аппаратура. Заметим, что решение этой задачи для каждой конкретной системы защиты от копирования требует определенного опыта.
106
Глава 4
Способ реализации данного метода может быть программным либо программно-аппаратным. При программном способе копии дискет изготавливаются с помощью программ типа COPYIIPC (см. подразд. 4.2.4). В некоторых случаях для обеспечения работоспособности копии, полученной после работы программы COPYIIPC, достаточно немного подправить ее с помощью программы DISK EXPLORER (см. подразд. 4.2.3). В разд. 4.5 этот метод применяется для взлома четырех известных авторам систем, распространенных на отечественном рынке.
При программно-аппаратном способе реализации данного метода дискеты копируются с помощью устройств типа платы COPYIIPC OPTION BOARD DELUXE. Заметим, что из-за несовершенства программного обеспечения платы с помощью последней можно взломать далеко не все системы защиты, как это может показаться с первого взгляда.
Этот метод является достаточно быстрым и позволяет (при хорошей квалификации) для большинства систем создать копии изготавливаемых с их помощью ключевых дискет за 5...7 минут.
4.4.2.	Модификация кода программы с целью обхода проверки
Одним из наиболее распространенных методов взлома системы защиты от копирования является модификация кода модуля системы, выполняющего следующие действия:
•	проверку ключевой дискеты;
•	корректировку счетчика установок на НЖМД защищенной от копирования программы с ключевой дискеты;
•	проверку санкционированности запуска защищенной программы на персональном компьютере.
Такая модификация может сводиться к простому обходу кода, выполняющего перечисленные действия, или более сложным изменениям модуля системы защиты от копирования. В любом случае главное понять логику работы модуля системы, а внесение соответствующих изменений — это уже дело техники.
Таким образом, выполнение модификации кода модуля, позволяющей обойти проверки, невозможно без
Системы защиты от копирования
107
трассировки или дисассемблирования этого модуля и локализации той его части, которую необходимо отсечь для снятия защиты.
В конечном счете все сводится к следующему вопросу: каким образом преодолеть систему противодействия модуля, модификацию которого желательно выполнить для снятия защиты? В решении этого вопроса большую помощь могут оказать предложения по разработке системы противодействия, приведенные в подразд. 4.3.3. Опираясь на основные концепции построения любой системы противодействия, можно попытаться преодолеть те преграды, которые выстроили разработчики системы защиты от копирования на пути к секретной части программы, дойти до этой секретной части и попробовать обойти проверки (см. рис. 4.7).
Системным программистам, которые будут пытаться взломать систему защиты от копирования этим способом, можно дать некоторые рекомендации. Во-первых, следует выполнить первоначальный анализ системы противодействия и понять, какие меры противодействия предусмотрены.
Как это ни странно, существуют такие системы, в которых отсутствуют средства, затрудняющие трассировку, либо трассировка затруднена только в пределах определенного участка кода, который легко обойти. В некоторых системах противодействия секретная часть программы не зашифрована, а роль привратника сведена только к построению препятствий, затрудняющих трассировку программы. В этом случае большую помощь может оказать дисассемблирование программы. Таким образом, уже первоначальный анализ может показать слабые стороны системы противодействия и пути ее преодоления.
После выполнения первоначального анализа рекомендуется выяснить, нет ли явных промахов, допущенных в реализации системы противодействия. К таким явным промахам можно отнести незамаскированные внутренние или внешние прерывания, обработка которых не контролируется в привратнике или секретной части программы. Например, секретная часть программы может обращаться к операционной системе для выполнения некоторых функций. Это можно легко выяснить, установив собственные обработчики для всех прерываний.
108
Глава 4
Наконец, следует прибегнуть к трассировке программы, если не помогают другие методы взлома. При этом можно широко использовать описанный ранее метод адаптации вектора. Не следует забывать и о необходимости восстановления среды при выполнении команд привратника. Рекомендуется как можно шире использовать аппарат контрольной точки для сокращения временных затрат на трассировку (в связи с этим трассировку лучше выполнять на персональной ЭВМ с процессором INTEL 80386/80486). Возможно, потребуется разработка дополнительных программных средств помимо существующих.
Разумеется, полная трассировка программы может не дать желаемых результатов. Здесь очень многое зависит от квалификации системного программиста, выполняющего трассировку, его опыта и от сложности системы противодействия. Таким образом, модификация кода программы с целью обхода проверки не всегда практически выполнима.
Рассмотренный метод является трудоемким. Время взлома системы с помощью данного метода измеряется неделями.
4.4.3.	Моделирование обращений к ключевой дискете
Достаточно много программ защиты от копирования используют не прямую работу с контроллером НГМД, а средства системы BIOS — прерывание 13h. Следовательно, для этих программ можно моделировать результат обращения к ключевой дискете путем перехвата прерывания 13h.
Наиболее широко контроль ключевой дискеты с помощью прерывания 13h используется в системах, основанных на анализе физических дефектов на поверхности дискеты («лазерные дырки»). При этом в испорченные сектора сначала записывается информация, а потом читаются и проверяются несовпадения в заданном участке сектора. Такой метод используется в системе защиты DOS фирмы Digital Research.
Во всех случаях при проверке ключевой дискеты можно исследовать прерывание 13h, перехватить его и применить необходимое моделирование результата работы соответствующей функции этого прерывания.
Системы защиты от копирования
109
Время взлома систем с помощью данного метода составляет от дня до недели.
4.4.4.	Использование аппарата установки/снятия
Некоторые программные средства защиты от копирования используют при установке программы на НЖМД привязку к физическому расположению файла на диске. Одновременно эти программы должны обеспечивать функции снятия программы с НЖМД и восстановления исходного счетчика установок, так как защищенные программы нельзя перемещать и соответственно нельзя применять стандартные средства сохранения/восстановления файлов. Использовав функцию снятия защищенной программы с НЖМД, можно получить неограниченное число нелегальных копий. Для этого достаточно установить программу на НЖМД. Сохранить размещение и содержимое всех файлов, созданных программой установки. Выполнить снятие программы с НЖМД (при этом восстанавливается исходный счетчик установок). Затем восстановить сохраненное размещение и содержимое. В результате получается ключевая дискета с исходным счетчиком установок и нелегальная копия на НЖМД. Сохранение/восста-новление размещения требует знания структуры файловой системы DOS. В частности, для этого удобно использовать программу NU из комплекта Norton Utilities Advanced Edidtion. Наиболее просто выполнить процесс сохранения/восстановления с помощью стриммера — устройства сброса на ленту. Это устройство позволяет сохранить/восстановить все содержимое диска и прежнее размещение.
Следует отметить, что иногда для размещения информации о ключевой дискете на НЖМД используются свободные области (сектора после записей MASTER BOOT RECORD и EXTENDED BOOT RECORD) или некоторые кластеры помечаются как дефектные и также используются для хранения информации. В этом случае Для восстановления информации не достаточно использовать только устройство сброса на ленту, а требуется еЩе дополнительно восстановить эти области. Это объясняется тем, что эти области устройством сброса на ленту Нр копируются.
110
Глава 4
Время взлома систем с помощью данного метода измеряется часами.
4.4.5.	Снятие программы из памяти
Суть данного метода состоит в следующем. Система защиты рано или поздно загружает программу в память, расшифровывает ее и передает расшифрованному коду управление. В этот момент в памяти находится полностью расшифрованная программа и для получения несанкционированной копии остается только сохранить ее в каком-то файле. Это можно сделать путем перехвата первого прерывания (например, INT 21Н), возникающего в ходе выполнения программы. Справедливости ради следует сказать, что данных действий достаточно только для получения несанкционированной копии COM-файлов. В случае ЕХЕ-файла следует еще чуточку повозиться. Необходимо загрузить защищенную программу, начиная с различных адресов, и сохранить образ памяти в двух файлах. Далее, сравнив файлы, следует определить смещения перемещаемых адресов, вычислить эти перемещаемые адреса, сформировать таблицу перемещений и заголовок ЕХЕ-файла. Время взлома систем с помощью данного метода измеряется часами.
Заметим, что для противодействия данному методу взлома в отличие от других необходимо использовать специальную технологию написания программ. Например, система CERBERUS предоставляет пользователю возможность защиты от рассматриваемого метода взлома двумя способами.
Первый из них заключается в том, что в начало программы вставляется некоторый код, выполняющий настройку программы и устанавливающий в определенное состояние аппаратуру и некоторые «неиспользуемые» участки памяти. Для того чтобы этот настроечный код нельзя было прервать, его необходимо начать с команды CL1 и закончить командой STI. Сам настроечный код не должен содержать команд INT и до выдачи команды STI должен сам себя обнулить.
Второй способ существенно надежнее первого. Он реализуется с помощью специальных инструментальных средств CERBERUS KIT. В рамках данного подхода пользователь может сам регулировать степень защищен
Системы защиты от копирования 111
ности программ от снятия из памяти и создавать практически не вскрываемые программы. Эти средства позволяют пользователю защитить определенные участки его программы от изучения с помощью отладчиков. В данных участках пользователю предоставляется возможность выполнить следующие действия:
•	проверить характеристики ПЭВМ,
•	подсчитать контрольные суммы областей,
•	выполнить шифрование отдельных частей программы. Исключить данные участки из программы без потери ее работоспособности хакер не сможет.
Таким образом, даже сняв защищенную с помощью инструментальных средств CERBERUS KIT программу из памяти, хакер не сможет ею воспользоваться — копия программы будет работоспособной только на той ПЭВМ, на которой программа была установлена.
4.5.	КАК СКОПИРОВАТЬ ЗАЩИЩЕННУЮ ОТ КОПИРОВАНИЯ ДИСКЕТУ
Все программисты, занимающиеся вскрытием защит, в основном идут по пути преодоления систем защиты от отладчиков, чтобы выполнить модификацию тех частей программы, которые отвечают за проверку легальности копии. Такой метод является достаточно трудоемким. Другой значительно менее трудоемкий метод заключается в копировании ключевой дискеты. Как было показано в подразд. 4.3.1, система защиты предполагает наличие дискеты, называемой ключевой и не копируемой стандартными средствами, а также специальными программами или аппаратурой для копирования. В настоящем разделе для подкрепления чисто умозрительных рас-суждений подразд. 4.4.1 о возможности копирования ключевых дискет мы покажем как в течение 5...7 минут изготовить копии ключевых дискет некоторых не продаваемых в настоящее время систем защиты от копирования. Если Вы хотите присоединиться к нам в этом увлекательном мероприятии, то Вам потребуется лишь широко распространенные программы COPYWRITE издания март 1987 г. и DISK EXPLORER издания апрель 1987 г.
112
Глава 4
В качестве примеров рассмотрим следующие четыре системы.
JAWS. Реклама на систему защиты от копирования JAWS утверждает, что созданные ею дискеты не копируются программой COPYWRITE. Это утверждение не соответствует действительности. Система JAWS записывает некоторую информацию на поверхность 0 цилиндра 42. Мы не будем рассказывать, как и какой именно формат записывается на этот цилиндр, поскольку Вы можете запустить программу COPYWRITE и, указав максимальный копируемый цилиндр 42, получить работоспособную копию защищенной дискеты. Естественно, дискета легко копируется с помощью платы COPYIIPC DELUXE OPTION BOARD (в дальнейшем изложении будем называть ее для краткости просто OPTION BOARD), если вы укажете, что копирование осуществляется до цилиндра 42. При работе с платой достаточно сначала скопировать дискету с помощью обычной программы DISKCOPY, а затем с помощью платы скопиро- ; вать цилиндр 42.
НОТА. Авторы этой системы также решили расположить информацию о защите на инженерном цилиндре. В отличие от системы JAWS они решили использовать цилиндр 41. Однако программа COPYWRITE успешно копирует и эту дискету. Дискета, естественно, легко копируется с помощью платы OPTION BOARD.
SHIELD. В сборнике, составленном по заказу фирмы Элиас — разработчика системы SHIELD, говорится: «по оценке экспертов США и Канады эта система защиты превзошла известные программы фирмы Soft Guard и стала эталоном в СССР». Рассмотрим эталон более детально. Авторы системы SHIELD не пошли проторенным путем применения инженерного цилиндра. Они использовали свободное пространство на цилиндрах 0, 1 и 2 для размещения информации о ключевой дискете. Дискета не копируется напрямую программой COPYWRITE. Однако после копирования программой COPYWRITE достаточно немножко помочь программой DISK EXPLORER и Вы получите работоспособную копию. Дискета копируется с помощью платы OPTION BOARD. Мы рекомендуем Вам при использовании платы
Системы защиты от копирования
113
скопировать сначала дискету программой DISKCOPY, а затем скопировать платой цилиндры 0...2.
Для получения работоспособной копии дискеты после копирования программой COPYWRITE Вам следует воспользоваться программой DISK EXPLORER. Приведем пошаговую инструкцию по работе с программой DISK EXPLORER при копировании дискеты системы SHIELD.
Установите оригинальную дискету в НГМД. Вызовите программу DISK EXPLORER. Перед Вами появится первый экран:
Recover file	a:	
Read directory	a:	
Read layout	a:	«-выберите номер НГМД клавишами
Sides	2	+/-
Diskette type	low	density
Position	0.0.	.0
Analyze track brief «-выберите режим brief и нажмите клавишу Ввод
Перед вами появится второй экран:
pos	arc	C	H	R	N	SC	cluster flags
9	37.8	0	0	1	2	2	
47	37.8	0	0	2	2	2	
85	37.7	0	0	3	2	2	
122	37.7	0	0	4	2	2	
160	37.7	0	0	5	2	2	
198	37.8	0	0	6	2	2	
236	37.7	0	0	7	2	2	
273	37.8	0	0	8	2	2	
311	37.8	0	0	9	2	2	
349	20.2	0	0	11	6	1	Sh «- установите сюда
курсор и нажмите клавишу Ввод
Перед вами появится содержимое сектора. Сохраните его в буфере по команде Ctrl-Fl. Затем вернитесь на предыдущий экран, нажав клавишу Esc. Установите дискету, скопированную программой COPYWRITE. Повторите действия для второго экрана. Восстановите данные из буфера по команде CtrlF2. Перед вами появится картинка, похожая на следующую, хотя некоторые значения на ней могут быть другими.
114
Глава 4
ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ9 99999 99999999999999999999999998 MX3# Х2)$99 99999999999999999998 #44?}fT (1д#$е%*
установите курсор в эту позицию
Вы должны установить курсор примерно на 4...5 позиций дальше второй повторяющейся группы символов.
Нажмите клавишу F8 (короткая запись) и подтвердите запрос на короткую запись нажатием клавиш Ctrl-S. На этом копирование дискеты закончено и Вы можете выходить из программы DISK EXPLORER.
INST FD (PROTECT). Авторы этой защиты записывают нестандартную информацию на цилиндры 0 и 41. Дискета легко копируется с помощью платы OPTION BOARD. Для копирования этой дискеты Вам потребуется больше времени, чем для копирования предыдущих защит. При этом Вы будете пользоваться только программой DISK EXPLORER.
Выполните форматирование дискеты, на которую будет копироваться исходная дискета. Запустите программу DISK EXPLORER и выберите данные на первом экране, как это делалось при копировании системы SHIELD.
После ввода и считывания формата дискеты Вы должны установить приемную дискету и нажать клавишу F7 (редактирование формата). Отредактируйте параметры форматирования (перемещение между параметрами производится стрелками «Влево» и «Вправо»). Вы должны установить в левой части экрана под символом N значение 1, под символом GPL — значение 255, а под символом D — значение 88, как показано в примере. Значения изменяются с помощью клавиш +/-.
Системы защиты от копирования
115
Edit Format
drive:track.head a:0.0
N SC GPL 0 kind 1 11 255 88
tiaing consistency +.09 X track est imate	6243
key
PgUp PgDn Esc
F5 enter
purpose select field edit cojasand edit id 's return change field foraat track read sector
С	н	R	N	SC	flag
0	0	1	2	1	
0	0	2	2	1	
0	0	3	2	1	
0	0	4	2	1	
0	0	5	2	1	
0	0	6	2	1	
0	0	7	2	1	
0	0	8	2	1	
0	0	9	2	1	
0	0	11	6	1	Sh
123	17	249	7	1	Sh
Теперь нажмите клавишу F5 (форматирование) и подтвердите желание выполнить операцию форматирования нажахием клавиш CTRL-F. Аналогичную операцию Вам необходимо проделать для цилиндра 41. Номер цилиндра выбирается на первом экране.
Для цилиндра 41 Вам следует переписать сектор, у которого в столбце R (см. предыдущий экран) установлено значение 1. Это можно сделать с помощью программы DISK EXPLORER. Прочитайте сектор с исходной дискеты. Для этого установите исходную дискету и нажмите клавишу «Ввод», установите курсор напротив этого сектора. Запомните данные в буфере по команде Ctrl-Fl. Теперь установите приемную дискету и прочитайте этот же сектор. Восстановите данные из буфера по команде Ctrl-F2 и выполните запись сектора по команде F5, при этом подтвердите разрешение записи по команде Ctrl-W.
Для цилиндра 0 Вам следует переписать все сектора, у которых в столбце R (см. предыдущий экран) установлено значение 1...9. Вы можете это сделать аналогичным образом или воспользоваться любой программой посекторного копирования.
116
Глава 4
4.6.	АНАЛИЗ ФОРМАТОВ КЛЮЧЕВЫХ ДИСКЕТ
В настоящее время на рынке программных средств идет настоящая «война форматов». Это объясняется тем, что наиболее простой способ взлома хакером систем защиты состоит в копировании ключевой дискеты. Поэтому стойкость к взлому системы определяется в первую очередь именно стойкостью созданных ключевых дискет. Проведем анализ форматов ключевых дискет ряда отечественных систем защиты от копирования. Этот раздел предназначается для достаточно подготовленного читателя. По крайней мере от него требуется знание формата IBM System 34 Format, команд и принципов работы контролера НГМД для IBM PC. Предвидя возможные возражения относительно публикации форматов ключевых дискет, мы хотим сказать следующее. Сама по себе информация о формате ключевой дискеты не делает систему менее защищенной. Действительно, для не специалиста это китайская грамота. Необходимо еще очень много знать, чтобы воспользоваться данной информацией для создания копии ключевой дискеты. Сделать это может только специалист. Однако если за дело взялся специалист, то он всегда сможет получить информацию о формате ключевой дискеты и с помощью широко распространенных программ (типа DISK EXPLORER) и...
Настоящий раздел написан на основе анализа ключевых дискет, создаваемых рядом отечественных систем. По мнению авторов материал данного раздела может оказаться полезным для понимания основных принципов создания дискет, не копируемых стандартными или некоторыми специализированными средствами. Вместе с тем приводимые ниже форматы достаточно просто копируются с помощью платы COPYIIPC DeLuxe Option Board (в дальнейшем Option Board) и поэтому не могут служить действительно надежной основой при проектировании систем. Плата Option Board поставляется совместно с программным обеспечением, управляющим ее работой, и осуществляет высокоточное побитное копирование дискет. Плата вставляется в разъем шины и подключается в интерфейс между контроллером НГМД и собственно НГМД. Стоимость платы около 150 долл. Вся процедура копирования ключевой дискеты с помощью платы занимает не более 10
Системы защиты от копирования
117
минут. Разработка форматов, не копируемых с помощью платы, является достаточно сложным делом, требующим понимания работы как контроллера НГМД, так и платы. Однако только такие форматы действительно надежно защищают ключевую дискету от копирования. На рынке отечественных программных средств единственной системой, создающей не копируемые платой Option Board ключевые дискеты, является CERBERUS.
JAWS. Формат информации о ключевой дискете следующий. Дорожка 0 цилиндра 42 форматируется на 9 секторов с обычными параметрами (GAP = 80, N = 2). При форматировании применяется метод нарушения последовательности секторов. Первый сектор на дорожке имеет номер 11, остальные сектора — последовательные номера от 2 до 9. Следует отметить, что программа проверяет только наличие сектора с номером 11 путем считывания сектора с этим номером. Поэтому достаточно иметь на ключевой дорожке лишь обычный сектор с номером 11.
НОТА. В системе применен более любопытный формат ключевой дорожки, по сравнению с форматом системы JAWS. На дорожке используется один из вариантов метода нарушения значений параметров CHRN. Метод состоит в следующем. Ключевая дорожка форматируется на 10 секторов с параметрами GAP = 16, N = 2. В поле N всех секторов записываются значения 3. Перезаписывается сектор с номером 1. Это приводит к затиранию маркера идентификатора следующего сектора. На дорожке остается девять секторов. Значения CHRN затираемого сектора не имеют принципиального значения. Номера оставшихся секторов нумеруются обычным образом от 1 до 9. В сектор с номером 1 записывается информация о ключевой дискете.
Как и в предыдущей системе JAWS, проверяется только наличие сектора с номером 1 (R = 1) и N = 3 и считывается из него информация. Поэтому на ключевой дорожке достаточно иметь только этот сектор и записанную в него информацию. Остальные сектора не проверяются. Копирование проще всего сделать, отформатировав ключевую дорожку дискеты-копии на сектор 1 с параметром N = 3 и записав в него информацию
118
Глава 4
из сектора 1 ключевой дорожки оригинальной дискеты.
Следует отметить, что авторы не использовали дополнительный контроль примененного формата. Чтение секторов с номерами 2, 3, ... , 8 и анализ информации в них позволяет контролировать размер GAP3, заданный при форматировании. Информация сектора с номером 9 позволяет определять и контролировать длину дорожки. При этом авторы получили бы защиту от копирования программой COPYWRITE.
SHIELD. На дискете применяется метод форматирования с кодом длины 1. Рассмотрим формат ключевых дорожек. Все ключевые дорожки форматируются на 19 секторов с N = 1 и размером поля GAP3 от 3 до 7. В данном случае длина поля GAP3 не имеет значения, так как она не проверяется. В нечетных секторах в CHRN устанавливается N = 2 и номера секторов R принимают последовательные значения от 1 до 9. Перезапись этих секторов затирает адресные маркеры идентификаторов примыкающих секторов и получается стандартный формат с N = 2 и номерами секторов R от 1 до 9. Последний сектор используется для контроля информации о ключевой дискете.
На цилиндре 0 последний сектор имеет параметры N = 6 и R = 11 и используется для контроля длины дорожки. При чтении этого сектора можно получить длину GAP4B и увидеть начало дорожки. На цилиндрах 1 и 2 последний сектор имеет параметры N = 1 и R — 10. В эти сектора записывается информация о ключевой дискете.
Для получения работоспособной копии дискеты после копирования программой COPYWRITE Вам следует воспользоваться программой DISK EXPLORER. При этом необходимо скорректировать последний сектор цилиндра 0, чтобы программа проверки ключевой дискеты получила необходимые данные при чтении этого сектора. Для этого необходимо прочитать ключевой сектор с оригинальной дискеты и выполнить короткую запись этого сектора на дискету-копию. Длина записываемых данных должна быть достаточной для перезаписи поля GAP4B и всех данных начала дорожки. Чтобы при короткой записи не затереть маркер идентификатора первого сектора на дорожке, рекомендуем при форматировании ключевой дорожки на цилиндре 0 использовать маленький
Системы защиты от копирования 119
размер поля GAP (порядка 3). Это обеспечит достаточно большую длину GAP4B и необходимое место для записи данных, контролируемых программой. Не забудьте переписать содержимое других секторов на этих дорожках, так как в них содержится информация для работы системы DOS.
PROTECT — INST_FD. На дискете применяется метод форматирования с длиной 1. Помимо этого, для запутывания программ COPYIIPC и COPYWRITE применяется метод увеличения длины последнего сектора. Этот формат имеет следующие характерстики.
Формат одинаков для цилиндров 0 и 41. Форматирование выполняется на 11 секторов с N = 1, GAP = 255 и символом-заполнителем формата «X». Первые 9 секторов имеют стандартные R от 1 до 9 и N = 2. Предпоследний CHRN имеет R = 11 и N = 6. У последнего сектора поля CHRN соответственно равны 123, 17, 249 и 7. Полученный формат при работе с секторами от 1 до 9 имеет «отрицательный» GAP3, так как форматирование выполняется с кодом длины 1, а операции с секторами выполняются с кодом длины 2. При этом поле CRC сектора залезает на SYNC адресного поля маркера идентификатора следующего сектора. В первом секторе цилиндра 41 записывается информация о ключевой дискете, а сектора 2, 3, ... , 9 заполняются символами F6h, что должно маскировать их под обычный формат.
Вместе с тем из всего объема ключевой информации авторы проверяют только информацию из первого сектора на цилиндре 41. Поэтому при копировании достаточно создать обычный сектор с номером 1 на цилиндре 41 и переписать туда ключевую информацию.
Авторы не использовали дополнительных возможностей контроля информации о ключевой дискете. Анализ данных при чтении предпоследнего сектора на ключевых дорожках позволяет контролировать размер поля GAP3 и символ-заполнитель, использованные при форматировании, а также параметры CHRN последнего сектора на дорожке и длину дорожки.
CONVOY. Анализ проводился на основе ключевой дискеты. Самой системы в распоряжении не было. Дискета не копируется программами COPYWRITE и
120
Глава 4
COPYIIPC, но успешно копируется с помощью платы OPTION BOARD. Все дорожки форматируются стандартным образом. Информация о ключевой дискете в системе располагается в поле GAP 3 сразу за полем CRC первого сектора на цилиндре 0 дорожки 0.
Рассмотрим способ построения ключевой дискеты. Для создания дискеты может быть применен метод прекращения операции контроллера. Выполняется «короткое» форматирование на один сектор дорожки 0 цилиндра 0 с прекращением операции в поле GAP 2. Параметры CHRN сектора следующие: С = 0, Н = 0, R = I и код длины сектора N = 3. Такое форматирование полностью сохраняет данные на дискете, но позволяет перезаписывать данные сектора, включая данные поля GAP 3. Затем выполняется «короткая» запись данных ключевого сектора, причем записывается поле данных сектора, поле CRC и данные поля GAP 3. Прекращение операции выполняется в поле GAP 3 после записи информации о ключевой дискете. Затем выполняется «короткое» форматирование на один сектор дорожки 0 цилиндра 0 с прекращением операции в поле GAP 2. Параметры CHRN сектора следующие: С = 0, Н = 0, R = 1 и код длины сектора N = 2. Такое форматирование восстанавливает исходный формат дорожки.
SOFT LOCK. Формат дискеты системы SOFT LOCK строго идентичен формату системы CONVOY.
SUPER GUARD. Система SUPER GUARD использует схему защиты, сходную со схемами систем CONVOY и SOFT LOCK, но для хранения информации о ключевой дискете используется поле GAP 3 первого сектора дорожки 0 цилиндра 1. Помимо этого, авторы системы для усиления эффективности защиты при работе на дисководах, поддерживающих 80 цилиндров (дисководы 1,2 Мб), записывают данные на цилиндр, не используемый при форматировании дискеты на 360 Кб. Дорожка 0 цилиндра с абсолютным номером 31 (для накопителя, обеспечивающего 80 цилиндров) форматируется с параметрами GPL - 84, N = 1, Н = 0 на 9 секторов с номерами секторов R соответственно 1, 2, 3, 244, 5, 6, 7, 10, 9. Ключевые данные записываются в сектор с номером R, равным 244. Такой метод позволяет защитить дискету от копирования с помощью платы
Системы защиты or копирования 121
OPTION BOARD при использовании на дисководах 1,2 Мб (на дисководах 360 Кб копия дискеты, естественно, работает). Это объясняется тем, что с помощью платы OPTION BOARD промежуточные цилиндры для дискет емкостью 360 Кб не копируются.
GUARD. Анализ проводился на основе ключевой дискеты. Самой системы в распоряжении не было. Дискета не копируется программами COPYWRITE и COPYIIPC, но успешно копируется с помощью платы OPTION BOARD.
Авторы системы не отказали себе в удовольствии использовать инженерные цилиндры. Вместе с тем ключевая информация расположена практически на всей дискете.
Дорожки 0 цилиндров 0, 1 и 2 форматируются обычным образом на 9 секторов. Остальные дорожки всех цилиндров, включая цилиндр 41, форматируются на 5 секторов с параметрами GPL = 192, кодом длины сектора N = 3, символом-заполнителем формата 42 и номерами секторов R соответственно равными 1... 5. При этом данные записываются во все сектора дорожки 0 на всех цилиндрах. На дорожке 1 данные записываются в сектора только на цилиндрах 0... 2. Ключевые данные записываются и в сектор с номером 5 на дорожке 1 цилиндра 41. Все остальные сектора после форматирования не перезаписываются. Вполне возможно, что информация в эти сектора не записывалась, поскольку объем защищаемых данных был меньше.
STAS-3. Анализ проводился на основе ключевой дискеты. Самой системы в распоряжении не было. Автор системы Стас Ляшев (см. систему НОТА) не отказался от идеи использования инженерных цилиндров. Ключевая информация располагается на поверхности 0 цилиндра 41. Дорожка форматировалась на 3 сектора с кодом длины сектора 2 (стандартный сектор 512 байт), GAP = 84 и символом-заполнителем 246. Значения полей CHRN секторов следующие: (41,0,11,2), (41,0,12,2) и (41,0,99,3). В последний сектор (с кодом длины 3) записана информация о ключевой дискете. Для получения работоспособной копии информацию из последнего сектора ключевой дискеты необходимо переписать в соответствующий сектор дискеты-копии.
122
Глава 4
Дискету крайне легко копировать с помощью программы DISK EXPLORER, а те, кто умеет работать с дискетами через систему BIOS, с легкостью напишут программу копирования этой дискеты.
ALFA — 2.05 (RAIZOR). Система ALFA тоже использует крайне простой формат ключевой дискеты. Поверхность 0 цилиндра 39 отформатирована на 19 секторов с кодом длины сектора 1 (сектор 256 байт), GAP = 10 (точно не анализировали за ненадобностью) и символом-заполнителем 246. Значения CHRN первых 9 секторов: С = 39, Н = 0, R “ 1-9 и N = 1. Остальные 10 секторов имеют нулевые значения во всех полях CHRN. Ключевая информация записана в секторе 1. Вообще говоря, для копирования дискеты достаточно отформатировать соответствующую дорожку дискеты-копии на сектор 1 с кодом длины 1 и параметрами CHRN=(39,0,1,1) и перезаписать в этот сектор информацию из ключевой дискеты.
Дискету крайне легко копировать с помощью программы DISK EXPLORER. Если Вы умеете работать с дискетами средствами системы BIOS, то написать программу копирования ключевой дискеты с помощью этих средств не составит труда.
ЕСР. Авторы этой системы утверждают, что она гораздо «круче» систем COP’s COPYLOCK и CERBERUS. Делать такие заявления надо весьма осмотрительно. Авторы как разработчики системы CERBERUS, весьма положительно относятся к неизвестным нам разработчикам системы COP’s COPYLOCK, так как в ней применены простые, но весьма и весьма эффективные средства создания ключевой дискеты. Спор может идти только вокруг стойкости защиты от отладчика и возможности выпуска ключей на различных ПЭВМ. Защиту от отладчика COP’s COPYLOCK делает весьма слабо. Для того чтобы выпустить ключевую дискету с помощью COP’s COPYLOCK, нужно долго искать подходящую ПЭВМ. Помимо этого COP’s COPYLOCK страдает тем, что ключевая дискета может неустойчиво опознаваться (даже в НГМД, в котором она была создана).
Авторы системы ЕСР, похоже, не пошли дальше использования средств BIOS при создании ключевой
Системы защиты от копирования 123
дискеты. Информация о ключевой дискете располагается на инженерных цилиндрах. Поверхность 0 цилиндра 40 форматировалась на 30 секторов с кодом длины сектора 0, полем GAP порядка 10 (это достаточно) и символом-заполнителем 11. В первом, четвертом, седьмом и других секторах в поле CHRN устанавливается N = 2 и номера секторов R принимают последовательные значения 1 ... 9. Перезапись этих секторов затирает адресные маркеры идентификаторов двух примыкающих секторов и получается стандартный формат с N - 2 и номерами секторов R от 1 до 9. Сектор 28 не затирается и для него в поле CHRN при форматировании устанавливается (40,0,10,1). В этот сектор записывается информация поля. После записи затирается адресный маркер идентификатора одного примыкающего сектора. В результате на дорожке остается один последний сектор, используемый для контроля поля GAP4B. Сектор имеет поле CHRN (40,0,11,2). Все это легко повторить с помощью программы DISK EXPLORER. Для сохранения длины поля GAP4B необходимо выполнить «короткую» запись информации из этого сектора с ключевой дискеты. О методе «короткой» записи рассказывалось при анализе системы SHIELD.
Информация о ключевой дискете располагается на поверхности 1 цилиндра 40. Там «наворочена» всякая ерунда со стандартными параметрами форматирования (число секторов 9, N - 2 и символ-заполнитель 11). Вся игра происходит на длине поля GAP и параметрах CHRN секторов. Анализ структуры дорожки и форматирование легко сделать с помощью программы DISK EXPLORER. Никакая дополнительная информация на эту дорожку не записывается.
FILE_PROTECTION. Информация о ключевой дискете располагается на инженерном цилиндре 40 поверхности 0. Дорожка форматировалась на 11 секторов с кодом длины сектора 1 и GAP = 232. В каждом случае используется свой символ-заполнитель. Способ его определения мы опишем ниже. При первичном форматировании СН секторов устанавливаются равными 40,0. Параметры R и N задаются следующим образом: (1,2),(16,0),(17,0),(9,2),(5,3),(6,3),(7,3),(8,3),(9,3),(10, 3),(11,3).
124
Глава 4
Затем производится запись в сектор с параметром RN (11,3), что приводит к затиранию первого сектора дорожки, потом запись в сектор с RN (10,3) ицт.д., включая запись в сектор с RN (9,2). В результате получается формат дорожки с тремя секторами с параметром RN (16,0),(17,0),(9,2). Теперь в сектор с RN (9,2) переписывается информация из соответствующего сектора ключевой дискеты.
Формат ключевой дискеты с системой FILE_PROTECTION аналогичен формату создаваемых с ее помощью дискет. Единственное отличие состоит в том, что на ключевой дискете с системой дополнительно отформатирован инженерный цилиндр 40 (поверхность 1) с параметром СН (40,1).
Разработчики системы не используют многие возможности создаваемого ими формата. Поэтому для получения ключевой дискеты достаточно выполнить форматирование на цилиндре 40 (поверхность 0) сектора 3 с кодом длины сектора 2, параметрами RN (16,0),(17,0),(9,2), GAP = 80 и перезаписать сектор с полем (9,2) с ключевой дискеты.
Для определения символа-заполнителя достаточно прочитать сектор с полем RN (17,0) с ключевой дискеты и посмотреть код первого символа, который в нем записан. Это и есть символ-заполнитель формата.
Все вышеперечисленные процедуры легко выполняются с помощью программы DISK EXPLORER.
Система без названия. Система защиты, название которой авторам неизвестно, анализировалась на основе дискеты, на которой была записана иформационно-поисковая система «ТРАНЗИСТОР». Очень приятно было обнаружить использование новых принципов создания ключевой дискеты (новых с точки зрения рассмотренных систем), явно требующих знания контроллера НГМД. Поздравляем разработчиков!!!
Поверхности 0 и 1 форматировались так, как описано для системы SHIELD в предыдущем обзоре. Однако последние сектора на дорожках использовались не для контроля поля GAP 4В. Они имеют R = 11 и N = бив них производилась «короткая» запись ключевой информации о ключевой дискете (использование N = 6 препятствует копированию этих секторов с помощью программы COPYIIPC, которая не умеет перезапись!-
Системы защиты от копирования
125
вать «короткие» сектора с таким кодом длины). Помимо этого информация хранится в поле GAP3 (как в системах CONVOY, SOFT LOCK).
По мнению авторов, это одна из лучших исследованных ими защищенных дискет.
Заключение. Результаты анализа вышеперечисленных форматов показывают однотипность используемых методов размещения информации о ключевой дискете в поле GAP3 (CONVOY, SOFTLOCK, SUPER GUARD). Это позволяет говорить о возможном заимствовании схемы построения ключевой дискеты. Впервые такая схема была применена в системе защиты разработанной кооперативом «Эклипс».
Исследованию подвергался еще ряд систем, не включенных в изложение. Приведем их краткое описание. Система, с помощью которой выполнялась защита русской версии пакета GEM фирмы Digital Research, копируется достаточно легко. Система защиты русификатора WINDOWS 3.0 (CYRWIN) не только легко копируется, но в ней очень просто изменить счетчик числа установок. Авторы анализировали еще ряд различных систем, названий которых и параметров форматирования уже не помнят, поскольку не обнаружили там принципиально новых идей.
4.7.	CERBERUS — СИСТЕМА ЗАЩИТЫ ПРОГРАММ ОТ КОПИРОВАНИЯ
Авторами книги разработана система, которая названа в память об известном действующем лице мифов Древней Греции — страшном псе Цербере, охранявшем врата в царство Анда.
При разработке системы основной акцент был сделан на противодействие не любителю, умеющему «снимать» защиту,, с таких же любительских систем, а взломщику-пРофессионалу, оснащенному такими средствами, как ^лата COPYIIPC DELUXE OPTION BOARD, и имеющему возможность изучения логики программы на процессах INTEL 80386, 80486 и т.д. Авторы старались избавить систему от указанных выше недостатков. По оцен
126
Глава 4
кам независимых экспертов система CERBERUS надежно защищает программы от взломщиков-профессионалов.
Система CERBERUS обеспечивает следующие возможности:
•	создание защищенных от копирования ключевых дискет размером 5,25 (емкость 360, 720 кб и 1,2 Мб) и 3,5” (емкость 720 кб и 1,44 Мб);
•	защиту файлов типа СОМ и EXE (в том числе и оверлейных), системных файлов (можно, например, защитить файлы системы DOS) и драйверов DOS;
•	создание из исходной программы ее защищенного варианта, проверяющего перед запуском наличие ключевой дискеты;
•	установку заданного числа копий защищенной программы на жесткий диск;
•	защиту защищенной программы от изучения с помощью отладчика;
•	защиту защищенной программы от модификации.
В рамках системы созданы инструментальные средства CERBERUS KIT, обеспечивающие дополнительную защиту на этапе разработки программы. Эти средства позволяют регулировать степень защищенности программы вплодь до «абсолютной» защиты.
Система предназначена для эксплуатации на компьютерах IBM/PC ХТ/АТ и PS/2, а также полностью совместимых с ними. Компьютер должен иметь встроенный накопитель на гибких магнитных дисках размером 3,5 (дискеты емкостью 720 кб и 1,44 Мб) или 5,25" (дискеты емкостью 360 и 720 кб и 1,2 Мб).
Система CERBERUS работает под управлением операционной системы DOS версий 3.3, 3.x, 5.x и совместимых с ними.
В рамках системы CERBERUS все перечисленные выше функции защиты от копирования (см. подразд 4.3.1) реализованы в полном объеме. Защита дискет от копирования осуществляется с помощью нестандартного форматирования дискеты и включения в защищаемый файл программы проверки нестандартного формата. При проверке нестандартного формата используется непосредственное обращение к контроллеру НГМД без применения функций системы BIOS, что препятствует раскрытию алгоритма проверки ключевой дискеты. При разработке системы CERBERUS особое внимание было уделено за
Системы защиты от копирования
127
щите от копирования создаваемых с ее помощью ключевых дискет платой COPY II PC DELUXE OPTION BOARD. При этом дискеты не копируются с помощью платы ни программой ТС, ни программой ТСМ, входящих в програмное обеспечение платы. На ключевых дискетах полностью сохраняются стандартные формат и емкость.
Установка программных продуктов на НЖМД производится путем привязки к характеристикам персонального компьютера, которые не изменяются при сопровождении (форматировании, уплотнении, разбиении на логические разделы и т. д.), поэтому архивные копии защищенных программ можно создавать обычными средствами сохранения/восстановления. При установке корректируется счетчик установок. После установки на НЖМД Вы можете копировать защищенную программу на любую дискету и запускать на Вашем персональном компьютере с дискеты или с НЖМД, но не можете запускать ее на других компьютерах.
Создание демонстрационных версий производится путем задания нулевого счетчика установок и разрешения запуска программы с защищенной дискеты. В этом случае программа не может быть установлена на НЖМД, но может быть выполнена при наличии в НГМД ключевой дискеты. Вы также можете просто переписать программу с защищенной дискеты на НЖМД и запускать ее оттуда, при этом средства защиты системы CERBERUS будут искать защищенную дискету на всех доступных накопителях на гибких дисках.
Защита программ от модификации производится с помощью шифрования исходных программ и подсчета контрольных сумм зашифрованных частей. Для шифрования используются ключи, задаваемые пользователем. Это предохраняет Ваши программы от любителей адаптации.
Защита от отладчиков является принципиальным моментом, позволяющим сохранить от любопытных взоров работу Вашей программы, а также препятствует определению алгоритма и ключей шифрования. Для защиты от отладчиков используются уникальные алгоритмы, рассчитанные на квалифицированных хакеров. Авторы системы CERBERUS помнят о проблеме процессора 80386, 1де возможно создание режима виртуального процессора 8086. Авторы помнят и об аппаратных отладчиках. Поэ
128
Глава 4
тому для решения проблемы защиты от отладчиков помимо стандартных приемов применяются сложные алгоритмы защиты. При этом из-за большого объема выполняемого кода процесс определения алгоритма шифрования и достижения точки запуска собственно программы является достаточно трудоемким, поэтому у любителя подглядывать резко возрастает вероятность ошибки. Естественно, возрастает объем защищенной программы, зато это окупается сложностью раскрытия программы. Система CERBERUS постоянно развивается и каждая новая версия будет иметь новые алгоритмы защиты.
Программы системы CERBERUS запоминают имя исходной защищаемой программы и при запуске проверяют его. Это препятствует изменению имени защищенной программы.
Система CERBERUS предоставляет Вам возможность для написания своих собственных программ установки. Программа установки обязана проверить режим работы процессора 80386 и прекратить установку при параметре IOPL, меньшем 3. Если Вы не являетесь специалистом по процессору 80386, то можете вообще запретить установку в режиме виртуального процессора 8086.
ПРИЛОЖЕНИЕ 1.
ПРОГРАММА КОНТРОЛЯ ВХОДА В ПЭВМ С ПОМОЩЬЮ КОМАНДЫ SHELL
Авторские права 2В Programmers Group, 1991
ИМЯ: PWLOAD.COM - Контроль входа в ПЭВМ
Транслятор - OPTASM
ФУНКЦИИ: Программа запрашивает пароль и загружает файл COMMAND.COM
ВХОД: См. примечание
ВЫХОД: Нет
ПРИМЕЧАНИЕ:
Запускается из файла CONFIG.SYS с помощью команды SHELL: SHELL=[d:][path]PWLOAD.COM pathcom [параметры для файла COMMAND.COM], где pathcom - полная спецификация пути для поиска файла COMMAND.COM
code	segment	
assume org	cs :code,ds:code.es:nothing lOOh
start:	
; область для загрузки файла COMMAND.COM	
ComArea db	50*1024 dup(?)
ComAreaEnd	label byte
org	ComArea
; начало программы	
J nip	init
; пароль	
pass db	'p' xor Daah
db	'a' xor Oaah
db	’s’ xor Oaah
db	s’ xor Oaah
db	'w' xor Oaah
db	'o' xor Oaah
db	'r' xor Oaah
db	'd' xor Oaah
pass_sz	=	$-pass
Pass_len	dw	pass_sz
; параметры для	загрузки файла COMMAND.COM
Parmtbl label	word
Prgseg dw	0
Zero dw	0
; поле для полного имени файла COMMAND.COM	
c°mfile db	129 dup (0)
9
130 Приложение 1
; имя файла COMMAND.COM com_spec db 'COMMAND.COM' com_len =	$-com_spec
org	ComAreaEnd
; исполняемый код i n i t: cld
; установим видеорехим		;область данных системы BIOS	
push mov mov mov	es ax,40h es.ax bl,byte ptr es:		
		[63h]	
and	bl.OfOh pop	es mov	ax,3 cmp	bl.ObOh jne	SegNonMono mov	ax,7 SegNonMono: int	lOh ; выведем приглашение mov	ah,InviteFi11 call	FillScreen lea	si.InviteMsg mov	dl,invite_col mov	dh,invite_row call	OutScreen ; введем и сравним пароль lea	di,pass mov	cx,pass_len next: mov	ax,0		;цветной режим монохроматический ? ; нет ;адрес пароля ;длина ;введем символ	
xor	al.Oaah scasb loope next je	passgood ; введен неправильный пароль ; выведем сообщение invpass: mov	ah.StoppedFill call	FillScreen lea	si,StoppedMsg mov	dl,stopped_col mov	dh,stopped_row call	OutScreen jmp	$ ; введен правильный пароль ; загрузим файл COMMAND.COM passgood: mov	di,81h mov	ex,128 ; символовнайдем первый непробел mov	al, ' '			;закроем ;сравним ;успешно ;пароль правильный установимся ;параметры ;число просматриваемь'*
Программа контроля входа с помощью SHELL
131
repe scasb
jcxz ComStop	;не найден
; найден непробел - это должен быть путь.
mov mov lea	si ,di al,ds: [si-1] di.comfile	;куда записывается ;первый символ пути ;куда записывается пут
; и имя программы		
fnd_path:		
stosb		
lodsb		
cmp	al,’ '	
jne	fnd path	
:если не хватает /, то добавим		
mov	byte ptr es:[di],’\'	;сразу запомним
cmp	byte ptr es:[di-1],’\’	;уже был / ?
je	yes slash	;да
inc	di	;мы его тоже добавили
; перешлем имя	файла COMMAND.COM	
yes_slash:		
lea	si,com_spec	;имя
mov	cx,com_len	;длина
rep movsb		; перешлем
; загрузим файл	COMMAND.COM	
mov	dx.cs	;наша область PSP
add	dx,10h	;сегмент для загрузки
mov	prgseg.dx	.•запомним в таблице
mov	al,3	;выполним
mov	ah,4bh	; загрузку
lea	dx.comfile	;имя программы
lea	bx.parm tbl	;параметры загрузки
int	21h	
jnc	all done	;успешно
; не найден файл COMMAND.COM		
ComStop:
mov	ah.ComnotFi11	
call	FillScreen lea	si.ComnotMsg mov	dl,comnot_col mov	dh.comnot row	
cal]	OutScreen jmp	J	
: выведем сообщение и передадим	управление файлу COMMAND.COM
all done:	
mov	ah.WelcomeFi11 call	FillScreen lea	si.WelcomeMsg mov	dl,welcome col	
mov	dh,welcome_row call	OutScreen call	wait p	;ожидание
Установим видеорехим push	es mov	ax,40h	;область данных системы BIOS
mov	es.ax	
132
Приложение 1
mov and	bl.byte ptr es:[63h] bl,OfOh	
pop	es mov	ax,3	;цветной режим cmp	bl.ObOh	.-монохроматический	? jne	SegNonMonol	;нет mov	ax,7 SegNonMonol: int	lOh ; передадим управление файлу COMMAND.COM jmp	start ; сообщения InviteMsg	label	byte invite_attr	db	Ofh invite_msg	db 'ENTER	PASSWORD’ invite len	=	$-invite msg db	0 invite_col	=	(80-invite_len)/2 ;колонка invite_row	=	12	;строка InviteFill	=	44h	;символ-заполнитель		
StoppedF i11 StoppedMsg stopped_attr stopped_msg stopped_len stopped_col stopped_row	=	44h	;символ-заполнитель label byte db	Ofh db 'PASSWORD INVALID ! SYSTEM HALTED !' =	$-stopped msg db	0 =	(80-stopped	len)/2 =	12	
ComnotF i11 ComnotMsg comnot_attr comnot_msg comnot_len comnot_col comnot_row	=	44h	;символ-заполнитель label byte db	Ofh db ’CANNOT LOCATE COMMAND.COM! SYSTEM HALTED! =	$-comnot msg db	0 =	(80-comnot	len)/2 =	12	
WelcomeF i 11 WelcomeMsg welcome_attr welcome_msg welcome_len welcome_col welcome_row	label db db ’ W db	22h	;символ-заполнитель byte Ofh E L C 0 M E ’ $-welcome msg 0 (80-welcome len)/2 12
; подпрограмма ожидания ; ждем число тактов, заданное в поле tick		
tick 01d8
dw 30 label dword
Программа контроля входа с помощью SHELL	133
old	8ip	dw	О
0]d	8cs	dw	О
-ait_P	Proc	near
push	ax
push	es
mov	ax,О
mov	es,ax
mov	ax,es:[08h*4+2]
mov	old_8cs,ax
mov	ax,es:[08h*4]
mov	old 8ip,ax
mov	es:T08h*4+2],cs
mov	es: [08h*4] .offset int_O8h
sti wait_loop: cmp	tick.O
jg	wait_loop
mov	ax,old_8cs
mov	es:[08h*4+2],ax
mov	ax,o1d_8ip
mov	es:[08h*4],ax
sti pop	es
pop	ax
ret int_08h: dec	cs:tick
int_08h_ret: jmp	cs:01d8
wait_p endp ; подпрог раина выводит на экран сообщение ; DS:[SI] - адрес сообщения (первый байт - первый сим-« вол-атрибут, последний байт - 0) ; DH - строка, DL - колонка
OutScreen proc cld push	ax
push	bx
push	ex
push dx	*
push	di
push	si
push	ds
push	es
mov	bx,40h
mov	es,bx
mov	cx,0b800h
mov	bl,byte ptr es:[63h]
and	bl.OfOh
cmp	bl.ObOh
134
Приложение 1
jne OutScreenSegNonMono mov	cx.ObOOOh
OutScreenSegNonMono: mov	es,cx
OutScreenCount: xor	ax,ax
mov	al,dh
mov	bl,80*2
mul	bl
mov	bx,dx
xor	bh,bh
shl	bx,l
add	ax.bx
mov	di,ax
lodsb cmp	a1,0
je	OutScreenStop
mov	ah,al
OutScreenSym: lodsb cmp	a 1,0
je	OutScreenStop
stosw jmp	OutScreenSym
OutScreenStop: pop	es
pop	ds
pop	si
pop	di
pop	dx
pop	ex
pop	bx
pop	ax
ret OutScreen endp
; подпрограмма заполняет заданным аттрибутом весь экран ; АН - аттрибут
FillScreen proc cld push	ax
push	bx
push ex	z
push	dx
push	di
push	si
push	ds
push	es
mov	bx,40h
mov	es.bx
Программа контроля входа с помощью SHELL
135
mov	cx,0b800h
mov	bl.byte ptr	es:[63h]
and	bl.OfOh
cmp	bl.ObOh
jne	Fi1IScreenSegNonMono
mov	cx.ObOOOh
mov	ah,0	;моноаттрибут
fillScreenSegNonMono:
mov	a!,0	;символ-запоАнитель
mov	es,cx
mov	ex,2000
mov	di,0
cld rep stosw pop	es
pop	ds
pop	si
pop	di
pop	dx
pop	ex
pop	bx
pop	ax
ret FillScreen endp
code ends
end start
ПРИЛОЖЕНИЕ 2.
ПРОГРАММА КОНТРОЛЯ ВХОДА В ПЭВМ С ПОМОЩЬЮ КОМАНДЫ DEVICE
Авторские права 2В Programmers Group, 1991
Транслятор - MASM 5.10
ИМЯ: PASSWORD.SYS - Разграничение доступа в ПЭВМ по паролю
ФУНКЦИИ: Три раза запрашивает пароль. Если введенный пароль правильный, то разрешает дальнейшую работу с ресурсами ПЭВМ. Если пароль неправильный, то доступ к ресурсам ПЭВМ блокируется. Для последующих попыток ввода пароля > требуется перезагрузить систему.
ВХОД: Нет
ВЫХОД: Нет
ПРИМЕЧАНИЕ: Для работы программы в файл CONFIG.SYS вставьте оператор DEVISE = PASSWORD.SYS. В исходном тексте программы "зашит" пароль top secret. Если необходимо поменять пароль, то следует поменять соответствующие определения байтов в этой программе и получить выполняемый модуль. Мохно такхе написатьпрограмму, помещающую пароль на нухное место в выполняемый модуль.
cseg segment para public 'code' assume cs:cseg.es:nothing
start:
заголовок устройства - device header
dd dw	-1 8000h	; последний драйвер ; символьный
dw	offset strat	; адрес основной процедуры
dw	offset intrp	; адрес процедуры обработки
		прерываний
db	. 1	; не используется
db	7 dup(?)	; не используется
;end dev. hed.		
rh_ptra label	dword	; для хранения адреса заголовка
		запроса
rh_ptro dw	7	
rh_ptrs dw	7	
cnt_err dw	3	; число попыток ввода пароля
enter label	byte	
db	22 dup(80h)	; 22 пробела
;кодирование	сообщения ENT	Е R
Программа контроля входа с помощью DEVICE 137
db	'E’+60H,80h,’li'+60H,80h.’T‘+60H,80h.
db	’E’+60H,80h,'R'+60H
db	4 dup(80h)	; 4 пробела
кодирование	сообщения PASSWORD
db	• P'+60H,80h,* A•+60H,80h.’S’+60H,80h.
db	’S'+60H,80h,’W’+60H
db	80H,’0’+60H,80h,’R’+6OH,8Oh,’D’+6OH
кодирование	перевода строки и конца собщения
db	10+60Н,13+60Н, ’{’+60Н
len_enter	equ	{-enter ; длина сообщения enter
reset label	byte
db	ZZ dup(806)	; ZZ пробела
кодирование	сообщения RELOAD
db	'R'+60h,806,'E'+60h,080h,'L'+60h.80h,’0’+60h,80h
db	’A’+60h,80h,’D’+606
db	6 dup(80h)	; 6 пробелов
кодирование	сообщения SYSTEM
db	'S’+60h,80h,’¥’+606.806,’S’+60h,80h.’T’+60h.80h
db	’E’+606,80H,’M’+60h
db	84h	; $ конец
len_reset	equ	{-reset ; длина сообщения reset
buf	label	byte	; буфер для приема пароля
db	Z0	; максимальный размер буфера
db	?	; текущий размер
db	20 dup (?)	; символы
password	label byte
db	’t’-40H.’o’-40H,'p’-40H,' ’-40h
db	’s’-40H,’e’-40H,’c'-40H,’r’-40H,’e’-40H,’t’-40H
1en_pas equ	{-password	; длина пароля
strat proc	far
mov	cs:rh_ptro.bx ; сохранение смещения заголовка
mov	запроса cs:rh_ptrs,es ; сохранение сегмента заголовка
ret strat endp intrp proc	запроса far
push	ds	; сохранение регистров
push	es	;
push	ах	;
push	Ьх	;
push	СХ	;
push	dx	;
push	di	;
push	si	;
cld	; направление вперед
Ids	bx,cs:rh ptга
push	ds
mov	ax.cs
mov	ds, ax
mov	es,ax
push bx	; сохранение	
138;Приложение 2
;	расшифрование	пароля
mov	cx,len_pas
mov	bx,0
loop_pas: add	byte ptr [password+bx],40h
inc	bx .
loop	loop_pas
;	расшифрование	приглашения	ENTER	PASSWORD
mov	cx.lenenter	>
mov	bx,0
loop_enter: sub	byte ptr [enter+bx] , 60h
inc	bx
loop	loop_enter
; расшифрование сообщения RELOAD SYSTEM mov	cx,len_reset
mov	bx,0
loop_reset: sub	byte ptr [reset+bx],60h
inc	bx
loop	loop_reset
pop	bx	; восстановление
mov	ex,word ptr cnt_err ; число повторений ввода
пароля
;	печать	приглашения	ENTER PASSWORD
print_enter_password: lea	dx,enter mov	ah,9h int	21h ; чтение пароля в буфер read_password:		-
push mov lea loop_read: mov	ex ex,len_pas di,buf+2 al,7h	; сохранить счетчик cnt_err ; длина пароля ; адрес буфера ' ; ввод без эха
mov int stosb	ah,Och 21h	; очистка и ввод символа ; ввод ; запись введенного символа буфер
loop	loop_read	; последний символ ? Нет
POP ;анализ пароля anal_password: lea lea push mov repe pop je badpassword: loop	ex	;	да - восстановить	счетчик ; cnt_err si,password	;	адрес пароля di,buf+2	;	адрес буфера ex	'	; сохранить ex,lon_pae empsb	;	совпало? ex	;	восстановить ok	;	да print_enter_password ; еще раз? Да	
Программа контроля входа с помощью команды DEVICE	139
reset need:		; нет
lea	dx,reset	
mov	ah,9h	
int	21h	
cli		; глухой
hit		; останов
ок:
	pop	ds	; восстановление
	mov	byte	ptr ds:[bx+13],0 ; подготовка к
	mov	word	ptr ds:[bx+14],0 ; выходу с освобох-
	mov	word	ptr ds:[bx+16],cs ; дениеи раияти
	POP	si	; восстановление регистров
	pop	di	t
	pop	dx	»
	pop	ex	t
	pop	bx	t
	pop	ax	»
	pop	es	r
	pop	ds	
	ret		
intrp	endp		
cseg	ends		
	end	start	
ПРИЛОЖЕНИЕ 3.
СТАНДАРТ ШИФРОВАНИЯ ДАННЫХ В США
Алгоритм шифрования данных разработан для зашифрования и расшифрования данных разрядностью 64 бит на основе 64-битового ключа. Расшифрование выполняется по тому же ключу, что и зашифрование, но этот процесс является инверсным по отношению к процессу зашифрования данных.
При описании алгоритма шифрования используются следующие обозначения. Если L и R — последовательности бит, то через LR будем обозначать конкатенацию последовательностей L и R, т. е. последовательность бит, размерность которой равна сумме размерностей L и R. В этой последовательности биты последовательности R следуют за битами последовательности L. Конкатенация битовых строк является ассоциативной, т. е. запись ABCDE обозначает, что за битами последовательности “А следуют биты последовательности В, затем С и т. д. Символом + будем обозначать операцию побитового сложения по модулю 2.
Процесс шифрования данных поясняется рис. П3.1. Сначала 64 бита входной последовательности перестанавливаются в соответствии с табл. П3.1. Таким образом, бит 58 входной последовательности становится битом 1, бит 50 — битом 2 и т. д.
Таблица П3.1. Начальная перестановка
58	50	42	34	26	18	10	2
60	52	44	36	28	20	12	4
62	54	46	38	30	22	14	6
64	56	48	40	32	24	16	8
57	49	41	33	25	17	9	1
59	51	43	35	27	19	11	3
61	53	45	37	29	21	13	5
63	55	47	39	31	23	15	7
Стандарт шифрования данных в США 141
Полученная последовательность бит разделяется на две последовательности: L(0) (левые или старшие биты) и R(0) (правые или младшие биты), каждая из которых содержит 32 бита. Затем выполняется итеративный процесс шифрования, который описывается следующими формулами:
L(i) = R(i-l), i= 1,2, ..., 16;
R(i)=L(i-l) +f(R(i-l),K(i)), i= 1, 2...16.
Функция f называется функцией шифрования. Ее аргументами являются последовательность R, полученная на предыдущем шаге итерации, и 48-битовый ключ K(i), который является результатом функции преобразования 64-битового ключа шифра. Подробно функция шифрования и алгоритм получения ключей K(i) описаны ниже.
На последнем шаге итерации будут получены последовательности Ц16) и R(16), которые конкатенируются в 64-х битовую последовательность R(16)L(16). Видно, что полученной последовательности 64 бита перестанавливаются в соответствии с табл. П3.2. Как легко видеть данная перестановка является обратной по отношению к начальной (см. табл. П3.1).
Таблица П3.2. Конечная перестановка
40	8	48	16	56	24	64	32
39	7	47	15	55	23	63	31
38	6	46	14	54	22	62	30
37	5	45	13	53	21	61	29
36	4	44	12	52	20	60	28
35	3	43	11	51	19	59	27
34	2	42	10	50	18	58	26
33	1	41	9	49	17	57	25
Полученная последовательность из 64 бит и будет являться зашифрованной входной последовательностью.
142
Приложение 3
1, 2....................................... 64
Рис. П3.1
Стандарт шифрования данных в США
143
Процесс расшифрования данных является инверсным по отношению к процессу шифрования. Все действия должны быть выполнены в обратном порядке. Это означает, что расшифровываемые данные сначала переставляются в соответствии с табл. П3.2, а затем над последовательностью бит R( 16)Ц 16) выполняются те же действия, что и в процессе зашифрования, но в обратном порядке. Итеративный процесс расшифрования может быть описан следующими формулами:
R(i-1) - Ц1), i = 1, 2, ..., 16;
L(i-l)=R(i) + f(L(i), K(i)), i - 1, 2, ..., 16.
На последнем шаге итерации будут получены последовательности L(0) и R(0), которые конкатенируются в 64-битовую последовательность L(O)R(O). В полученной последовательности 64 бита перестанавливаются в соответствии с табл. П3.1. Результат такого преобразования — исходная последовательность бит (расшифрованное 64-битовое значение).
Функция шифрования f(R,K) схематически показана на рис. П3.2. Для вычисления значения функции / используются функция Е (расширение 32 бит до 48), функции S(l), S(2), ..., S(8) (преобразование 6-битового числа в 4-битовое) и функция Р (перестановка бит в 32-битовой последовательности). Приведем определения этих функций. Аргументами функции шифрования являются R (32 бита) и К (48 бит). Результат функции E(R) есть 48-битовое число, которое складывается по модулю 2 с числом К. Таким образом, получается 48-битовая последовательность, которая рассматривается как конкатенация 8 строк длиной по 6 бит (т. е. В(\)В(2)В(3)В(4)В(5)В(Ь)В(1)В(Ь))-Результат функции S(i)(B(i)) — 4-битовая последовательность, которую будем обозначать Ц1). В результате конкатенации всех 8 полученных последовательностей L(i) имеем 32-битовую последовательность L == Ц\)Ц2)ЦЗ)Ц4)Ц5)Ц6)Ц1 )Ц8). Наконец, для получения результата функции шифрования надо переставить биты последовательности L. Для этого применяется Функция перестановки P(L).
144
Приложение 3
Рис. П3.2.
Функция расширения Е, выполняющая расширение 32 бит до 48, определяется табл. П3.2. В соответствии с этой таблицей первые три бита E(R) - это биты 32, Г и 2, а последние - 31, 32, 1.
Таблица ПЗ.З. Функция расширения Е
32	1	2	3	4	5
4	5	6	7	8	9
8	9	10	11	12	13
12	13	14	15	16	17
16	17	18	19	20	21
20	21	22	23	24	25
24	25	26	27	28	29
28	29	30	31	32	1
Стандарт шифрования данных а США 145
Функция S(i), которая преобразует 6-битовые числа в 4-битовые, определяется табл. П3.4.
Таблица П3.4. Функции преобразования S(i)
S1
14	4	13	1	2	15	И	8	3	10	6	12	5	9	0	7
0	15	7	4	14	2	13	1	10	6	12	11	9	5	3	8
4	1	14	8	13	6	2	И	15	12	9	7	3	10	5	0
15	12	8	2	4	9	1	7	5	И	3	14	10	0	6	13
								S2							
15	1	8	14	6	11	3	4	9	7	2	13	12	0	5	10
3	13	4	7	15	2	8	14	12	0	1	10	6	9	И	5
0	14	7	И	10	4	13	1	5	8	12	6	9	3	2	15
13	8	10	1	3	15	4	2	И	6	7	12	0	5	14	9
								S3							
10	0	9	14	6	3	15	5	1	13	12	7	11	4	2	8
13	7	0	9	3	4	6	10	2	8	5	14	12	11	15	1
13	6	4	9	8	15	3	0	11	1	2	12	5	10	14	7
1	10	13	0	6	9	8	7	4	15	14	3	11	5	2	12
								S4							
7	13	14	3	0	6	9	10	1	2	8	5	И	12	4	15
13	8	И	5	6	15	0	3	4	7	2	12	1	10	14	9
10	6	9	0	12	11	7	13	15	1	3	14	5	2	8	4
3	15	0	6	10	1	13	8	9	4	5	11	12	7	2	14
								S5							
2	12	4	1	7	10	И	6	8	5	3	15	13	0	14	9
14	11	2	12	4	7	13	1	5	0	15	10	3	9	8	6
4	2	1	И	10	13	7	8	15	9	12	5	6	3	0	14
11	8	12	7	1	14	2	13	6	15	0	9	10	4	5	3
								S6							
12	1	10	15	9	2	6	8	0	13	3	4	14	7	5	11
10	15	4	2	7	12	9	5	6	1	13	14	0	11	3	8
9	14	15	5	2	8	12	3	7	0	4	10	1	13	11	6
4	3	2	12	9	5	15	10	и;	14	1	7	6	0	8	13
								S7							
4	11	2	14	15	0	8	13	3	12	9	7	5	10	6	1
13	0	И	7	4	9	1	10	14	3	5	12	2	15	8	6
1	4	И	13	12	3	7	14	10	15	6	8	0	5	9	2
6	11	13	8	1	4	10	7	9	5	0	15	14	2	3	12
								S8							
13	2	8	4	6	15	И	1	10	9	3	14	5	0	12	7
1	15	13	8	10	3	7	4	12	5	6	11	0	14	9	2
7	И	4	1	9	12	14	2	0	6	10	13	15	3	5	8
2	1	14	7	4	10	8	13	15	12	9	0	3	5	6	11
К табл. П3.4. требуются дополнительные пояснения. Каждая из функций S(i)(B) преобразует 6-битовый вход в 4-битовый выход по следующему алгоритму:
146
Приложение 3
*	первый и последний биты входной последовательности В определяют номер строки к;
•	второй, третий, четвертый и пятый биты последовательности В задают номер колонки I;
•	результат преобразования выбирается из строки к и колонки I.
Например, перепишем определение функции S( 1) в виде табл. П3.5.
Предположим, что В = 011011. Тогда S(1)(B) = 0101. Действительно, к = 1, I = 13. В колонке 13 строки 1 задано значение 5, которое и является значением функции 5(1) (011011).
Таблица П3.5. Функция преобразования 5(1)
Строка	Колонка															15
	0	1	2	3	4	5	6	7	8	9	10	И	12	13	14	
0	14	4	13	1	2	15	И	8	3	10	6	12	5	9	0	7
1	0	15	7	4	14	2	13	1	10	6	12	И	9	5	3	8
2	4	1	14	8	13	6	2	11	15	12	9	7	3	10	5	0
3	15	12	8	2	4	9	1	7	5	И	3	14	10	0	6	13
______________________I______________________________________________________________________________________________________________________________________________________________________________________________________
Функция перестановки бит P(L), также используемая для определения функции шифрования, задается значениями, приведенными в табл. П3.6. В последовательности L 32 бита перестанавливаются так, чтобы бит 16 стал первым битом, бит 7 -вторым и т. д.
Таблица П3.6. Функция перестановки Р
16	7	20	21
29	12	28	17
1	15	23	26
5	18	31	10
2	8	24	14
32	27	3	9
19	13	30	6
22	11	4	25
Чтобы завершить описание алгоритма шифрования данных, осталось привести алгоритм получения ключей K(i), i = 1> 2,...,16, размерностью в 48 бит. Ключи K(i) определяются по 64-битовому ключу шифра как это показано на рис. ПЗ.З.
Стан дар т шифрования данных в США
147
Рис. ПЗ.З.
148
Приложение 3
В начале над ключом шифра выполняется операция В, которая сводится к выбору определенных бит и их перестановке, как это показано в табл. П3.7. Причем, первые четыре строки определяют, как выбираются биты последовательности СО (первым битом СО будет бит 57 ключа шифра, затем бит 49 и т. д., а последними битами — биты 44 и 36 ключа), а следующие четыре строки — как выбираются биты последовательности DO (т. е. последовательность DO будет состоять из битов 63, 55, ..., 12, 4 ключа шифра).
Таблица П3.7.
Функция перестановки и выбора последовательности В
57	49	41	33	25	17	9
1	58	50	42	34	26	18
10	2	59	51	43	35	27
19	И	3	60	52	44	36
63	55	47	39	31	23	15
7	62	54	46	38	30	22
14	6	61	53	45	37	29
21	13	5	28	20	12	4
Как видно из табл. П3.7, для генерации последовательностей С(0) и D(0) не используются биты 8, 16, 24, 32, 40, 48, 56 и 64 ключа шифра. Эти биты не влияют на шифрование и могут служить для других целей (например, для контроля по четности). Таким образом, в действительности ключ шифра является 56-битовым.
После определения С(0) и D(0) рекурсивно определяются C(i) и D(i), i = 1, 2, ..., 16. Для этого применяются операции сдвига влево на один или два бита в зависимости от номера шага итерации, как это показано в табл. П 3.8. Операции сдвига выполняются для последовательностей C(i) и D(i) независимо. Например, последовательность С(3) получается посредством сдвига влево на две позиции последовательности С(2), а последовательность D(3) — посредством сдвига влево на две позиции последовательности D(2).
Следует иметь в виду, что выполняется циклический сдвиг влево. Например, единичный сдвиг влево последовательности C(i) приведет к тому, что первый бит C(i) станет последним и последовательность бит будет следующая: 2, 3, ..., 28, 1.
Стандарт шифрования данных в США
Таблица П3.8. Функции сдвига Si
149
Нойер	Количество
итерации	сдвигов влево
1	1
2	1
3	2
4	2
5	2
6	2
7	2
8	2
9	1
10	2
11	2
12	2
13	2
14	2
15	2
16	1
Ключ K(i), определяемый на каждом шаге итерации, есть результат выбора определенных бит из 56-битовой последовательности C(i)D(i) и их перестановки. Другими словами, K(i) = K(C(i)D(i)), где функция К определяется данными, приведенными в табл. П3.9.
Таблица П3.9. функция перестановки и выбора К
14	17	11	24	1	5
3	28	15	6	21	10
23	19	12	4	26	8
16	7	27	20	13	2
41	52	31	37	47	55
30	40	51	45	33	48
44	49	39	56	34	53
46	42	50	36	29	32
Как следует из табл. П3.9, первый бит Ki — это бит 14 последовательности C(i)D(i), второй — бит 17, последний — бит 32.
ПРИЛОЖЕНИЕ 4.
ПРОГРАММА ШИФРОВАНИЯ ОБЛАСТИ ПАМЯТИ С
ПОМОЩЬЮ ПРОГРАММНОГО ДАТЧИКА ПСЧ
ШИФРОВАНИЕ ОБЛАСТИ ПАМЯТИ
Авторские права 2В Programmers Group, 1991
ФУНКЦИИ.
Область памяти, указанная вызывающей программой, шифруется по специальному алгоритму (с использованием датчика ПСЧ). Поскольку алгоритм шифрования является обратимым (содержимое области памяти складывается с гаммой шифра по коианде "Исключающее ИЛИ"), расшифрование закодированной области памяти заключается в его повторном зашифровании (повторном подключении данной процедуры с теми хе параметрами).
ВХОДНЫЕ ПАРАМЕТРЫ.
Все параметры шифрования и характеристики кодируемой области памяти передаются на следующих регистрах: регистры ES:DI указывают на кодируемую область, а регистр СХ содержит длину этой области; регистр ВР содержит коэффициент А для получения очередного ПСЧ, используемого для шифрования области, регистр SI содержит коэффициент С, а регистр ВХ -начальное значение для запуска датчика ПСЧ.
ВЫХОДНЫЕ ПАРАМЕТРЫ.
После выполнения процедуры регистры ES:DI будут указывать на байт, следующий за обработанной областью, регистр СХ будет обнулен, а в регистр ВХ загружено ПСЧ. Остальные регистры не изменяются.
CRYPTO_MEMORY	PROC NEAR
push	ax	; сохранить рабочие
push cme_l: mov	регистры, dx ax.bx	; вычислить очередной
	коэффициент случайного числа.
mul add mov	Ьр ах, si Ьх,ах	; сохранить очередной
xor	коэффициент в регистре ВХ. BYTE PTR es:[di],al	; закодировать один
inc	di	; байт области.
loop	перейти к следующему байту кодируемой области. сте_1
POP	dx	; восстановить рабочие
pop	регистры, ах
ret CRYPTO_MEMORY	ENDP
ПРИЛОЖЕНИЕ 5.
ПРОГРАММА ШИФРОВАНИЯ ОБЛАСТИ ПАМЯТИ С
ИСПОЛЬЗОВАНИЕМ ДРУГОЙ ОБЛАСТИ
ШИФРОВАНИЕ ОБЛАСТИ ПАМЯТИ С ИСПОЛЬЗОВАНИЕМ ДРУГОЙ ОБЛАСТИ
Авторские права 2В Programmers Group, 1991
ФУНКЦИИ.
Область память, указанная вызывающей программой, шифруется по специальному алгоритму (с использованием датчика ПСЧ) на основе предоставляемого ключа шифра и информации в другой области памяти, которая в дальнейшем будет называться эталонной областью. Такой способ шифрования области памяти является разновидностью метода гаммирования с обратной связью.
Поскольку алгоритм шифрования является обратимым (содерхимое области памяти складывается с гаммой шифра по команде "Исключающее ИЛИ"), расшифрование закодированного участка памяти за ключается в его повторном зашифровании (повторном подключении данной процедуры с теми хе входными параметрами).
ВХОДНЫЕ ПАРАМЕТРЫ.
Все параметры шифрования и характеристики областей памяти передаются через следующие регистры:
регистры ES:DI указывают на шифруемую область, а регистр СХ содерхит длину этой области; регистр ВР содерхит коэффициент А для получения очередного ПСЧ гаммы шифра, а регистр SI - коэффициент С; регистры DS:BX адресуют эталонную область,а регистр АХ содерхит длину этой области.
ВЫХОДНЫЕ ПАРАМЕТРЫ.
После выполнения процедуры содерхимое регистров не изменяется..
EXTRA_CRYPTO PROC NEAR cld	; установить прямое
направление ;	цепочечных операций.
152
Приложение 5
		push	ax	; сохранить рабочие
г				регистры.
		push	bx	
		push	dx	
		push	si	
		push	di	
		push	ex	; сохранить длину
•				шифруемой области
•				и коэффициент С.
		push	si	
		push	ax	; сохранить длину
•				эталонной области.
		mov	si ,bx	; установить адресации
*				эталонной области.
		sub	bx.bx	; обнулить накопитель
•				контрольной суммы.
		mov	ex, ax	; получить длину
f				эталонной области
г				в словах.
		shr	ex, 1	
		jcxz	xc_2	; эталонная область
t				занимает
				один байт.
хс_	_1:	add	bx,cx	; подсчитать
				контрольную сумму
				эталонной области
				памяти.
		lodsw		
		mul	bp	
		add	bx,ax	
		adc	bx,dx	
		loop	xc_l	
хс_	2:	POP	ax	; восстановить длину
f				эталонной области. , г
		test	al,l	; в эталонной области
f				целое число слов?
		jz	xc_3	; да, переход.
		add	bl.BYTE PTR [si]	; учесть последний (или
				единственный) байт
				байт эталонной
				области.
хс	.3:	pop	si	; восстановить
				коэффициент С и
				длину шифруемой
				области.
		pop	ex	
		push	ex	; сохранить длину
				шифруемой области.
		shr	ex, 1	; получить длину
г				шифруемой области.
♦				в словах.
		jcxz	xc_5	; шифруется один байт.
хс_	.4:	mov	ax.bx	; вычислить очередной
»				коэффициент
Программа шифрования области памяти 153
	случайного числа.
mul	bp add	ах,si mov	bx,ах Г xor	WORD	PTR	es:[di],ax inc	di « inc	di loop	xc_4 xc_5: pop	ex	; сохранись очередной коэффициент в регистре ВХ. ; закодировать одно слово области. ; перейти к следующему слову кодируемой области. ; восстановить длину
test	cl,l jz	xc_6 xor	BYTE PTR es:[di],bl xc_6: pop	di	шифруемой области. ; в шифруемой области целое число слов? ; да, переход. ; зашифровать последний (или единственный) байт кодируемой области. ; восстановить рабочие
pop	si pop	dx pop	bx pop	ax ret EXTRA CRYPTO ENDP	регистры.
ПРИЛОЖЕНИЕ 6.
ПРОГРАММА "ДОПИСЫВАНИЯ" (ПО ВИРУСНОМУ ПРИНЦИПУ)
COM-ФАЙЛА К EXE- ИЛИ СОМ-ФАЙЛУ
Авторские права 2В Programmers Group, 1991
Транслятор - MASM 5.10
ИМЯ: COM2END.COM
ФУНКЦИИ:
Дописывает в конец EXE- или COM-файла, заданного первым параметром в командной строке, COM-файл, заданный вторым параметром в командной строке. Причем "дописывание" осуществляется так, что при последующих запусках файла, заданного вторым параметром, управление сначала будет получать первый файл, заданный первым параметром. В нем мохно проверять некоторое условие и при его выполнении перейти, например, к исполнению файла, заданного вторым параметром. Дописывание файла, заданного первым параметром, осуществляется так, что для этого перехода достаточно в файле, заданном первым параметром, выполнить конду Retf.
ВХОД:
Два файла, заданные в командной строке: исходный -source_file и назначения - target_file, который будет "присоединен" к исходному.
ВЫХОД:	Target_file, в который "присоединен"
source_f11е.
ПРИМЕЧАНИЯ.
1.	Эта программа является учебной: она не проверяет длину результирующего файла, если "дописывние" происходит к СОМ-файлу.
2.	Дописываемый COM-файл не является в полном смысле СОМ-файлом системы DOS.
3.	Для дописывания COM-файла к ЕХЕ-файлу с оверлейной структурой алгоритм необходимо немного модифицировать.
4.	В этом прилохении после программы C0M2END приводится программа PASSWORD.ASM. Если "дописать” программу PASSWORD.COM к некоторому файлу с помощью программы C0M2END, то при вызове ”обработанного”файла будет запрашиваться пароль. Если введенный пользователем пароль правильный, то будет осуществляться переход на началовыполнения обработанного файла. Если введенный пароль неправильный, то выход в систему DOS. Пароль запрашивается три раза.
Программа «дописывания» СОМ-файла
155
;code	segment public	
	assume	cs:code,ds:code,es:code;ss:code
	org	80h
dta	label	byte
com_siz	db	?
probe 1	db	?
com_par	db	7
	org	100h
start:	jmp	test_par
переменные
type_t	db	?	; тип расширения target
len_s	dw	?	; длина файла source_file
len_t_l	dw	?	; длина файла target_file
len_t_2	dw	?	; длина файла target_file
hand_l	dw	?	; обработка файла source_file
hand 2	dw	?	; обработка файла target_file
NameTarOff dw		?	; смещение имени target
NameSouOff dw		?	; смещение имени source
; допустимые расширения
ext_a db 'com'.'exe'
; выводимые сообщения
mbaduse db ’Используйте C0M2END без параметров для помощи.’ db 10,13,’$’
; Если пустая командная строка .
syn db ’Синтаксис для C0M2END следующий:’,10,13
db ’C0M2END <target_file> <source_file>',ID,13
db ’target_file должен иметь расширение EXE или COM,’
db 10,13
db ’source_file должен иметь расширение COM.’,10,13
db ’Комментарий:’,10,13
db ’ I. После успешного выполнения программы C0M2EHD’
db 10,13
db ’ source_file будет дописан’
db 10,13
db ’ в конец target_file. Файл target_file будет’
db 10,13
db ’ изменен так, что при’
db 10,13
db ’ его выполнении управление сначала передается’
db 10,13
db ’ файлу source_file.'
db 10,13
db ’ Когда файл source_file получает управление,* db 10,13 db ’ регистры и стек имеют следующие значения:’ db 10,13
db ’	1. CS:100Н=начало файла source_file;'
db 10,13
db '	2. ES=DS=cerMeHT PSP для файла target_file;’
db 10,13
db ’	3. 55=сегмент PSP для файла target_file,’
db 10,13
db ’	если файл target_file имеет тип COM;’
db 10,13
156
Приложение 6
db '	55=соответствующее значение из заголовка '
db 10,13	
db ' db 10,13	файла target_file, если файл target_file’
db ' db 10,13	имеет тип EXE;
db ’	4. SP=OFFFEH, если файл target_file имеет тип’
db 10,13	
db ' db 10,13	СОМ, '
db ' db 10,13	5Р=соответствующее значение из заголовка файла
db ’ db 10,13	target_f11е,'
db ' db 10,13	если файл target_file имеет тип EXE;'
db ' db 10,13	5. Два первых слова в стеке являются адресом '
db ’ db 10,13	начала файла target_file (поэтому команда Retf
db ' db 10,13	передаст управление в начало файла target_f11е).
db ' II. Используйте C0M2END ? для примера оформления* db 10,13 db ' программы.'
db '$’ Если в командной	строке знак "?"
db 'code	segment db 10,13	
db '	assume db 10,13	cs:code,ds:code,es:code;ss: code
db '	org db 10,13	100h'
db 'Start: jmp Prog ; переход на выполнение программы’ db 10,13
db ’;Данные для программы'
db 10,13
db 'Prog:
db 10,13
db db	';Начало 10,13	программы		t	
db db	1 10,13	push	es	; сохранение '	
db db	10,13	push	ds	; регистров '	
db db	* 10,13	push	cs	; адресация регистра	os
db db	* 10,13	POP	ds	»	
db db	10,13	push	cs	; адресация регистра	ES
db	•	POP	es		
db 10,13
db ';Тело программы, в которой при выполнении некоторого
Программа «дописывания» СОМ-файла
157
db 10,13		выход в DOS (метка DOS), a
db	';условия осуществляется	
db	10,13	
db	';при невыполнении - переход на начало файла'	
db	10,13	
db	‘target file (метка TAR).	
db	10,13	
db	';при невыполнении - переход на начало файла'	
db	10,13	
db	'target file (метка TAR).	»
db	10,13	
db	'TAR:	pop	ds	; восстановление '
db	10,13	
db	’	pop	es	; регистров'
db	10,13	
db	'	retf	; переход на начало файла
db	10,13	
db	'	target file'	
db	10,13	
db	'DOS:	mov	ax,4c00h	; выход в DOS с нулевым'
db	'кодом завершения'	
db	10,13	
db	'	int	21h '	
db	10,13	
db	’code	ends	
db	10,13	—
db	'	end	Start '	
db	•$	
mbad_l db 'ОШИБКА: Плохой файл target_f11е.’ db 10.13,'$'
mbad_l db 'Расширение должно быть СОМ или EXE.'
db 10,13,'$'
mmis_2 db 'ОШИБКА: Пропущен файл source_file.',10,13,'$' mbad_2 db 'ОШИБКА: Плохой файл source_file. ',10,13,'$' mbad_2 db 'Расширение должно быть COM.',10,13,’$'
mn_op_l ’DOS не может открыть файл target_file.',10,13,'$’ mn_op_2 db 'DOS не может открыть файл source_file.’,10,13,'$' mn_mov_l db 'DOS не может передвинуть указатель в',10,13,’$' mn_mov_l db 'файле source_file.’,10,13,'$'
mn_mov_2 db 'DOS не может передвинуть указатель в',10,13,'$’
mn_mov_2 db 'файле target_file.',10,13,'$’
mn_r_l db 'DOS не может ',10,13,'$'
mn_r_l db 'прочитать файл source file.',10,13,'$’
mn_r_2 db 'DOS не может',10,13,'J'
mn_r_2 db 'прочитать файл target file.',10,13,'$'
mn_r_2 db 'DOS не может',10,13,'I'
mn_w_l db 'записать в файл source_file.',10,13,'$'
mn_r_2 db 'DOS не может',10,13,'$'
4in_w_2 db 'записать в файл target_file. ' ,10,13,’$'
mn_cl_l db 'DOS не может закрыть файл target_file.',10,13,'$' mn_cl_2 db 'DOS не может закрыть файл source_file.',10,13,'$' mOK db 'Source_file дописан в конец файла target_file, причем' db 10,13
158
Приложение 6
db 'при выполнении*
db 10,13
db 'нового файла target_file управление передается на'
db 10,13,'$'
db 'начало файла source_file. ’
db 10,13,
; начало программы
TEST_PAR:
;	1. Проверка параметров в командной строке:
;	1.1. Найти первый отличный от пробела символ в
;	командной строке
	lea	si,dta+l	; первый символ
l_0:	cmp	byte ptr [s i] , Odh	; конец строки ?
	je cmp	c_syn byte ptr [si] , '?'	; да - синтаксис ; знак ?
	je cmp	c_h byte ptr [si] , ' ’	; пробел ?
	jne	not_prob	; нет
inc si
jmp short 1_0 сообщение с подсказкой
c_syn: mov	ah,9	
lea	dx,syn	
int	21h	
int	20H	
; сообщение о примере		
c_h:	mov	ah, 9	
lea	dx, h	
int	21h	
int	20H	
use:	mov	ah,9	;	нет
lea	dx.mbad use	
int	21h	
int	20H	
not prob:	Первый параметр правильный	?
;	1.2.		
mov	NameTarOff,si	;	запомнить начало имени target поиск начала расширения
1_1:		
cmp	byte ptr [si], Odh	;	конец строки ?
je	c_b_l_m_2	;	Да
cmp	byte ptr [si] , ’ '	;	следующий параметр ?
je	c_b_l	;	да
cmp	byte ptr [si], '. '	;	расширение ?
je	d_t_l	;	да
inc	si	
jmp	short 1_1	;	следующий символ
;	нет ни точки, ни пробела в командной строке
c_b_l_m_2: mov	ah,9
lea	dx,mbad_l
Программа «дописывания» СОМ-файла	159				
с_	_b	.1:	int	21h lea	dx,mmis_2 int	21h jmp	use недопустимое расширение mov	ah,9 lea	dx.mbad	1 int	21h jmp	use	у файла target-file
d 1 i. i. с_ d	_t. .2: .3: _m_ _t_	.2: .2:	анализ расширения inc	si	; первый символ расширения call	det_type pop	ax mov	type_t,al	;	сохранить cmp	ax,2 je	c_b_l	;	да add	si,3	;	нет -	нуль	для	ASCIIZ lea	cx.dta	;	конец	командной	строки add	cl,byte ptr dta adc	ch,0 cmp	ex,si	_	; конец? jbe	c_m_2	;	да mov	byte	ptr [si],0	;	нет 1.3. Второй параметр правильный? inc	si	;	указатель	на	первый ;	символ	второго ; параметра или пробел cmp	cx,si	;	конец	командной	строки? jb	c_m_2	;	да - отсутствует cmp	byte ptr [si],' '	; нет - пробел? je	1_2	;	да mov	NameSouOff,si	;	нет -	запомнить	начало ; файла source-file cmp	byte ptr [si],'.’	; расширение? je	d_t_2	;	да inc	si	;	нет cmp	ex,si	;	конец	? jb	c_b_2	;	Да jmp	13	•>	; нет отсутствует файл source_file mov	ah,9 lea	dx.mmis	2 int	21h jmp	use inc	si	;	первый символ ; расширения call	det_type	;	тип	COM ?	
160
Приложение 6
pop	ax	
cmp	ax, 0	
je	test_end	; может быть
c_b_2:		; нет
mov	ah,9	
lea	dx.mbad 2	
int	21h	
jmp	use	
test_end:		
add	si ,2	; расширение входит в ; командную строку?
cmp	ex, si	
jb	c_b_2	; нет
mov	byte ptr [si+l],0	; да - нуль для ASCIIZ
;	2. Откры ;	файл OPEN F:	ть, определить длину и source_file.	прочитать в буфер
		
;	2.1. Открыть		
mov	ah,3dh	; OPEN FILE
mov	al,2	
mov	dx,NameSouOff	; смещение имени
int	21h	
jnc	yes_open	; открывается? Да
mov	ah,9	; Нет - сообщение
lea	dx,mn op 2	
int	21h	
int	20h	
yes_open:	-	
;	2.2. Определить длину		
mov	bx,ax	; handler
mov	hand 2,ax	
mov	ah,42h	; move file point
xor	ex, ex	; нулевое
xor	dx.dx	; смещение
mov	al,2	; от конца
int	21h	
jnc	yes_p_l	; двигается ?
cn_mov_2:		
mov	ah, 9	; нет
lea	dx,mn mov 2	
int	21h	
int	20h	
;	2.3. Читать в буфер		
	установить указатель на начало	
yes_p_l:		
mov	word ptr len s,ax	; сохранить длину
mov	ah,42h	
xor	ex,ex	; нулевое смещение
xor	dx.dx	
mov	al,0	; от начала
int	21h	
jc	cn_mov_2	
	читать	
mov	ah,3fh	
Программа «дописывания» СОМ-файла
161
lea	dx.buff	
mov	ex,word ptr	len_s int	21h jnc	open_targ	
mov	ah,9 lea	dx,mn_r_l int	21h int	20h ;	3. Открыть файл target file OPEN_TARG: открыть	; нет
mov	ah,3dh mov	a 1,2	; OPEN FILE
mov	dx,NameTarOff int	21h	; смещение имени
jnc	det_len_l	; открывается? Да
mov	ah,9 lea	dx.mn op 1 int	21h int	20h ;	определить длину det_len_l:	; Нет - сообщение
mov	hand_l,ax	; сохранить обработчик ; handle_l
mov	bx,hand_l ~ mov	ah,42h xor	ex,ex	
xor	dx,dx mov	a 1,2 int	21h jnc	rest_len jmp	cn_mov_l rest_len:	
mov	len_t_l,dx mov	len_t_2,ax	; сохранить
;	4. Если файл targetfile - COM,	то CALL WR2COM.
;	Если файл targetfile - EXE, TO_PROC:	то CALL WR2EXE.
cmp	type_t,0	; СОМ ?
je	c_com	; да
call	wr2exe	; нет
jmp short CLOSE_F	; обход
c_com: call wr2com	
5. Закрыть файлы source-file и CLOSE_F: mov	ah,3eh mov	bx,hand_l int	21h jnc	cl_2 mov	ah,9 lea	dx,mn_cl_l int	21h int	20h c12: mov	ah,3eh	target-f ile.
и
162
Приложение 6
mov int jnc mov lea int int ; 6. Вывести OK: mov lea int int	bx.hand 2 21h OK ah, 9 dx.mn cl 2 21h 20h сообщения о завершении обработки файла, ah,9 dx.mOK 21h 20h
ПОДПРОГРАММЫ
ПОДПРОГРАММА dettype:
ВХОД: SI указывает на расширение
ВЫХОД: В стеке 0, если расширение СОМ, в стеке 1, если расширение EXE, в стеке 2, если другое расширение
det_type	proc	
mov	bp.sp	; адресация
push	ax	; сохранить
push	ex	
push	di	
xor	ax, ax	
lea	di,ext_a	t
loo_l: push	si	
push	di	
mov	ex, 3	
repe	empsb	
jne	end_loo_l	
pop	di	
pop	si	
mov	[bp+2],ax	
jmp	d_ret	f	 ,
end_loo_l:		
inc	al	
pop	di	
add	di,3	; следующий 3-байтный
		элемент
pop	si	; начало расширения
cmp	al,2	
jb	loo_l	
mov	[bp+2], ax	
; восстановить d_ret: pop		
	di	
POP	ex	
pop	ax	
ret		
det_type	endp	
Программа «дописывания» СОМ-файла
163
; ПОДПРОГРАММА WR2EXE:		
;wr2exe proc		
push	ax	; сохранить
push	bx	
push	ex	
push	dx	
push	si	
push	di	
jmp	st_2exe	
.-------------------переменные
;len_t_o dw	?
;1en_t_n dw	?
;	заголовок ЕХЕ-файла					
hdr	label dw PartPag dw PageCnt dw dw HdrSize dw dw ExelP dw ReloCS dw len_hdr equ ;	команды.		byte ? ? ? ? ? 5 dup(?) ? ? j-hdr записываемые	в конец файла		
;	команды iinit	label mov		записи в стек byte ax,es	адреса начала EXE	-файла:	
i_l:	add add push	ax, 0 ax,lOh ax	; для	параметра	ReloCS
i_2:	mov push	ax, 0 ax	; для	параметра	ExelP
команды передачи управления source-файлу, как и для СОМ-файла:
mov	ax,lOOh		
push	ax		
db	0c3h		; ret near
len_imit	equ	J-imit	
;	1. Читать	заголовок	ЕХЕ-файла	
;	1.1. Установить указатель на начало файла
st_2exe:
mov	ah,42h	
mov	bx,hand_l	
xor	ex, ex	; нулевое смещение
xor	dx,dx	
mov	al, 0	; от начала
int	21h	
jc	cn_mov_l	; двигается? Нет
	читать	
mov	ah,3fh	
lea	dx,hdr	
mov	ex,len hdr	
int	21h	
11*
164
Приложение 6
jnc	prep_end
cn_r_l: mov	ah,9	; нет
lea	dx,mn_r_l
int	21h
int	20h
;	2. Настроить команды, дописываемые в конец файла
; target-file prep_end: ;	2.1. Записать в стек адреса начала ЕХЕ-файла
mov	ax.ReloCS
mov	word ptr	i_l[l],ax
mov	ax.ExelP
mov	word ptr	i_2[l],ax
;	2.2. Передать управление файлу source-file, по соглашениям
;	системы DOS
;	для COM-файла настройка не нужна
;	3. Записать команды в конец ЕХЕ-файла.
;	загрузить в регистры СХ:DX	длину	файла
mov	cx,len_t_l
mov	dx,len_t_2
mov	si,ex	;	SI:DI=CX:DX
mov	di,dx
;	установить указатель на	конец файла
mov	ah,42h
mov	a 1,0
mov	bx,hand_l
int	21h
jnc	yes_wr	;	двигается ?	да
cn_mov_l: mov	ah,9	;	нет - сообщение
lea	dx,mn_mov_l
int	21h
int	20h
yes_wr: ;	записать
mov	ah,40h
lea	dx,imit
mov	cx,len_imit
int	21h
jnc	wr_sour	/записывается	?	да
cn_w_l: mov	ah,9	;	нет	-	сообщение
lea	dx,mn_w_l
int	21h
int	20h
wr_sour: ;	4. Записать файл source-file в конец ЕХЕ-файла, начиная с
; границы параграфа
; Загрузить в регыстры CX1DX длину файла, выровненную на ; границу параграфа mov	cx,si	; восстановить длину
mov	dx.di
add	dx,len_imit
Программа «дописывания» СОМ-файла
165
	jnc inc	ml ex
ml:		
	add	dx,15	; выровнять на границу параграфа
	jnc inc	m2 ex
m2:		
	and	dx.OfffOh	;
	mov mov	si,ex	; сохранить di ,dx
f f	mov mov int	установить указатель на конец файла, начиная с границы параграфа ah,42h al,0 21h
•	jc mov lea mov int jc	cn_mov_l	; двигается? нет Записать ah,40h dx.buff ex,len s 21h cn w 1
	5. Определить поля нового заголовка ReloCS	
	mov mov add mov ГОГ sub sub	ax,si	; восстановить bx.di bx, ax cl ,4	, bx,cl bx,lOh bx.HdrSize
	mov mov	ReloCS,bx ExelP ax,PartPag
	and	ax.OOOfH	; остаток от деления PartPag на 16
	mov add add	bx.ax	; сохранить остаток ах,len_imit ах, 15
	and add sub mov	ax.OfffOh	; число параграфов bx.lOOh bx.ax ExelP.bx PageCnt, PartPag
	mov mov	ax,si	; восстановить bx,di
	add jnc inc	bx.lens	; новая длина m3 ax
m3:		
	PartPag	dx,bx	; сохранить dx,Iffh
	mov and	
166	Приложение 6			
ш4: ;	6. write_ m_ret: wr2exe	mov	PartPag.dx PageCnt add	bx,511 jnc	m4 inc	ax and	bh.OfeH mov	ah.bh mov	cl,9 ror	ax,cl mov	PageCnt,ax Записать настроенный Установить указатель mov	ah,42h mov	bx,hand_l xor	ex,ex xor	dx,dx mov	a 1,0 int	21h jnc	write_l jmp	cn_mov_l Записать 1: mov	ah,40h lea	dx.hdr mov	cx.len	hdr int	21h jnc	m_ret jmp	cn_w_l pop	di pop	si pop	dx pop	ex pop	bx pop	ax ret endp	заголовок на начало	в начало ЕХЕ-файла. файла ; нулевое смещение ; от начала ; двигается? Да ; нет ; восстановить	
; ПОДПРОГРАММА	L WR2COM:	
wr2com proc jmp ; Код, который	st_2com i настраивается	и записывается в начало файла
new_beg label mov с_1:	add	byte ax.es ax, 0	; +Т0Р((1еп t_2+len_im)/16)*16.
push	ax	; где TOP(xJ - наименьшее целое
c_2:	mov	ax, 0	; не меньшее х, ; +ЮОН+х-ТОР( (x+len_im)/16)*16
push	ax	; где х - остататок от дел
db	OcbH	; len_t_2 на 16 ; retf
len_new_beg	equ	$~new_beg
; конец кода,	записываемого	в начало
Программа «дописывания» СОМ-файла	167
; код, который записывается в конец файла target-file com	label byte ;	восстановить начала mov	di.lOOh	;	смещение	начала	файла push	cs pop	ds	;	адресация	для	пересылки ;	Вычислить SI=lOOh-(MOD16(16 - ;	- MOD16(len_t_2+len_im))+len_new_beg) c_3:	mov	ax,0	; + len_t_2 c_4:	add	ax,0	; + len_im and	AX.OOOfH	;	остаток от деления на 16 mov	bx,16 sub	bx,ax	;	число байтов до конца ;	параграграфа and	bx.OOOfh	;	не больше 15, если 16, ;	то 0 add	bx,len_new_beg	;	смещение от начала ;	source	"начала” mov	ax,100h sub	ax.bx	;	смещение "начала” от ;	адреса	на регистре CS mov	si,ах mov	ex,len_new_beg rep	movsb push es	; восстановить DS pop	ds ;	Занести	в	стек адрес начала файла target-file push	es mov	ax.lOOh push	ax ;	передать управление файлу source-file push	ax	;	в	стек	100H db	0c3h	;	ret	near len_com equ	J-com old_beg label	byte db	len_new_beg	dup(?) len_im	equ	$-com ;	конец кода,	записываемого	в конец ;	1. Читать (сохранить) len_new_beg байт файла ;	target-file в области old_beg-file ;	Установить указатель на начало файла st_2com: mov	bx,hand_l mov	ah,42h xor	ex,ex	;	нулевое	смещение xor	dx.dx	; mov	al,0	;	от	начала int	21h jnc	read_beg jmp	cn_mov_2 ;	Читать read_beg: mov	ah,3fh lea	dx,old_beg	
168 Приложение 6
mov ex,len_new_beg int	21h
jnc	prep_beg
jmp	cn_r_l
;	2. Подготовить новое начало файла
prepjbeg:
mov mov	ax,len_t_l bx,len_t_2	; восстановить длину
add	bx,len_im	
jnc	prl	
inc	ax	
prl: add bx,15
and		bx.OfffOh	
	add mov ГОГ mov mov and mov add add and add sub mov	bx.ax cl ,4 bx.cl word ptr c_l[l],bx ax,len_t_2	; ax.OOOfh bx.ax	; сохранить ax,len_im ax, 15 ax.OfffOh bx,lOOh bx.ax word ptr c 2 [1] ,bx ;	
;	3. wr_beg	Записать mov mov xor xor mov int jnc jmp mov lea mov int jnc jmp	новое начало в файл target-file Установить указатель на начало bx,hand_l ah.42h ex,ex	;	нулевое смещение dx.dx	; al.O	;	от начала файла 21h wr_beg cn_mov_2 Записать ah,40h dx,new_beg cx.len new beg 21h prep_C_end cn_w_l	
;	4. prep_C	Подготовить код, который записать в конец end: mov	ax,len_t_2 mov	word ptr c_3[l],ax mov	word ptr c 4[l],len	im		файла
;	5.	Записать mov mov	подготовленный код в конец файла Установить указатель на конец bx.hand 1 ah,42h	target-file
Программа «дописывания* СОМ-файла 169
mov	cx,len_t_l	;	восстановить	длину
mov	dx,len_t_2
mov	а 1.0	;	от начала
int	21h
jnc	wr_end
jmp	cn_mov_2
;	Записать
wr_end:
mov	ah,40h
lea	dx.com
mov	cx,len_im
int	21h
jnc	cal_b
jmp	cnwl
;	6. Записать source, начиная с границы параграфа
;	Вычислить границы
cal_b: mov cx,len_t_l	; восстановить длину
mov	dx,len_t_2
add	dx,len_im
jnc	cal_l
inc	ex
cal_l: add	dx,15
jnc	cal_2
inc	ex
cal_2:
and	dx.OfffOh
;	Установить указатель на	границу
mov	bx,hand_l
mov	ah,42h
mov	a 1,0	;	от	начала файла
int	21h
jnc	wr_sr
jmp	cn_mov_2
;	Записать
wr_sr: mov	ah,40h
lea	dx.buff
mov	cx,len_s
int	21h
jnc	end_2com
jmp	cn_w_l
end_2com: ret wr2com endp buff	label byte
code	ends
end start
170
Приложение 6
Авторские права 2В Programmers Group, 1991
Транслятор ~ MASM 5.10
ИМЯ: PASSWORD.COM
ФУНКЦИИ: Три раза запрашивает пароль, проверяет его. Если пароль правильный, то выполняет команду RETF. Если нет, то выход в DOS.
ВХОД: Нет
ВЫХОД: Нет
ПРИМЕЧАНИЕ: Пароль (top secret) хранится в теле программы. Перед "дописыванием” с помощью C0M2END.COM этой программы к другой программе необходимо преобразовать файл с этой программой в СОМ-файл (например, с помощью программы EXE2BIN).
code segment
assume org
start: jmp enter_pas
db db db db db db db db db
len_enter
password db db db
len_pas equ count_err buff label
db
print: push push
cs:code,ds:code,es:code;ss:code
lOOh
print
label byte
'P'+60h,80h,'L’+60h,80h,'E'+60h,80h,'A'+GOh.SOh ’S'+60h,80h,'E'+60h
80h,80h,80h,80h
'E'+60h,80h,'N'+60h,80h,'T'+60h,B0h,'Е’+бОЬ.вОЬ 'R’+60h
80h,80h,80h,BOh
'P'+60h,80h,'A'+60h,80h.’S’+eoh.eOh,'S'+60h,BOh 'W'+60h,80h,,O'+60h,B0h,'R'+60h,80h,'D'+60h 6ah,6dh	; 10,13
equ	J-enter_pas
пароль top secret
label	byte
’t’+60h,'o’+60h,’p'+60h,80h
's'+60h,'e'+60h,'c'+60h 'r'+60h,’e'+60h,'t'+60h {-password
equ	3	; счетчик повторов
byte
len_pas dup(?)
начало программы
es	; сохранение регистров
ds
push	cs
push	cs
pop	ds
pop	es
mov	ex,count_err
; адресация регистра DS
; адресация регистра ES ; инициализация счетчика
Программа •дописывания» СОМ-файла
171
;	Печатать приглашение
рг_1:
	BOV BOV	ah.2 bx.O
pr_ent:	BOV	dl,enter_pas[bx]
	sub	dl,60h
	int	21h
	inc	bx
	cmp	bx,len_enter
	jb	pr_ent
;	Ввести		пароль
	push	ex
	mov	ex,len_pas
	lea	di.buff
rd_pass		al,7
	mov	
	mov	ah.Och
	int	21h
	stosb loop	rd_pass
	pop	ex
		Сравнить пароль с введенный
	BOV	bx.O
cmpp:	mov	а1,password[bx]
	sub	al,60h
	cmp	a 1, buff [bx]
	jne	repeat
	inc	bx
	cmp	bx,len_pas
	jb	cmp_p
equal:	POP	ds
	pop	, es
	db	OcbH
repeat:		
	loop	PrJ
dos:	jmp	cs 1
ms_l	db	•TRY AGAIN'.10.13,
cs_l:	mov	ah,9
	lea	dx.ms 1
	int	21h
	mov	ah,4ch
	mov	al.O
	int	Zlh
code	ends	
	end	start
ПРИЛОЖЕНИЕ 7.
ПРОГРАММА ОПРЕДЕЛЕНИЯ ТИПА ПРОЦЕССОРА И РЕЖИМА ЕГО РАБОТЫ
ОПРЕДЕЛЕНИЕ ТИПА ПРОЦЕССОРА И РЕЖИМА ЕГО РАБОТЫ
Авторские права 2В Programmers Group, 1991
ФУНКЦИИ.
Эта процедура предназначена для определения типа процессора и режима его работы.
ВХОДНЫЕ ПАРАМЕТРЫ.
Нет.
ВЫХОДНЫЕ ПАРАМЕТРЫ.
После выполнения процедуры регистр AL содержит тип процессора ввиде одного из следующих чисел:
-	О ..... INTEL	BOBB;
-	1 ..... INTEL	8086;
-	2 .... NEC V20;
-	3 .... NEC V30;
-	4 ..... INTEL	80188;
-	5 ..... INTEL	80186;
-	6 ..... INTEL	80286;
-	7 ..... INTEL	80386/80486.
Содержимое регистра АН существенно только для процессора 80386. Если регистр АН обнулен, то действует процессора 80386. Программа функционирует в режиме VIRTUAL 8086. Причем если регистр АН содержит 1, то IOPL = 3, а если 2, то IOPL < 3. Ни один другой регистр, кроме регистра АХ, не изменяется.
; ПРОГРАММНЫЕ ОПРЕДЕЛЕНИЯ.
.MODEL SMALL .DATA
PORT21 DB 0	; область сохранения порта 21h.
.CODE . 286р PUBLIC COMPUTER_nPE
COMPUTER TYPE PROC NEAR
push	bx	; сохранить рабочие регистры.
push	ex	
push	si	
sub	bx, bx	; обнулить индикаторы процес-
Программа определения типа процессора
173
push	sp	; сохранить SP.
POP	ax	,- восстановить сохраненное
		значение.
cmp	ax, sp	; возвращено то, что надо?
jne	ctOOO	; нет, это не
		INTEL 80286/80386.
mov	ax,7Q00h	; попробовать установить флахки
2		NESTED TASK и IOPL = 3.
push	ax	
popf		
pushf		; сохранить установленные
		флажки в стеке.
pop	ax	; выбрать фАахки из стека.
mov	bl, 6	; заранее установить признак
		процессора
		INTEL 80286.
and	ax,7000h	; установлены флахки NESTED
2		TASK и IOPL = 3?
JZ	ct_200	; нет, это процессор
		INTEL 80286.
inc	bx	; установить признак процессора
		INTEL 80386/80486.
smsw	ax	; выбрать младшую часть регистра
test	al,l	; CR0.
		VIRTUAL 8086?
JZ	ct 200	; нет, все сделано.
cal 1	TESTJOPL	; проверить IOPL.
mov	bh,al	; загрузить индикатор IOPL.
jmp	SHORT ct 200	
ct_000: mov	bl,4	; заранее установить признак
f		процессора INTEL 80188.
mov	cl,33	; проверить, как работает сдвиг.
mov	ax,-l	
shl	ax,cl	
jnz	ctjlOO	; INTEL 80188/80186, поскольку
r		для сдвига используется
		модуль
f		значения сдвига.
mov	bl,2	;	; Заранее установить признак
		процессора NEC V20.
mov	cx,-l	; выполнить команду REP LODSB с
		заменой сегментного регистра.
jmp	SHORT $+2	
DB	0F3h,026h,OACh	
jcxz	ct_100	; NEC V20/V30, поскольку
		работает замена
		сегментного регистра.
sub	bx.bx	; установить признак процессора
		INTEL 8088/8086.
ct_100: call	TEST_BUFFER	;	; проверить длину буфера пред-
		выборки команд.
jcxz	ct_200	;	; только 6 байт
; inc	bx	;	; увеличить номер процессора.
ct_200: mov	ax.bx	;	; сохранить индикатор процессора
174
Приложение 7
pop	si
pop	ex
pop	bx
ret COMPUTER_TYPE ENDP
и режима его работы.
; восстановить рабочие регистры.
; выход из процедуры.
ПРОВЕРКА IOPL
Данная процедура определяет уровень привилегий ввода-и режима действующий в данный момент для режима VIRTUAL 8086.
После выполнения процедуры регистр AL будет содержать код уровня привилегий (1, если IOPL = 3; 2, если IOPL < 3), остальные регистры не изменяются.
TEST_IOPL PROC	NEAR	
push push	bx	; ex	сохранить рабочие регистры.
cli in	al.Zlh	запретить прерывания.
mov	PORT 21,al	
mov t out Jmp	al,11111110b Zlh.al SHORT $+2	заблокировать контроллер прерываний и разрешить только прерывания от таймера
sti	•	разрешить прерывания
mov mov call	ax ,3	; bx,OFFSET ti_100 POWER_METER	получить производительность процессора для первой тестовой последовательности команд.
mov	ex,ax	;	сохранить предоставленное значение переход,
jexz	ti_000	;	если произошло что-то странное.
mov mov call	ax,3	; bx,OFFSET ti 200 POWER_METER	получить производительность процессора для второй тестовой последовательности команд.
cmp	ax,ex	;	вторая тестовая последовательность выполняется не медленнее первой?
job	ti_010	;	да, переход.
shl	ax.l	;	получить удвоенную производительность для второй тестовой
Программа определения типа процессора 175
;	для второй тестовой ;	последовательности, стр	ах.сх	; вторая тестовая ;	последовательность ;	выполняется намного медленнее ;	первой? jnb	ti_010	;	нет, переход, ti	ООО:	mov	Ы,2	;	установить	индикатор ;	IOPL <60> 3. jmp	SHORT	ti_020 ti_010:	mov	Ы,1	;	установить	индикатор IOPL = 3. ti_020: cli	; разрешить работать контроллеру ;	прерываний, mov	al,PORT_21 out	21h,al jmp	SHORT $+2 st i mov	al.bl	;	сохранить	индикатор	IOPL. pop	ex	;	восстановить	рабочие	регистры, pop	bx ret	
EVEN ti_100: nop nop ret	ПЕРВАЯ ТЕСТОВАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ
»	
EVEN ti_200: cli sti ret	ВТОРАЯ ТЕСТОВАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ
TEST_IOPL ENDP	
ОПРЕДЕЛЕНИЕ ДЛИНЫ БУФЕРА
Эта процедура определяет длину буфера предвыборки команд в процессоре и возвращает в регистре СХ нулевое значение, если длина буфера равна 6 байт.
После выполнения процедуры содерхимое регистра АХ будет непредсказуемо, регистр СХ содерхит индикатор длины буфера, а остальные регистры не изменяются.
TEST_BUFFER PROC	: NEAR	
push	es	; сохранить рабочие регистры.
push	di	; установить обратное
std		
		направление пересылки.
push	cs	; загрузить ES равным CS
pop	es	
176
Приложение 7
mov di,OFFSET tb_2 ; подготовиться к кодификации цепочки команд.
mov	al,BYTE PTR cs:tb_l
mov	cx,3
cli	; запретить прерывания и
сбросить содержимое буфера предвыборки команд.
rep stosb	; выполнить модификацию
цепочки команд, которая ухе в это время находится в буфере.
»		ПОЗИЦИЯ	длина
		буфера	команды
cld		2	1
пор		3	1
пор		4	1
пор		5	1 •
inc	ex	6	1
tb 1: sti		7	1
tb_2:	sti		8	1
pop	di		; восстановить рабочие
r			регистры.
pop	es		
ret			
TEST_BUFFER	ENDP		
ИЗМЕРЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ Данная процедура вычисляет число тестовых последовательностей, выполняемых процессором за 1 мс. Число измерений должно быть загружено в регистр АХ, а адрес тестовой последовательности, оформленной в виде процедуры типа NEAR, - в регистр ВХ.
Тестовая последовательность не должна изменять ни один из регистров, кроме регистра АХ, который может использоваться в качестве рабочего. Рекомендуется тестовую последовательность располагать на границе слова, поскольку выравнивание резко влияет на измерение производительности процессора .
Перед входом в процедуру должна быть запрещена обработка любого прерывания, кроме прерывания от таймера (на уровне контроллера прерываний). После выполнения процедуры в регистр АХ будет загружено среднее значение числа тестовых последовательностей, выполняемых за 1 мс.
Содержимое остальных регистров не изменяется.
ПРОГРАММНЫЕ ОБОЗНАЧЕНИЯ И КОНСТАНТЫ.
POWER_AMT DW О
; число прохо-
Программа определения типа процессора
VT7
дов измерителя производительности.
IV8_0FFSET	EQU	WORD PTR es:[08h*4]	; вектор прерывания 08h
iv'8 SEGMENT	EQU	WORD PTR es:[08h*4+2]	
HANDLER_8	LABEL	DWORD	; область
			сохранения
			вектора 08h.
SV8 OFFSET	DW	0	
SV8 SEGMENT	DW	0	
POWER_METER PROC NEAR
push		es	;		сохранить рабочие регистры
	push push push push push push mov	bp bx ex dx si di POWER_AMT,ax		сохранить число проходов
	mov	si ,bx	r	измерителя производительности. сохранить указатель на
	sub	bp,bp	r	тестовую последовательность. установить признак того.
	push	bp	t	что выполняется первый проход измерителя производительности. установить признак конца
	mov	es, bp	Z	стека. загрузить адрес таблицы
	mov	al,00110000b		векторов прерываний. запрограммировать канал 0
	out jmp sub out jmp out jmp cl i mov	43h,al SHORT $+2 ax, ax 40h,al SHORT $+2 40h,al SHORT $+2 ax,IV8 OFFSET		платы TIMER CHIP. запретить прерывания. заменить вектор прерывания
	mov mov mov mov mov	SV8_0FFSET,ax ax,IV8 SEGMENT SV8 SEGMENT,ax IV8 SEGMENT.es IV8 OFFSET,OFFSET		08h на адрес измерителя. рш_000
	sub	bx,bx		обнулить накопитель
выполненных тестовых последовательностей.
178
Приложение 7
sub		dx, dx	
	sub	di ,di	; обнулить счетчик проходов измерителя.
	jmp	SHORT pm_210	; начать измерение производительности.
pm_OOO:	or	bp, bp	; самый первый проход?
	mov	bp, 1	; установить признак начала
;	iz	pm_200	измерения производительности. ; да, переход.
;	sub	ax,ax	; подсчитать число тестовых последовательностей, выполненных за 1 мс.
	sub	ax,ex	
	add	bx.ax	; учесть подсчитанное число.
	adc	dx,0	
pm_100:	inc	di	; увеличить счетчик проходов.
	cmp	di,POWER_AMT	; все проходы выполнены?
	jb	pm 20D	; нет, переход.
z	mov	bp, 2 ax.bx	; установить признак того, что производительность измерена.
	mov		; подсчитать и сохранить
9	div	POWER_AMT	среднюю производительность.
	mov	bx.ax	
pm_200:	POP	ax	; промыть стек.
	Pop	ax	
	pop	ax	; выбрать последний элемент
pm_201:	Pop	ax	
			стека.
	or	ax,ax	; конец стека?
	jnz	pm_201	; нет, продолжить промывание стека.
t 9	mov	al,20h	; послать команду E0I в контроллер прерываний 8259 Intel.
	out	20h,al	
	jmp	SHORT $+2	
9	cmp	bp,2	; измерение производительности завершено?
	je	pm_300	; да, переход.
	sub	ax, ax	; установить признак конца стека.
pm_210:	push	ax	
	sub	ex,ex	; заслать в СХ максимальное
9			значение.
	sti		; разрешить прерывания.
9	mov	ax,1193	; установить счетчик TIMER CHIP на 1 мс.
	out	40h,al	
	jmp	SHORT $+2	
	mov	al,ah	
	out	40h,al	
	Программа определения типа процессора	179
jmp pm_220: call	SHORT $+2 si	; выполнить тестовую последовав
loop pm 221: inc	тельность. рт_220 ах	; продолжить безрезультатный
jmp pm 300: mov	цикл до тех пор, пока не произойдет прерывание от таймера. SHORT pm_221 al,00110110b	; восстановить среду, которая
out jmp sub out jmp out jmp mov mov mov mov st i mov pop pop pop POP pop pop pop ret POWER_METER	была до того, как начали измерять производительность. 43h,al SHORT $+2 ах, ах 40h,al SHORT $+2 40h,al SHORT $+2 ax,SV8 OFFSET IV8 OFFSET,ax ax,SV8 SEGMENT IV8_SEGMENT,ax ax,bx	; загрузить среднюю производительность. di	; восстановить измененные регистры. si dx ex bx bp es ENDP
12’
ПРИЛОЖЕНИЕ 8.
ПРОГРАММА КОНТРОЛЯ СОСТОЯНИЯ ЛИНИИ А20
Авторские права 2В Programmers Group, 1991
Транслятор - 0PTASM
Процедура анализа состоянии 20-й адресной линии
ФУНКЦИИ: Анализируется состояние линии А20
ВХОД: Нет
ВЫХОД:
СЕ=О - линия А20 закрыта
CF=1 - линия А20 открыта
GetA20	proc
push	ax
push	ex
; анализируем	тип процессора
push	sp	;процессор
POP	ax	;	80286
cmp	axrsp	;	80386 ?
jne	GetA20CF0	;нет
; закроем клавиатуру	
mov	al.OADh
out	64h,al
jmp	short $+2
-, анализируем	линию A20
sub GetA201: cl i	ex,ex	;счетчик ожидания
in	al,64h	;возьмем статус
test	al,3	;мохно работать (буферы пусты)?
jz	GetA202	:да
loop	GetA201	-.повторим
jmp	GetA20CF0	;нет контроллера
; спросим про GetA202:	А20
mov	al.OdOh	;читать выходной порт
out	64h,al	-.выведем
jmp	short $+2
; подождем данные	
sub GetA203:	сх,сх	;счетчик ожидания
in	al,64h	,-возьмем статус al,1	;буфер заполнен ?
test	
jnz	GetA204	; да
Программа контроля состояния линии А20 181
loop	GetA203	;повторим
jmp	GetAZOCFO	;нет контроллера
; прочитаем GetA204:	состояние AZO	
in	al,60h	;прочитаем данные
test	al,2	;А20 открыта ?
jz	GetAZOCFO	;нет
; линия AZO GetAZOCFl:	открыта	
stc		;CF=1
jmp	GetAZORet	;выход из программы
; линия A20 GetAZOCFO:	закрыта	
clc		;CF=O
; выход из программы GetAZORet:
; откроем клавиатуру mov	al.OAEh
out	64h,al
jmp	short	$+2
sti pop	ex
pop	ax
ret
GetA20
endp
ПРИЛОЖЕНИЕ 9.
ПРОЦЕДУРА ПРИВРАТНИКА
Приложение содержит исходный текст обработчика прерываний 1, который получает управление в результате выполнения очередной команды безумного кода привратника (в комментариях программы безумный код также называется SSI-последовательностью, т. е. последовательностью команд, выполняемых в пошаговом режиме; SSI является аббревиатурой от Single-Step Interrupt).
Необходимо иметь в виду, что привратник системы противодействия является довольно сложной программой, включающей десятки тысяч операторов языка ассемблера. В связи с этим для облегчения понимания логики работы обработчика прерывания 1 привратника исходный текст большинства вспомогательных подпрограмм опускается из-за большого объема. Для понимания функций, выполняемых этими подпрограммами, в приложении приведены только спецификации подпрограмм.
Обработчик прерывания 1 использует данные, сформированные ранее в сегменте 0 оперативной памяти другими процедурами привратника, а также формирует в этом сегменте данные, которые необходимы для дальнейшего выполнения привратника. Например, в области сохранения параметров функционирования системы BIOS (LOW BIOS MEMORY) формируется гамма шифра, которая используется для расшифрования безумного кода. Описание полей сегмента 0 оперативной памяти, используемых обработчиком прерывания 1, приведено в конце приложения.
Следует учесть, что обработчик прерывания 1 является самой первой процедурой привратника, которая "случайным” образом передает управление другим процедурам (процедурам второго уровня).
Авторские права 2В Ргодгапнегя Бгоир. 1991
Процедура привратника
Процедура привратника
183
ОБРАБОТКА SSI-ПОСЛЕДОВАТЕЛЬНОСТИ ОБРАБОТЧИК ПРЕРЫВАНИЯ Olh Эта процедура предназначена для обеспечения корректной обработки SSI-последовательности, которая представляет собой зашифрованный код, выполняемый в пошаговом режиме. В результате выполнения команды в пошаговом режиме модифицируются регистры, область LOW BIOS MEMORY и дешифруется код, находящийся ниже выполняемой команды, адрес которой должен быть сформирован в поле DKA_XCT до возникновения прерывания типа 1.
DB	H1SIZE1	; длина обработчика ;	прерывания в словах, ;	(используется для ;	подсчета контрольной ;	суммы обработчика ;	прерывания). HANDLER_1 PROC HEAR sub	dx.dx	; установить адресацию ;	нулевого ;	сегмента памяти, mov	ds.dx ASSUME	ds:DK_ABSO pop	si	;	выбрать указатель на ;	следующую	команду, push	si	;	сохранить его снова в ;	стеке, cmp	si,DKA_XCT	;	трассировка прерывания?	
	8088 8086
jnb	ha_ll	; нет, выполнить рабо- ту-iret	; вернуть управле- ние • ASSUME	ds: NOTHING'	; hall: int	3	;	расшифровать обработчик. DB	H1_SIZE2	;	длина расшифруемой	части ;	обработчика в словах. ha_12: mov	dl,l*4	;	подсчитать контрольную ;	сумму обработчика. call	INTERRUPT_CHECK mov	dx.ax	;	изменить команду. ASSUME	ds:DK ABSO mov	bp.WORD PTR	DKA V01 add	bp,Hl SIZE4 call	RANDOM_INSTRUCTION mov	si,DKA_XCT	;	выбрать адрес ;	выполняемой команды, mov	dl.BYTE PTR cs:[si]; получить код операции ;	-	команды.	
184
Приложение 9
and		dl.OFOh	
«	cmp	dl,O7Oh	;	это команда условного перехода?
	jne	ha_14	;	нет, продолжить.
*	mov mov call	dx, ex bp, si RANDOM INSTRUCTION	изменить команду перехода на другую инструкцию.
г	mov	DKA_FLAG,-1	;	установить признак повторног 0 выполнения команды условного перехода.
	cmp	bh,7Fh	;	долхна быть выполнена следующая команда?
	jb	ha_13	;	нет, переход.
	inc inc	si	; si	продвинуться на следующую команду.
•	mov	DKAFLAG.O	;	сбросить признак повторного выполнения команды условного перехода.
ha_13:	mov	DKA_XNT,si	;	установить адрес следующей команды в SSI-последовательности.
	call	RANDOMNEXT	;	изменить следующую команду.
* • » г	jmp	SHORT ha_14	;	этот код никогда не выполняется, поскольку всегда заменяется на случайную команду, которая выполняет дополнительную модификацию АХ.
2	int	OBh	;	инициировать прерывание от таймера.
ha_14:	POP ASSUME	DKA_XNT	; ds:NOTHING	сформировать адрес следующей команды в SSI-последовательности.
	add	sp. 4	;	промыть стек.
	mov add and add call	dl,ch	; dl.bl dl,7 dl.llh ha 15	получить номер безумного обработчика и занести его в команду INT XX.
ha_15:	Pop add mov	si si,Hl_SIZE3 BYTE PTR cs:[si],dl	
Процедура привратника
185
call	UPDATE_BIOS_MEMORY	изменить гамму в области
		LOW BIOS MEMORY.
cal 1	RANDOM_NEXT	изменить следующую команду.
jmp	SHORT ha_13	эта ерунда никогда не выполняется , поскольку всегда заменяется на случайную команду, которая выполняет дополнительную модификацию АХ.
ia_16: int	lOh	передать управление безумному обработчику второго
		уровня.
Hl SIZE1 EQU	($-HANDLER_l)/2	
Hl SIZE? EQU	($-ha_12)/2	
Hl SIZE3 EQU	ha 16+1-ha 15	
Hl SIZE4 EQU HANDLER 1 ENDP	ha_ll-HANDLER_l	
РАСШИФРОВАНИЕ КОДА ПРИВРАТНИКА УКАЗАННОЙ ДЛИНЫ
Эта процедура подключается при выдаче команды INT 3. Предполагается, что за командой INT 3 находится байт, содерхащий длину расшифровываемое ого кода в словах.
В результате расшифрования кода изменяется гамма в области LOW BIOS MEMORY и содерхимое регистров АХ, ВХ и СХ. Команда INT 3 и следующий за ней байт с длиной расшифруемого кода заменяются на случайную команду.
HANDLER 3 PROC NEAR
HANDLER_3 ENDP
ПОДСЧЕТ КОНТРОЛЬНОЙ СУММЫ
;	ОБРАБОТЧИ’КА ПРЕРЫВАНИЯ
;	ПРИВРАТНИКА
; Эта подпрограмма подсчитывает контрольную сумму обработчика ; прерывания, номер которого предоставляется в регистре DL ; (вернее, в регистре DL предоставляется номер
; прерывания, умнохенный на 4).
После выполнения подпрограммы регистры АХ, ВХ и СХ будут ; немодифицированы в соответствии с контрольной суммой ; собработчика, а регистр DS будет содерхать нули.
INTERRUPT CHECK PROC NEAR
186
Приложение 9
INTERRUPT_CHECK ENDP
ФОРМИРОВАНИЕ ГАММЫ В ОБЛАСТЬ LOW BIOS MEMORY
Эта подпрограмма предназначена для формирования части гаммы в область LOW BIOS MEMORY. Местоположение модифицируемой части гаммы и параметры модификации определяются на основе содержимого регистров АХ, ВХ и СХ.
UPDATE_BIOS_MEMORY PROC NEAR
UPDATE_BIOS_MEMORY ENDP
ФОРМИРОВАНИЕ СЛУЧАЙНОЙ КОМАНДЫ, СЛЕДУЮЩЕЙ ЗА КОМАНДОЙ CALL Эта подпрограмма формирует случайную команду на основе значений, предоставленных в регистрах АХ, ВХ и СХ, в слове оперативной памяти, которое следует за командой CALL, вызвавшей эту процедуру. После выполнения процедуры содержимое регистров DX и ВР непредсказуемо, а остальные регистры не изменяются.
RANDOM_NEXT	PROC NEAR	
mov	dx.ax	получить случайное число.
add	dx,bx	
sub	dx,cx	
POP	bp	получить адрес команды, следующей за командой CALL.
push	bp	
jmp	SHORT RANDOM_INSTRUCTION	очистить буфер
		предвыборки команд
;	и сформировать
;	затем случайную
;	команду.
RANDOM NEXT ENDP
ФОРМИРОВАНИЕ СЛУЧАЙНОЙ КОМАНДЫ Эта процедура формирует команду на основе случайного числа, предоставленного в регистре DX, в слове оперативной памяти, адресуемом регистрами CS:BP. Сформированная команда имеет формат:
{add/adc/sub/sbb/and/or/xor/cmp} АХ, {ВХ/СХ} Содержимое ни одного из регистров, кроме DX, не изменяется после выполнения процедуры.
RANDOMJNSTRUCTION PROC NEAR and dx,0000001000111000b ; сбросить ненужные биты.
Процедура привратника
187
or	dx,1100000100000011b ; установить параметры
;	MOD/D/W/RM команды.
mov	WORD PTR cs:[bp],dx	; сохранить
;	сформированную команду
;	в сегменте кода,
ret	; вернуть управление.
RANDOM_INSTRUCTION ENDP
РАСШИФРОВАНИЕ БЕЗУМНОГО КОДА Эта подпрограмма расшифровывает часть безумного кода на основании значений в регистрах АХ, ВХ и СХ. Всегда расшифровывается только код, который расположен за выполняемой командой, начиная со следующей команды, адрес которой сформирован в поле DKA_XNT. Для расшифрования кода используется гамма шифра, сформированная в область LOW BIOS MEMORY.
UPDATE_CODE PROC NEAR
UPDATE_CODE ENDP
ИНИЦИИРОВАНИЕ ПРЕРЫВАНИЯ ОТ ТАЙМЕРА
ОБРАБОТЧИК ПРЕРЫВАНИЯ OBh Эта процедура предназначена для иницирования прерывания от таймера, для чего в контроллер прерываний посылается команда E0I и разрешаются прерывания. Между делом делом модифицируются регистры АХ, ВХ и СХ.
Считается, что команда INT OBh выдается в обработчике безумного кода в тот момент, когда в нулевом сегменте памяти уже сформирован адрес команды, которая должна выполняться следующей в пошаговом режиме, и стек продвинут вверх на 6 байтов по сравнению с моментом, предшествующим прерыванию 1.
Таким образом, при входе в процедуру обработки прерывания OBh стек будет продвинут вверх на 12 байтов.
DB HB_SIZE
HANDLER_B PROC NEAR int 3
прерывания.
; длина обработчика прерывания в словах, (используется для подсчета контрольной суммы обработчика прерывания).
; дешифровать код обработчика
188
Приложение 9
DB
HB_SIZE-1
длина дешифруемой части обработчика прерывания в словах
HB_SIZE EQU ($-HANDLER_B)/2 HANDLER_B ENDP
DK_ABS0 SEGMENT AT 0
СЕГМЕНТ С ДАННЫМИ ПРИВРАТНИКА
; вектора привратника:
DKA_V00 DD	?	; обработчик DIVIDE ERROR.
DKA_V01 DD	?	; адрес программы выполнения
;	SSI-последовательности.
; указатели на инструкции:
DKA_XCT DW	?	;	указатель на выполняемую инструкцию.
DKA_XNT DW	?	;	указатель на следующую инструкцию.
; признаки:
DKA_FLAG DB	?	;	признак повторного выполнения коман-
ды ;	условного
;	перехода в SSI-последовательности.
ORG 400Н
DKA_LOW DW 128 DUP(?)	; рабочая область для
;	получения гаммы
;	шифра.
СПИСОК ЛИТЕРАТУРЫ
1.	Брэдли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM: Пер. с англ.— М.: Радио и связь, 1988,—488 с.
2.	Вегнер В. А., Крутиков А. Ю., Сидоров В. А., Серегин В. В., Спесивцев А. В. Анализ отечественных систем защиты программ от копирования // Монитор. — 1992.— № 3... 5.
3.	Герасимов В., Владиславский В. Организационные методы защиты информации в автоматизированных системах //Зарубежная радиоэлектроника. — 1976. — №1.— С. 53 — 67.
4.	Герасимов В., Владиславский В. Использование средств и методов защиты в зарубежных автоматизированных системах //Зарубежная радиоэлектроника. — 1976. — №4.— С. 3 — 28.
5.	Герасименко В. А., Размахин М, К. Криптографические методы в автоматизированных системах //Зарубежная радиоэлектроника. — 1982. — №8.— С. 97 — 123.
6.	Герасимов В. А. Защита информации на ВЦ и в АСУ ( по данным зарубежной печати) //Управляющие машины и системы. — 1982. — №4.— С. 3 — 60.
7.	ГОСТ 28147-89. Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования.
8.	Гэри М., Джонсон Д. Вычислительные Машины и труднорешаемые задачи: Пер. с англ. — М.: Мир, 1982. — 416 с.
9.	Дейтел Г. Введение в операционные системы: Пер. с англ. Т.2. —М.-.Мир, 1987, —398 с.
10.	Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и АТ: Пер. сангл. —М.: Финансы и статистика, 1991 г. — 544 с.
11.	Мамиконов А. Г., Кульба В. В., Шелков А. Б. Достоверность, защита и резервирование информации в АСУ. — М.: Энергоатомиздат, 1986. — 304 с.
12.	Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS: Пер. с англ. — М.: Радио и связь, 1991. —416с.
13.	Сяо Д., Керр Д., Мэдник С. Защита ЭВМ: Пер. с англ. — М.; Мир, 1982, —264 с.
190
Список литературы
14.	Хоффман Л. Дж. Современные методы защиты информации. — М.: Советское радио, 1980. — 267 с.
15.	Шураков В.В. Обеспечение сохранности информации в системах обработки данных (по данным зарубежной печати): Учебное пособие для вузов. — М.: Финансы и статистика, 1985. —224 с.
16.	Applied cryptology, crytographic, protocols and computer security models // Proc, of Symp. on applied mathematics. — 1983.—Vol. 29. — 186p.
17.	Arsenault A.W. Measuring Trust. Trusted Network Interpretation of the Trusted Computer System Evaluation Criteria // Journal of Electronic Defense. — February, 1988. — P. 47 — 49.
18.	Abrams M.D., Jeng A.B. Network security: Protocol reference models and the trusted computer system evaluation criteria // IEEE network magazine. — April 1987. — Vol. 1. — №2. — P.24 —33.
19.	Ames S.R.,Oestreicher D.R. Design of a message proceedings system for multilevel secure environment //Proc, of the AFIFS 1978 National Computer Conference.— AFIFS Press Reston, Va.
20.	Biraghi Carla. Information e secure tra top secret. 81a Montecarlo. Many e information. — 1981. — N. 19. — P. 115 — 117.
21.	Bottom N.R. An Information theory of security //Computer and security. — 1983. — N 2. — P. 275 — 280.
22.	Bell D.E., La Padula L.J. Secure systems: mathematics model // Technical Report 2547 (AD 77143). — The MITRE Corporation, Apr. 1974.
23.	Bell D.E., La Padula L.J. Secure computer systems: unified exposition and MULTICS interpretation // Texnical Report 2997 (AD/A 20445).— The MITRE Corporation, Apr. 1974.
24.	Browne P.S. How to manage the network security problem // Computer security journal. — 1984. — Vol. 3 — №1. — P. 77 — 87.
25.	Excerpts from DOD Trusted Computer System Evalution Criteria // Advances in computer system security. — 1984. — P. 123— 129.
26.	Forsdick H.C., Thomas R.H. The disign of Diamond — A distributed multimedia document system.— BBN Rep. 5204, Cambridge, Mass., Oct. — 1982.
27.	Heitmeyer C.L., Landwehr C.E. and Cornwell M.R. The use of quick prototypes in secure military message system. A Project // ACM SIGSOFT Softw. Eng. Notes, 7, 5 Dec., 1982. — P. 85 — 87.
28.	IBM Personal System/2. Model 80. Technical Reference& First Edition (April 1987).
Список литературы 191
29.	IBM PC/AT Technical Reference. Revised Edition (March 1986).
30.	INTEL Microsystem components handbook. — 1989.
31.	IBM PC DOS 3.30 Technical Reference.
32.	Heitmeyer C.L. and Landwehr C.E. Desining secure message systems: The Military message systems project //In Proceedings of the IFIP 6.5 Working Conference on Computer-Based Message Servces (Nottingham, U.K., May 1984). — Elsevier North-Holland, New York. — P. 245 — 255.
33.	Knowles T. Security in military OSI networks // Advanced in Control, Command and Communication System. — 1987. — P. 238 — 246.
34.	Landwehr C.E. Heitmeyer C.L and McLean J. A security model for Military Message Systems // ACM Transactions on Computer Systems. — 1984. — Vol. 2.— №3. — P. 198 — 222.
35.	Landwehr C.E. The Best Available Technologies for Computer Security //Computer. — 1983. — Vol. 16.— №7 — P. 88 — 100.
36.	La securite informatigue //Cross Jaen-Frarhi Measure. 1984. — Vol. 49,— №4. — P. 21 — 25.
37.	McCauley E.J., Drengowski P.J. KSOS — The design of a secure operating system // In Proc, of the AFIFS 1979 National Computer conference (June 4 — 7).— AFIFS Press Reston, Va. — Vol. 48.— P. 345 — 353.
38.	NBS. Special Publication 500-133. Texnology Assessment. Methods for Measuring level of computer security, VS.— Dep. of Commerce, NBS. — 1985.
39.	Oettinger A. Information resouces: Knowledge and power in the 21st century // Science. — 1980. — Vol. 209. — P. 191 — 198.
40.	Pierson L.G. and Witzke E.L. A Security methodology for computer networks // AT&T TECHNICAL Journal. — May-June 1988. — P. 28 — 36
41.	Rushby J. Networks are systems: discussion paper //Proc, of the Department of Defence Computer Security Center Invitation Workshop on Network Security.— NCSC, Mar. 19 — 22. — 1985.
42.	Schneiderman R. Military/govenment users: moving, but large, target // Systems & Software. — 1986. — Vol. 5. — № 1. — P. 24 27,31,33, 34, 36.
43.	Voydock V.L., Kent S.T. Security in high-level network protocols // Communication magazine. — 1985. — Vol. 23.— №7.-P. 12 — 23.
44.	Waring L.P. The security of date communications systems // Information Age. — 1983. — Vol. 5. — №2. — P. 97 — 104.
ББК 32.97
3-40
УДК 681.322
Сектор по выпуску заказных изданий.
Издание подготовлено и выпущено по заказу и при участии МП «Веста».
Защита информации в персональных ЭВМ/
3-40 Спесивцев А. В., Вегнер В. А., Крутиков А. Ю. и др.— М.: Радио и связь, МП «Веста», 1993.— 192 с.: ил.— (Библиотека системного программиста)
ISBN 5-256-01137-5.
В книге приводится аналитический обзор отечественных систем защиты информации от несанкционированного доступа, криптографических методов защиты информации и систем защиты программ от копирования. Рассмотрены варианты программной реализации систем защиты информации (включая авторскую систему КРИПТОН), а также средства разграничения доступа в ПЭВМ. Приводятся основные методы и подробные алгоритмы, позволяющие в течение 10"минут «взломать» некоторые распространенные системы защиты от копирования. На примере разработанной авторами системы CERBERUS излагается методология построения систем защиты, не поддающихся «взлому» известными способами. Приложения содержат тексты программ на ассемблере, иллюстрирующие положения обзора.
Для программистов и пользователей персональных ЭВМ типа IBM PC.
3^404010000-07 Без 046(01)—93
ББК 32.97
ISBN 5-256-01137-5
© Спесивцев А. В., Вегнер В. А., Крутиков А. Ю., Серегин В. В., Сидоров В. А., 1992
Производственное издание Спесивцев Александр Владимирович Вегнер Владимир Адольфович Крутяков Алексей Ювеналиевич Серегин Владимир Всеволодович Сидоров Владимир Александрович
ЗАЩИТА ИНФОРМАЦИИ В ПЕРСОНАЛЬНЫХ ЭВМ
Руководитель сектора Е. Н. Панина Редактор С. Н. Удалова Обложка художника Н. И. Казакова Технический редактор А. Б. Сливко-Кольчик
Адрес МП «Веста»: 126053, Москва, ул. Гашека, 9, кв. 3.
Подписано к печати с готовых монтажей 12.01.93. Формат 84x108Vm.
Бумага офсетная № 2. Гарнитура «Тип Таймс». Печать офсетная.
Усл. печ. л. 10,08. Усл. кр.-отг. 10,52. Уч. изд. л. 10. Тираж 25 000 экз.
Заказ 37005.
Отпечатано в типографии АО «Молодая гвардия» Адрес АО: Москва, Сущевская, 21.