Меню
  Список тем
  Поиск
Полезная информация
  Краткие содержания
  Словари и энциклопедии
  Классическая литература
Заказ книг и дисков по обучению
  Учебники, словари (labirint.ru)
  Учебная литература (Читай-город.ru)
  Учебная литература (book24.ru)
  Учебная литература (Буквоед.ru)
  Технические и естественные науки (labirint.ru)
  Технические и естественные науки (Читай-город.ru)
  Общественные и гуманитарные науки (labirint.ru)
  Общественные и гуманитарные науки (Читай-город.ru)
  Медицина (labirint.ru)
  Медицина (Читай-город.ru)
  Иностранные языки (labirint.ru)
  Иностранные языки (Читай-город.ru)
  Иностранные языки (Буквоед.ru)
  Искусство. Культура (labirint.ru)
  Искусство. Культура (Читай-город.ru)
  Экономика. Бизнес. Право (labirint.ru)
  Экономика. Бизнес. Право (Читай-город.ru)
  Экономика. Бизнес. Право (book24.ru)
  Экономика. Бизнес. Право (Буквоед.ru)
  Эзотерика и религия (labirint.ru)
  Эзотерика и религия (Читай-город.ru)
  Наука, увлечения, домоводство (book24.ru)
  Наука, увлечения, домоводство (Буквоед.ru)
  Для дома, увлечения (labirint.ru)
  Для дома, увлечения (Читай-город.ru)
  Для детей (labirint.ru)
  Для детей (Читай-город.ru)
  Для детей (book24.ru)
  Компакт-диски (labirint.ru)
  Художественная литература (labirint.ru)
  Художественная литература (Читай-город.ru)
  Художественная литература (Book24.ru)
  Художественная литература (Буквоед)
Реклама
Разное
  Отправить сообщение администрации сайта
  Соглашение на обработку персональных данных
Другие наши сайты
Приглашаем посетить
  Литература (lit-info.ru)

   

Защита данных от несанкционированного доступа

Защита данных от несанкционированного доступа

1. Введение.

Появившиеся в начале 80-ых персональные ЭВМ (ПЭВМ или ПК) прочно вошли во все сферы человеческой деятельности. Вместе с ними у эксплуатирующих ПЭВМ организаций и ведомств возникли и многочисленные проблемы. Одна из них — защита информации. Согласно статистическим данным более 80% компаний и агентств несут финансовые убытки из-за нарушения безопасности данных.

Проблема защиты информации представляет собой совокупность тесно связанных проблем в областях права, организации управления, разработки технических средств, программирования и математики. Одна из центральных задач проектирования систем защиты состоит в рациональном распределении имеющихся ресурсов.

Характерная особенность использования ПЭВМ в нашей стране заключатся в том, что доступ к ним имеют многие пользователи. В связи с таким "многопользовательским" режимом работы возникает целый набор взаимосвязанных вопросов по защите информации, хранящейся в ПЭВМ.

При создании и использовании ПЭВМ возникает целый ряд взаимосвязанных теоретических и практических проблем. В коммерческих и военных областях одной из основных является проблема защиты информации. Так можно выделить следующие объективные причины, определяющие важность проблемы защиты информации:

высокая степень концентрации информации в ПЭВМ;

усложнение вычислительного процесса в ПЭВМ.

Усложнение методов и средств организации машинной обработки информации приводят к тому, что информация становится все более уязвимой. Этому способствуют такие факторы, как постоянно возрастающие объемы обрабатываемых данных, накопление и хранение данных в ограниченных местах, постоянное расширение круга пользователей, имеющих доступ как к ресурсам ПЭВМ, так и к программам и данным, хранящихся в них, усложнение режимов эксплуатации вычислительных систем и т. п. [6]

1. Постановка задачи

1. 1. Организационно-экономическая сущность задачи

Защита информации в процессе ее сбора, хранения и обработки принимает исключительно важное значение. Под защитой информации принято принимать совокупность мероприятий, методов и средств, обеспечивающих решение следующих задач:

исключение несанкционированного доступа к защищаемым программам и данным;

исключение несанкционированного использования хранящихся в ПЭВМ программ (т. е. защита программ от копирования).

Использование ПЭВМ в военной, коммерческой и других областях человеческой деятельности порождает ряд специфических проблем, которые необходимо решить для защиты обрабатываемой и хранящейся в ПЭВМ информации. Одной из них является классификация возможных каналов утечки информации. Под возможным каналом утечки подразумевается способ, позволяющий нарушителю получить доступ к обрабатываемой и хранящейся в ПЭВМ информации [7].

аппаратура, программа. Применительно к ПЭВМ группу каналов, в которых основным средством является человек, составляют следующие основные возможные каналы утечки:

хищение носителей информации (дискет; лазерных, магнитных и магнитооптических дисков и т. д.);

чтение информации с экрана посторонним лицом (во время отображения информации на экране законным пользователем или при отсутствии законного пользователя на рабочем месте);

чтение информации из оставленных без присмотра распечаток программ.

В группе каналов, в которых основным средством является аппаратура, можно выделить следующие основные каналы утечки :

использование специальных технических средств для перехвата электромагнитных излучений технических средств ПЭВМ.

В группе каналов, в которых основным средством является программа, можно выделить следующие основные каналы утечки :

несанкционированный доступ программы к информации;

копирование программой информации с носителей.

В данной работе нас интересует последняя группа поэтому система защиты данных от несанкционированного доступа должна обеспечивать выполнение следующих функций:

идентификация ресурсов, т. е. присвоение ресурсам идентификаторов — уникальных признаков, по которым в дальнейшем система производит аутентификацию;

аутентификация защищаемых ресурсов, т. е. установление их подлинности на основе сравнения с эталонными идентификаторами;

разграничение доступа пользователей по операциям над ресурсами (программы, данные), защищаемыми с помощью программных средств;

администрирование:

определение прав доступа к защищаемым ресурсам,

установка системы защиты на ПЭВМ ,

снятие системы защиты с ПЭВМ,

контроль целостности и работоспособности систем защиты.

Во время создания системы защиты можно выделить следующие основные принципы, которых следует придерживаться при проектировании:

Простота механизма защиты. Этот принцип общеизвестен но не всегда глубоко осознается. Действительно, некоторые ошибки, не выявленные в ходе проектирования и эксплуатации, позволяют обнаружить неучтенные пути доступа. Необходимо тщательное тестирование программного или аппаратного средства защиты, однако на практике такая проверка возможна только для простых и компактных схем.

что запрет доступа при отсутствии особых указаний обеспечивает высокую степень надежности механизма защиты.

Психологическая привлекательность. Система защиты должна быть простой в эксплуатации [6].

шифрование выбранных файлов;

реакция на несанкционированный доступ.

1. 2. Входная информация

Т. к. программа работает с файлами (шифрование, установка защит), то входными данными являются файлы различного типа для шифрования и EXE- и COM-файлы для установки пароля и проверки по ключевой дискете.

1. 3. Постоянная информация

В качестве постоянной информации используются таблицы перестановок и константы генератора псевдослучайных чисел при шифровании файлов (подробнее см. Описание программы. Криптография).

1. 4. Выходная информация

Выходные данные — зашифрованные файлы и защищенные программы.

2. Вычислительная система

Программа “Защита данных от НСД” разрабатывалась под управлением операционной системы MS-DOS 6. 22. Предполагается, что программа будет работать без сбоев с MS-DOS и PC-DOS версий не ниже 5. 0.

Операционная система (ОС) является неотъемлемой частью ПЭВМ. ОС обеспечивает управление всеми аппаратными компонентами и поддержку работы программ пользователя, предоставляя ему возможность общего управления машиной.

К основным достоинствам MS DOS относятся:

возможность организации многоуровневых каталогов;

возможность подключения пользователем дополнительных драйверов внешних устройств;

возможность работы со всеми последовательными устройствами как с файлами;

развитый командный язык;

возможность запуска фоновых задач одновременно с диалоговой работой пользователя и др.

Важнейшей особенностью MS DOS является модульность, что позволяет при необходимости расширения функций системы модифицировать отдельные ее модули. DOS состоит из следующих основных модулей:

базовая система ввода/вывода (BIOS);

блок начальной загрузки (Boot Record);

модуль расширения базовой системы ввода/вывода(___BIO.COM);

модуль обработки прерываний (___DOS.COM);

командный процессор (COMMAND.COM);

утилиты DOS.

Достоинством DOS является то, что любая программа может играть роль сервисной, поскольку для ее запуска достаточно указать лишь имя файла, в котором она содержится. Следовательно, с точки зрения пользователя такие программы не отличаются от встроенных команд DOS. Программа может воспринимать параметры, задаваемые в командной строке. Храниться она может в любом каталоге на любом диске. Указанное свойство делает ДОС открытой для расширения. Неизменное ядро системы составляют лишь BIOS и три основных моду- ля: BIO.COM, DOS.COM и COMMAND.COM Общий объем оперативной памяти, занимаемой этими модулями, составляет до 60 Кбайт.

2. 2. Технические средства реализации задачи

Программа работает на компьютерах клона IBM, начиная с процессора Intel 80-286. Требуемый объем оперативной памяти — минимум 1,5 Mb. Минимальные требования к видеоаппаратуре — карта VGA и 256 Kb видеопамяти.

2. 3. Программные средства реализации задачи

© , 1992). Пакет Borland Pascal 7. 0 учитывает новейшие достижения в программировании и практике создания программ и включает в себя три режима работы:

защищенный режим MS-DOS

режим Windows.

Пакет Borland Pascal включает в себя как язык программирования — одно из расширений языка Паскаль для ПЭВМ клонов IBM, так и среду, предназначенную для написания, отладки и запуска программ.

Язык характеризуется расширенными возможностями по сравнению со стандартом, хорошо развитой библиотекой модулей, позволяющих использовать возможности операционной системы, создавать оверлейные структуры, организовывать ввод-вывод, формировать графические изображения и т. д.

Среда программирования позволяет создавать тексты программ, компилировать их, находить ошибки и оперативно их исправлять, компоновать программы из отдельных частей, включая стандартные модули, отлаживать и выполнять отлаженную программу. Пакет предоставляет пользователю также большой объем справочной информации.

Vision, но появился ряд характерных особенностей:

выделение цветом различных элементов программы;

ряд дополнительных расширений языка, таких, как использование открытых массивов, параметров-констант, типизированного адресного оператора @ и т. д.;

усовершенствованные программы Turbo Vision [2].

При написании программы также использовался интегрированный пакет Turbo Vision 2. 0. При создании прикладной программы программист большие усилия затрачивает на организацию ввода-вывода информации, т. е. на формирование интерфейса. Они соизмеримы с усилиями, затрачиваемыми на программирование основного алгоритма программы, по которому решается конкретная задача. Работа, связанная с организацией ввода-вывода, повторяется от программы к программе, требует выполнения однотипных операций, отвлекает внимание программиста от выполнения основной задачи.

Прекрасным средством упрощения работы по организации ввода-вывода, его унификации с учетом требований к интерфейсу программ является разработанный фирмой Borland International пакет Turbo Vision 2. 0, представляющий объектно-ориентированную библиотеку средств формирования пользовательского интерфейса. Кстати, интерфейс самого Borland Pascal 7. 0 (и Turbo Pascal 7. 0 тоже) построен на стандартных объектах Turbo Vision 2. 0.

Согласно этому рисунку программу можно представить как совокупность двух частей: часть программы, обеспечивающая решение основной программы, и часть, обеспечивающая организацию ввода-вывода с внешних устройств (на внешние устройства), — так называемый интерфейс программы. В основную часть (из основной части) информация может передаваться двумя способами — непосредственная передача информации (например, программа формирует какие-то данные и размещает их в конкретном файле на магнитном диске) и передача информации с помощью организации диалога (например, после формирования тех же данных происходит уточнение, в какой конкретно файл следует поместить сформированную информацию). Способ, основанный на организации диалога, является более универсальным и именно для организации диалога предназначен в первую очередь пакет Turbo Vision.

В программах, работающих в текстовом режиме, диалог обычно организуется с помощью трех средств: меню, диалоговых окон и строк состояния [3].

Также при создании программы использовался ассемблер — машинно-ориентированный язык. На ассемблере написаны основные подпрограммы, где требуется высокое быстродействие и минимальный размер программного кода.

3. Алгоритм задачи

Программу условно можно разделить на несколько частей:

Инсталляционный модуль.

Оболочка программы (написана с использованием Turbo Vision 2. 0).

Криптографическая защита (Borland Pascal 7. 0).

Защита программ паролем (TASM 3. 0).

Защита программ с помощью ключевой дискеты (TASM 3. 0).

Блокировка винчестера (TASM 3. 0).

3. 1 Инсталляционный модуль

Модуль инсталляции будет устанавливать программу на винчестер в определенный каталог, а также осуществлять привязку программы к уникальным идентификаторам BIOS.

3. 2. Оболочка программы

При создании интерактивного пользовательского интерфейса (оболочки программы) использовались стандартные объекты пакета Turbo Vision. Горизонтальное двухуровневое меню, строка состояния, рабочее поле, диалоговые окна, информационные сообщения и сообщения об ошибках, поддержка “мыши” — вот некоторые атрибуты оболочки.

3. 2. Криптографическая защита

Перед описанием алгоритма следует ввести некоторые термины.

Шифрованием называется процесс зашифрования или расшифрования данных.

Криптографическая защита — это защита данных с помощью криптографического преобразования, под которым понимается преобразование данных шифрованием.

Уравнение зашифрования — соотношение, описывающее процесс образования зашифрованных данных из открытых данных в результате преобразований, заданных алгоритмом криптографического преобразования.

Уравнение расшифрования — соотношение, описывающее процесс образования открытых данных из зашифрованных данных в результате преобразований, заданных алгоритмом криптографического преобразования.

Под шифром понимается совокупность обратимых преобразований множества открытых данных на множество зашифрованных данных, заданных алгоритмом криптографического преобразования.

Криптостойкостью называется характеристика шифра, определяющая его стойкость к дешифрованию. Обычно эта характеристика определяется периодом времени, необходимым для дешифрования [6].

Принцип зашифрования заключается в генерации гаммы шифра с помощью датчика псевдослучайных чисел (ПСЧ) и наложением полученной гаммы на открытые данные с помощью логической операции “исключающее ИЛИ” (т. е. обратимым образом).

Процесс расшифрования данных сводится к повторной генерации гаммы шифра при известном ключе и наложению такой гаммы на зашифрованные данные. Полученный зашифрованный текст является достаточно трудным для раскрытия в том случае, когда гамма шифра не содержит повторяющихся битовых последовательностей. По сути дела гамма шифра должна изменяться случайным образом для каждого шифруемого слова. Фактически если период гаммы превышает длину всего зашифрованного текста и неизвестна никакая часть исходного текста, то шифр можно раскрыть только прямым перебором (подбором ключа). В этом случае криптостойкость определяется размером ключа.

Чтобы получить линейные последовательности элементов гаммы, используются датчики ПСЧ. К настоящему времени на основе теории групп разработано несколько типов таких датчиков.

В своей программе я использовал так называемый конгруэнтный генератор ПСЧ — наиболее доступный и эффективный. Для этого класса генераторов ПСЧ можно сделать математически строгое заключение о том, какими свойствами обладают выходные сигналы этих генераторов с точки зрения периодичности и случайности.

Этот датчик ПСЧ генерирует псевдослучайные числа с определенным периодом повторения, зависящим от выбранных значений A и C. Значение М обычно устанавливается равным 2b , где b — длина слова ЭВМ в битах. Датчик имеет максимальный период М до того, как генерируемая последовательность чисел начнет повторяться. Линейный конгруэнтный датчик ПСЧ имеет максимальную длину М тогда и только тогда, когда A mod 4 = 1 и С — нечетное. В своей программе я положил А = 5, С = 27, Т(0) — пароль, вводимый пользователем.

С полученной последовательностью Т(i) поступают следующим образом:

F(i) = T(i) xor D(i) (2)

Где в (2) D(i) — последовательность открытых данных, F(i) — последовательность

зашифрованных данных [4].

При зашифровании входные данные шифруются по формуле (2), далее обрабатываются блоками по 64 слова (word). Эта обработка заключается в следующем: :4 слова переставляются в соответствии с таблицей, изображенной на рис. 2:

[ 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

Рис. 2. Перестановка после зашифрования.

Как видно из данной таблицы, слово 40 входной последовательности становится 1-ым, слово 8 — 2-ым и т. д.

Процесс расшифрования данных является инверсным относительно процесса зашифрования. Т. е. данные сначала переставляются в соответствии с таблицей, изображенной на рис. 3, а затем преобразуются по формуле (2). Как легко видеть, данная перестановка является обратной по отношению к начальной.

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

Рис. 3. Перестановка перед расшифрованием

4. Описание программы

При написании программы использовались следующие стандартные библиотеки Borland Pascal 7. 0 и Turbo Vision 2. 0:

Модуль Objects. Модуль Objects содержит основные определения объектов Turbo Vision, включая базовый объект иерархии Turbo Vision TObject, а также все невидимые элементы Turbo Vision: потоки, коллекции и ресурсы.

в качестве программ Turbo Vision и объект панели экрана, который управляет большинством элементов в оконных программах.

Модуль Views. Модуль Views содержит основные компоненты видимых элементов и полезные компоненты более сложных групп, таких как рамки окон и полосы скроллинга. Более сложные видимые элементы находятся в модулях Dialogs и TextView.

Модуль Dialogs. Модуль Dialogs определяет большинство элементов наиболее часто используемых при создании диалоговых окон. Этот модуль включает сами диалоговые окна (которые являются специализированными окнами) и различные элементы управления, такие как кнопки, метки, зависимые и независимые кнопки, строки ввода и списки истории.

Модуль Menus. Модуль Menus обеспечивает все объекты и процедуры для системы меню Turbo Vision, включая выпадающие меню и активные элементы строки статуса.

Модуль Drivers. Модуль Drivers содержит все специализированные драйверы Turbo Vision, включая драйверы мышки и клавиатуры, поддержку экрана и систему обработки ошибок с монитором событий для программ, управляемых событиями.

Модуль CRT. Модуль CRT содержит константы, переменные и подпрограммы, предназначенные для работы с консолью. В отличие от стандартного ввода-вывода, когда он осуществляется через операционную систему, подпрограммы этого модуля работают с BIOS и непосредственно с видеопамятью.

возможностей.

Кроме вышеперечисленных стандартных модулей был разработан модуль SetConf, в котором находится функция привязки программы к BIOS компьютера, т. е. защита от копирования.

BIOS. Если какой либо файл системы был изменен или параметры BIOS не соответствуют установленным в программе, система работать не будет. Для входа в систему необходимо ввести пароль. Эти проверки осуществляются в конструкторе Init объекта TMyApp. Этот же объект инициализирует меню (TMyApp. InitMenu), строку состояния (TMyApp. InitStatusLine), рабочее поле (TMyApp. InitDeskTop), устанавливает специальную цветовую палитру (TMyApp. GetPalette). Обработка событий (нажатие клавиш клавиатуры, работа с “мышью”) осуществляется в методе HandleEvent объекта TMyApp. При выборе какого-либо пункта меню управление передается соответствующему объекту или вызывается нужная подпрограмма.

В программе используются следующие процедуры, функции и объекты:

Shifr (процедура). Зашифрование файлов любого типа. Сначала получаем пароль от пользователя, затем создаем файл зашифрованных данных (*. M&A). Исходный файл считывается блоками по 64 word, кодируется с помощью генератора ПСЧ, затем переставляется в соответствии с таблицей, изображенной на рис. 2. Полученную последовательность записываем в файл с расширением *. M&A и т. д.

DeShifr (процедура). Расшифрование файлов, зашифрованных процедурой Shifr.

Block (процедура). Защита винчестера от записи.

Passwords (процедура). Изменение пароля входа в программу. Сначала запрашивает старый пароль, затем два раза новый.

TOptions ( объект, потомок объекта TDialog). Выводит диалоговое окно изменения настроек шифрования файлов: удалять или не удалять исходный файл, высвечивать или не высвечивать индикатор процесса шифрования.

5. Описание применения программы

Программа предназначена для защиты данных от несанкционированного доступа; в ней реализованы следующие функции:

защита исполняемых файлов с помощью ключевой дискеты;

отслеживание и реакция на ошибки;

привязка к BIOS.

Установка системы происходит с ключевой дискеты программой INSTALL. EXE, которая проверяет не была ли установлена система ранее; если нет, то создает на винчестере каталог C:\SUB ROSA и копирует в него файлы системы (Sub Rosa. exe, Block, KeyDisk, Plus, Passw, Setup. res, System. res).

При запуске программы Sub Rosa. exe сначала проверяется наличие всех файлов системы. Если хотя бы один файл изменен или удален, то система работать не будет. Для работы с программой необходимо ввести пароль.

В верхней части экрана находится полоска меню, состоящая из следующих пунктов:

“Файлы”:

— “Выбрать” (выбор файла для работы);

— “Сменить каталог” (смена текущего каталога);

— “Выход в DOS” (временный выход в DOS);

— “Завершение” (завершение работы с программой);

“Защита”:

— “Установить пароль” (защита EXE- и COM-файлов паролем);

— “Блокировать винчестер” (запрет записи любых данных на винчестер);

— “Добавить проверку по ключу” (защита EXE- и COM-файлов с помощью ключевой дискеты);

“Криптография”:

— “Зашифровать файл данных” (зашифрование выбранного файла);

— “Криптография” (изменение настроек криптографии);

— “Пароли” (изменение пароля входа в систему);

“О Программе” (информация о программе).

Во всех случаях , кроме блокировки винчестера, сначала необходимо выбрать файл для работы. Для установки защиты паролем или по ключевой дискете выбирается EXE- или COM-файл, для шифрования — файл любого типа.

6. Заключение

В заключении проведем анализ некоторых систем защиты от копирования. Следует отметить, что этот анализ не является исчерпывающим, так как эти системы постоянно развиваются, а также не всегда можно получить исчерпывающее описание алгоритмов — разработчики не стремятся раскрывать принципы их построения.

RANK — пакет защиты от НСД. Этот пакет реализует функцию контроля доступа к EXE- и COM-файлам. Следует отметить, что анализ разграничения доступа к программам ставит под серьезное сомнение возможность реализации такой функции без дополнительных мероприятий.

LATCH — комплекс программ защиты ПЭВМ от НСД. Этот комплекс обеспечивает безопасность данных , хранящихся на винчестере. При несанкционированном доступе происходит “зависание” ПЭВМ или не обнаруживается НЖМД.

Тезис о невозможности обнаружения НЖМД вызывает серьезные сомнения: например, для контроллеров SCSI не требуется определение типа НЖМД в памяти CMOS, так как параметры винчестера могут быть считаны с помощью команды контроллера.

Program SubRosa;

Uses

App, Dialogs, Drivers, Menus, MsgBox, Objects,

Validate, Views, Memory, StdDlg, Editors, {Модули Turbo Vision, далее - TV}

CRT, DOS, {Стандартные модули}

SetConf; {Модуль функции привязки к BIOS}

Var

MyRes : TResourceFile; {Переменная файла ресурсов, TV}

FName, MainDir, DName: string; {Переменные работы с файлами и каталогами}

Pos : string[3];

FilePass : file of char; {Переменнаяфайлапаролей}

OptFile, OptInd : word; {Переменныеопций}

Int09Save : pointer; {Переменная адреса 09h прерывания}

Const {Константы кодов команд, TV}

cmAboutBox = 700; {Окно "О Программе"}

cmCode = 1001; {Кодировать файл}

cmDeCode = 1002; {Декодировать файл}

cmSetPass = 1005; {Установить пароль на вход в систему}

cmLockDisk = 1006; {Запретить доступ к винчестеру}

cmOptions = 1007; {Опции криптографии}

cmKeyDisk = 1008; {Ключевая дискета}

cmPasswords = 1009; {Пароль на исполняемый файл}

cmChangePass= 1010; {Сменить пароль на вход в систему}

SetPass = 'passw.com';

KeyDisk = 'keydisk.com';

RMenuBar: TStreamRec = ( {Запись для работы с потоком, TV}

ObjType: 2000;

VmtLink: Ofs(TypeOf(TMenuBar)^);

Load: @TMenuBar. Load;

Store: @TMenuBar. Store);

Type

{Установка опций криптографии}

POptions = ^TOptions;

TOptions = object(TDialog)

constructor Init;

end;

{Объект для работы с текстом}

PMyStaticText = ^TMyStaticText;

function GetPalette: PPalette; virtual; {Переопределениепалитры}

end;

{Объекты для работы с файлами и каталогами}

PMyFDialog = ^TMyFDialog;

TMyFDialog = object(TFileDialog)

function GetPalette: PPalette; virtual;

end;

PMyFileDialog = ^TMyFileDialog;

InputName: string; AOptions: Word; HistoryId: Byte);

end;

PDirDialog = ^TDirDialog;

TDirDialog = object(TChDirDialog)

function GetPalette: PPalette; virtual;

end;

TMyChDirDialog = object(TDirDialog)

procedure SetUpDialog;

function Valid(Command: Word): Boolean; virtual;

end;

{Установка основного фона программы}

PMyBackground = ^TMyBackground;

TMyBackground = object(TBackground)

Text: TTitleStr;

constructor Init(var Bounds: TRect; AText: TTitleStr);

procedure Draw; virtual;

end;

procedure InitBackground; virtual;

end;

"О Программе"}

PAboutBox = ^TAboutBox;

TAboutBox = object(TDialog)

constructor Init;

end;

{Основной объект}

PMyApp = ^TMyApp;

TMyApp = object(TApplication)

destructor Done; virtual; {завершениеработы}

procedure HandleEvent(var Event: TEvent); virtual; {обработкасобытий}

procedure InitMenuBar; virtual; {инициализацияменю}

procedure InitDeskTop; virtual; {инициализациярабочегополя}

procedure InitStatusLine; virtual; {инициализациястрокисостояния}

procedure FileOpen(WildCard: PathStr); {окнодляработысфайлами}

function GetPalette: PPalette; virtual; {изменениестандартнойпалитры}

end;

{ Русифицированная функция формирования сообщения }

function MyMessageBoxRect(var R: TRect;

const Msg: string; Params: pointer;

const

ButtonName: array[0.. 3] of string[6] = ('Ага', 'Нека', 'Ага', 'Нека');

Titles: array[0.. 3] of string[11] =

('Предупреждение', 'Ошибка', 'Информация', 'Подтверждение');

var

I, X : integer;

Dialog : PDialog;

Control: PView;

S : string;

begin

Dialog:= New(PDialog, Init(R, Titles[AOptions and $3]));

with Dialog^ do

Options:= Options or ofCentered;

Insert(New(PStaticText, Init(R, S)));

X:= -2;

R. Assign(0, 0, 10, 2);

for I:= 0 to 3 do

<> 0 then

Inc(X, R. B. X - R. A. X + 2);

X:= (Size. X - X) shr 1;

for I:= 0 to 3 do

if AOptions and ($0100 shl I) <> 0 then

begin

Control:= New(PButton, Init(

R, ButtonName[I], Commands[i], bfNormal));

Insert(Control);

Control^. MoveTo(X, Size. Y - 3);

Inc(X, Control^. Size. X + 2);

end;

end;

if AOptions and mfInsertInApp = 0 then

MyMessageBoxRect:= DeskTop^. ExecView(Dialog)

else

MyMessageBoxRect:= Application^. ExecView(Dialog);

end;

{ Русифицированная функция формирования сообщения

стандартногоразмера }

Params: Pointer; AOptions: Word): Word;

var

R: TRect;

begin

R. Assign(0, 0, 40, 9);

MyMessageBox:= MyMessageBoxRect(R, Msg, Params, AOptions);

end;

function GetCurDir: DirStr;

var

CurDir: DirStr;

begin

GetDir(0, CurDir);

if Length(CurDir) > 3 then

Inc(CurDir[0]);

end;

GetCurDir:= CurDir;

end;

{Процедура инициализации окна работы с файлами}

procedure TMyApp. FileOpen(WildCard: PathStr);

var

FileName:= '*.*';

if ExecuteDialog(New(PMyFileDialog, Init(

100)), @FileName) <> cmCancel then FName:=FileName;

{открыть файл, потом...}

end;

{****************************************************************************}

{*----------============= К Р И П Т О Г Р А Ф И Я ================----------*}

{****************************************************************************}

{Шифрованиефайлов}

procedure Shifr(InputFileName: string);

const

C = 27; {генератора}

M = 65536; {псевдослучайных чисел, далее - ПСЧ}

var

InpF, OutF : file of word; {файлы на входе и выходе}

Password, Password1 : string; {переменные для работы с паролями}

OutputFileName, Exten : string; {переменныеименфайлов}

I, J, K, tmp : byte; {переменные кодирования}

Temp, SCode, TByte, Code: word;

NowPos : real;

TPassword : array [1.. 255] of word;

MasByte, Mas, MasEnd, PS: array [1.. 64] of word; {массивыперестановок}

T : array [0.. 64] of word;

DirInfo, DirInfo1 : SearchRec; {данныеофайле}

begin

if length(FName) > 3 then {Файлвыбран?}

begin

{Получить пароль}

Password1 := '';

InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);

if (Password = Password1) and (length(Password)<>0) then

begin

{Преобразовать файл}

FindFirst(InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

begin

while not EOF(TempFile) do read(TempFile, tmp);

tmp := 255;

write(TempFile, tmp);

close(TempFile);

end;

{Преобразовать имя файла}

assign(InpF, InputFileName);

reset(InpF);

for i := length(InputFileName) downto 1 do

if InputFileName[i] = '. ' then

begin

&A';

break;

end;

rewrite(OutF);

if InputFileName[length(InputFileName) - i] = '. ' then

0: Exten := chr(0) + chr(0) + chr(0);

1: Exten := copy(FName, length(FName)-2, i) + chr(0) + chr(0);

2: Exten := copy(FName, length(FName)-2, i) + chr(0)

else Exten := copy(FName, length(FName)-2, 3)

end;

for i := 1 to 3 do

begin

Write(OutF, Temp);

end;

{Начать шифрование}

k := 1;

repeat

begin

{Считать из исходного файла блок размером 64*word}

for i:=1 to 64 do

If EOF(InpF) then MasByte[i] := 0 else Read(InpF, MasByte[i]);

T[0] := ord(Password[k]);

if k < length(Password) then inc(k) else k := 1;

for i:= 1 to 64 do

begin

{Получить текущую позицию процесса}

NowPos := 100*Position/DirInfo. Size;

if NowPos > 100 then NowPos := 100;

Str(Round(NowPos):3, Pos);

if OptInd = 0 then

begin

GoToXY(77, 1);

end;

Code:=Mas[i];

T[i] := (A * T[i-1] + C) mod M;

Code:=T[i] xor Code;

Mas[i] := Code;

end;

for i:=1 to 8 do { Конечнаяперестановка }

for j:=1 to 8 do

case i of

1: MasEnd[8*(j-1)+i] := Mas[41-j];

2: MasEnd[8*(j-1)+i] := Mas[09-j];

3: MasEnd[8*(j-1)+i] := Mas[49-j];

4: MasEnd[8*(j-1)+i] := Mas[17-j];

5: MasEnd[8*(j-1)+i] := Mas[57-j];

6: MasEnd[8*(j-1)+i] := Mas[25-j];

7: MasEnd[8*(j-1)+i] := Mas[65-j];

8: MasEnd[8*(j-1)+i] := Mas[33-j]

end;

for i:= 1 to 64 do Write(OutF, MasEnd[i]);

end;

until eof(InpF);

OutputFileName, nil, mfInformation+mfOkButton);

Close(InpF);

if OptFile = 1 then Erase(InpF);

end

else MyMessageBox('Файл '+ InputFileName + ' несуществует!',

nil, mfInformation+mfOkButton);

end

end

else MyMessageBox(' Файлневыбран!!!', nil, mfError+mfOkButton);

end;

procedure DeShifr(InputFileName: String);

const

A = 5;

M = 65536;

var

Password, OutputFileName : string;

Password1 : string;

Exten : string[3];

SCode, Temp, Ext, TByte, Code: word;

I, J, K : byte;

Position : LongInt;

NowPos : real;

TPassword : array [1.. 255] of word;

MasByte, Mas, MasEnd, PS : array [1.. 64] of word;

T : array [0.. 64] of word;

begin

if (length(InputFileName) > 3) and

(copy(InputFileName, length(InputFileName)-2, 3) = 'M&A') then

begin

Password := '';

Password1 := '';

InputBox('ПАРОЛЬ', ' Введитепароль:', Password, 255);

InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);

<>0) then

begin

FindFirst(InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

Assign(InpF, InputFileName);

Position := 0;

Exten := '';

for i:= 1 to 3 do

begin

Read(InpF, Temp);

Exten := Exten + chr(Temp);

end;

for i := length(InputFileName) downto 1 do

if InputFileName[i] = '. ' then

begin

OutputFileName := copy(InputFileName, 1, i) + Exten;

break;

end;

Assign(OutF, OutputFileName);

Rewrite(OutF);

k := 1;

repeat

begin

for i:=1 to 64 do Read(InpF, MasByte[i]);

for i:=1 to 8 do { начальная перестановка }

for j:=1 to 8 do

case i of

1: Mas[8*(i-1)+j]:=MasByte[66-8*j];

2: Mas[8*(i-1)+j]:=MasByte[68-8*j];

3: Mas[8*(i-1)+j]:=MasByte[70-8*j];

4: Mas[8*(i-1)+j]:=MasByte[72-8*j];

5: Mas[8*(i-1)+j]:=MasByte[65-8*j];

7: Mas[8*(i-1)+j]:=MasByte[69-8*j];

8: Mas[8*(i-1)+j]:=MasByte[71-8*j]

end;

T[0] := ord(Password[k]);

if k < length(Password) then inc(k) else k := 1;

for i:= 1 to 64 do

begin

NowPos := 100*Position/DirInfo. Size;

inc(Position, 2);

If NowPos > 100 then NowPos := 100;

Str(Round(NowPos):3, Pos);

if OptInd = 0 then

begin

GoToXY(77, 1);

Write(Pos + '%');

end;

Code:=Mas[i];

Mas[i] := Code;

end;

for i := 1 to 64 do Write(OutF, MasEnd[i]);

end;

until eof(InpF);

GotoXY(77, 1);

write('100%');

MyMessageBox('Файл '+ InputFileName + ' расшифрованв ' +

OutputFileName, nil, mfInformation+mfOkButton);

if OptFile = 1 then Erase(InpF);

Close(OutF);

end

else MyMessageBox('Файл '+ InputFileName + ' несуществует!',

nil, mfInformation+mfOkButton);

end

else MyMessageBox(' Ошибкавводапароля!!!', nil,

mfError+mfOkButton);

end

else MyMessageBox(' Файлневыбран!!!', nil,

end;

constructor TOptions. Init;

var

Q, Q1: PView;

Butt : TRadioButtons;

R. Assign(0, 0, 60, 11);

inherited Init(R, 'Криптография');

Options := Options or ofCentered;

R. Assign(10, 8, 20, 10);

Insert(New(PButton, Init(R, '~А~га', cmOK, bfDefault)));

R. Assign(2, 2, 25, 3);

Insert(New(PLabel, Init(R, 'Исходныйфайл:', Q)));

R. Assign(5, 4, 21, 6);

Q:=New(PRadioButtons, Init(R,

NewSItem('~Н~еудалять',

NewSItem('~У~далять', nil))));

Insert(Q);

R. Assign(27, 2, 45, 3);

Insert(New(PLabel, Init(R, 'Индикатор:', Q1)));

NewSItem('~В~ысвечивать',

Insert(Q1);

end;

{Изменение пароля на вход в систему}

procedure Passwords;

var

begin

Ps := '';

Ps1 := '';

InputBox('П А Р О Л Ь', 'Введите пароль:', Ps, 255);

for i:= 1 to length(Ps) do Ps[i] :=chr(ord(Ps[i]) xor 27);

<> Pass then

MyMessageBox(' Неверныйпароль!!!', nil, mfError+mfOkButton);

ClrScr;

writeln('Несанкционированный доступ!');

Halt;

end;

InputBox('И З М Е Н Е Н И Е П А Р О Л Я',

InputBox('И З М Е Н Е Н И Е П А Р О Л Я',

if (Ps = Ps1) and (Ps <> '') then

begin

Assign(FilePass, 'system. res');

Rewrite(FilePass);

for i := 1 to length(PS) do

begin

tmp := chr(ord(Ps[i]) xor 27);

Write(FilePass, tmp);

end;

end

else MyMessageBox(' Ошибкавводапароля!!!', nil, mfError+mfOkButton);

end;

procedure CheckExec;

var

St: string;

begin

case DOSError of

2: MyMessageBox(' Ошибка DOS № ' +

St + ' "Файл не найден"',

"Путь не найден"',

nil, mfError + mfOkButton);

5: MyMessageBox(' Ошибка DOS № ' +

St + '"Неверный код доступа к файлу"',

nil, mfError + mfOkButton);

6: MyMessageBox(' Ошибка DOS № ' +

St + '"Неверный код системного обработчика файла"',

nil, mfError + mfOkButton);

St + ' "Недостаточно памяти"',

nil, mfError + mfOkButton);

10: MyMessageBox(' Ошибка DOS № ' +

St + ' "Неверная среда"',

nil, mfError + mfOkButton);

St + ' "Неправильный формат"',

nil, mfError + mfOkButton);

18: MyMessageBox(' Ошибка DOS № ' +

"Нет свободных обработчиков для файлов"',

nil, mfError + mfOkButton);

end;

end;

procedure MakeComFile(k: byte);

S : array [1.. 4] of string = ('c:\subrosa\plus. ', 'c:\subrosa\passw. ',

'c:\subrosa\block. ', 'c:\subrosa\keydisk. ');

Size : array [1.. 4] of word = (1068, 204, 617, 2118);

(ord('ы'), 39 , ord('Р')),

(ord('щ'), ord('Й'), ord('_')),

(ord('щ'), ord('А'), ord('_')));

var

I, Tmp : byte;

F : array [1.. 4, 1.. 2] of file ;

M : array [1.. 2200] of byte ;

NumRead, NumWritten: Word;

begin

assign(F[k, 2], S[k]+'com'); rewrite(F[k, 2], 1);

for i := 1 to 3 do

begin

BlockWrite(F[k, 2], Inden[k, i], 1, NumWritten);

end;

close(F[k, 1]); close(F[k, 2]);

end;

procedure DelComFile(k: byte);

const

{ S: array [1.. 4] of string =

('plus.com', 'passw.com', 'block.com', 'keydisk.com');}

S : array [1.. 4] of string = ('c:\subrosa\plus.com',

'c:\subrosa\passw.com',

'c:\subrosa\block.com',

var

F: array [1.. 4] of file;

begin

Erase(F[k]);

end;

var

FileStr, Err: string;

I : byte;

FileName : FNameStr;

Regs : Registers;

{Проверка условий}

> 3 then

if (copy(FName, length(FName)-2, 3) = 'EXE') or

(copy(FName, length(FName)-2, 3) = 'COM')

then

begin

{Преобразование имени файла}

for i:= length(fname) downto 1 do

begin

CmdLine := copy(FName, i+1, length(FName) - i);

break;

end;

for i := 1 to length(CmdLine) do

if CmdLine[i] in ['A'.. 'Z'] then

CmdLine[i] := chr(ord(CmdLine[i]) + 32);

for i := 1 to length(MainDir) do

if MainDir[i] in ['A'.. 'Z'] then

MakeComFile(1);

If WhatDo = KeyDisk then MakeComFile(4);

{Выполнить дописывание}

Exec( MainDir + 'plus.com ', CmdLine + ' ' + MainDir + WhatDo);

SwapVectors;

DelComFile(1);

If WhatDo = KeyDisk then DelComFile(4);

{Обработчикошибок}

if DosError <> 0 then

CheckExec

else

msdos(regs);

case Regs. AH of

0 : MyMessageBox(' Файл ' + FName + ' защищен. ',

nil, mfInformation + mfOkButton);

1 : MyMessageBox(' Ctrl-C или Ctrl-Break. ',

nil, mfError + mfOkButton);

2 : MyMessageBox(' Критическая ошибка устройства. ',

nil, mfError + mfOkButton);

nil, mfError + mfOkButton);

end;

end;

end

nil, mfError + mfOkButton);

end

nil, mfError + mfOkButton);

end;

{****************************************************************************}

{*----------===== Б Л О К И Р О В К А В И Н Ч Е С Т Е Р А ======----------*}

{****************************************************************************}

procedure LockDisk;

label

end_;

var

Err : string;

begin

{Проверка наличи программы в памяти}

asm

push ax

push dx

mov Inst, 0

mov ax,1059h

mov dx,2517h

cmp ax,2517h

jne End_

cmp dx,1059h

jne End_

mov Inst, 1

End_: pop dx

pop ax

end;

begin

{Установить защиту}

SwapVectors;

Exec(MainDir + 'block.com', '');

GetIntVec($09, Int09Save);

SwapVectors;

{Обраюотчикошибок}

if DosError <> 0 then

else

begin

with regs do

msdos(regs);

case Regs. AH of

0 : MyMessageBox(' Ненормальное завершение. ',

nil, mfError + mfOkButton);

nil, mfError + mfOkButton);

3 : MyMessageBox(' Винчестер блокирован. ',

end;

end;

end

else MyMessageBox(' Защитаужеустановлена. ',

nil, mfError + mfOkButton);

end;

{Изменить стандартную палитру}

function TDirDialog. GetPalette: PPalette;

const

{Синяя палитра}

CMyCluster = #64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+

#83#84#85#86#87#88#89#90#91#92#93#94#95;

begin

GetPalette := @P;

end;

constructor TMyChDirDialog. Init(AOptions: Word; HistoryId: Word);

var

R : TRect;

ScrollBar: PScrollBar;

CurDir : DirStr;

{ Создание окна }

R. Assign(16, 2, 64, 20);

TDialog. Init(R, 'Изменить катлог');

Options := Options or ofCentered;

{ Строка ввода имени каталога }

R. Assign(3, 3, 30, 4);

DirInput := New(PInputLine, Init(R, 68));

R. Assign(2, 2, 17, 3);

Insert(New(PLabel, Init(

R, '~И~мякаталога', DirInput)));

ScrollBar := New(PScrollBar, Init(R));

Insert(ScrollBar);

DirList := New(PDirListBox, Init(R, ScrollBar));

Insert(DirList);

R. Assign(2, 5, 19, 6);

Insert(New(PLabel, Init(

R, '~Д~ерево каталогов', DirList)));

R. Assign(35, 6, 45, 8);

OkButton := New(PButton, Init(

R, '~А~га', cmOK, bfDefault));

Insert(OkButton);

Inc(R. A. Y,3); Inc(R. B. Y,3);

R, '~С~мена', cmChangeDir, bfNormal));

Insert(ChDirButton);

Inc(R. A. Y,3); Inc(R. B. Y,3);

Insert(New(PButton, Init(

R, '~Н~ека', cmCancel, bfNormal)));

if AOptions and cdNoLoadDir = 0 then SetUpDialog;

SelectNext(False);

end;

procedure TMyChDirDialog. SetUpDialog;

var

CurDir: DirStr;

begin

if DirList <> nil then

begin

CurDir := GetCurDir;

DirList^. NewDirectory(CurDir);

if (Length(CurDir) > 3) and (CurDir[Length(CurDir)] = '\') then

CurDir := Copy(CurDir,1,Length(CurDir)-1);

if DirInput <> nil then

DirInput^. Data^ := CurDir;

DirInput^. DrawView;

end;

end;

end;

function TMyChDirDialog. Valid(Command: Word): Boolean;

var

begin

Valid := True;

P := FExpand(DirInput^. Data^);

if (Length(P) > 3) and (P[Length(P)] = '\') then

if IOResult <> 0 then

MyMessageBox(' Неправильный каталог!',

nil, mfError + mfOkButton);

Valid := False;

end;

{$I+}

end;

end;

constructor TMyBackground. Init(var Bounds: TRect; AText: TTitleStr);

begin

inherited Init(Bounds, ' ');

Text := AText;

while Length(Text) < SizeOf(TTitleStr) - 1 do

Text := Text + AText;

end;

var

DrawBuffer: TDrawBuffer;

begin

MoveStr(DrawBuffer, Text, GetColor(1));

WriteLine(0, 0, Size. X, Size. Y, DrawBuffer);

end;

procedure TMyDesktop. InitBackground;

var

R: TRect;

begin

GetExtent(R);

end;

{Изменить стандартную палитру}

function TMyStaticText. GetPalette: PPalette;

const

{Синяя палитра}

#83#84#85#86#87#88#89#90#91#92#93#94#95;

begin

GetPalette := @P;

end;

"О Программе"}

var

R: TRect;

begin

Options := Options or ofCentered;

R. Assign(10, 13, 20, 15);

Insert(New(PButton, Init(R, '~А~га', cmOK, bfDefault)));

R. Assign(11, 2, 19, 3);

Insert(New(pMyStaticText, Init(R, 'Sub Rosa')));

R. Assign(1, 4, 29, 5);

Insert(New(pStaticText, Init(R, 'СистемазащитыданныхотНСД')));

R. Assign(5, 5, 29, 6);

Insert(New(pStaticText, Init(R, 'выполненаучащимися')));

R. Assign(10, 6, 29, 7);

Insert(New(pStaticText, Init(R, 'гр. 4641')));

R. Assign(6, 7, 29, 8);

Insert(New(pStaticText, Init(R, 'ЕгановымМаксимом')));

R. Assign(14, 8, 22, 9);

Insert(New(pStaticText, Init(R, 'и')));

R. Assign(6, 9, 29, 10);

Insert(New(pStaticText, Init(R, 'ЮзефовичемАртемом')));

>

end;

{Работа программы начинается здесь...}

constructor TMyApp. Init;

var

ReturnVal, i : Word;

DirInfo3, DirInfo4, DirInfo5: SearchRec;

Pas : string;

st : char;

begin

OptInd := 1;

{Инициализировать файл ресурсов}

MyRes. Init(New(PBufStream, Init('Setup. res', stOpen, 1024)));

<> stOK then

begin

Write('Нарушение целостности!');

halt(1);

end;

RegisterType(RMenuBar);

{Проверить целостность системы}

MainDir := GetCurDir;

FindFirst('plus', AnyFile, DirInfo);

FindFirst('passw', AnyFile, DirInfo1);

FindFirst('block', AnyFile, DirInfo2);

FindFirst('keydisk', AnyFile, DirInfo3);

FindFirst('setup. res', AnyFile, DirInfo4);

if (DOSError = 0) and (DirInfo. Size = 1068) and (DirInfo1. Size = 204) and

(DirInfo2. Size = 617) and (DirInfo3. Size = 2118) and

(DirInfo4. Size = 522) then

begin

{Получитьпароль}

Reset(FilePass);

Pass := '';

begin

read(FilePass, st);

Pass := Pass + st;

end;

Close(FilePass);

{Инициализировать систему}

TApplication. Init;

Pas := '';

ReturnVal := ExecuteDialog(New(PAboutBox, Init), nil);

InputBox('П А Р О Л Ь', 'Введите пароль:', Pas, 255);

for i:= 1 to length(Pas) do Pas[i] :=chr(ord(Pas[i]) xor 27);

if Pas <> Pass then

begin

MyMessageBox(' Неверныйпароль!!!', nil, mfError+mfOkButton);

ClrScr;

writeln('Несанкционированный доступ!');

Halt;

end;

end

else

writeln('Нарушение целостности!');

Halt;

end;

end;

{Завершениеработы}

destructor TMyApp. Done;

begin

TApplication. Done;

MyRes. Done;

end;

procedure TMyApp. HandleEvent(var Event: TEvent);

procedure ChangeDir;

var

D:= New(PMyChDirDialog, Init(cdNormal, 101));

ExecuteDialog(D, nil);

end;

var

ReturnVal: Word;

regs : Registers;

R : TRect;

begin

inherited HandleEvent(Event);

case Event. What of

evCommand:

begin

cmAboutBox : ReturnVal :=

ExecuteDialog(New(PAboutBox, Init), nil);

cmOpen : FileOpen('*.*');

cmChangeDir : ChangeDir;

cmKeyDisk : Plus(KeyDisk);

cmDeCode : DeShifr(FName);

cmLockDisk : LockDisk;

cmOptions : ReturnVal :=

end;

ClearEvent(Event);

end;

end;

end;

{Инициализировать меню}

procedure TMyApp. InitMenuBar;

var

begin

{Получить меню из файла ресурсов по ключу "Config" - функция получения}

{даты BIOS; модуль SetConf}

MenuBar := PMenuBar(MyRes. Get(Config));

begin

Write(' Нелегальная копия!!!');

halt(1);

end;

end;

{Инициализировать рабочее поле}

procedure TMyApp. InitDesktop;

var

begin

GetExtent(R);

Desktop := New(PMyDesktop, Init(R));

end;

{Инициализировать строку состояния}

procedure tMyApp. InitStatusLine;

var

R: tRect;

begin

GetExtent(R);

R. A. Y:= R. B. Y - 1;

StatusLine:= New(pStatusLine, Init(R,

NewStatusDef(0, $FFFF,

NewStatusKey('~F1~ Опрограмме', kbF1, cmAboutBox,

NewStatusKey('~F3~ Файл', kbF3, cmOpen,

NewStatusKey('~F5~ Пароль', kbF10, cmMenu,

NewStatusKey('~F9~ Настройки', kbF9, cmOptions,

NewStatusKey('~F10~ Меню', kbF10, cmMenu,

NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit,

nil)))))),

nil)));

end;

{Изменить основную палитру}

const

P: Array [apColor.. apMonochrome] of string[Length(CAppColor)] =

begin

P[apColor, 50] := #$11; {1F}

P[apColor, 51] := #$11; {2F}

P[apColor, 1] := #$21; {71}

end;

{Изменить палитру окна выбора файлов}

function TMyFDialog. GetPalette: PPalette;

const

CMyCluster = #64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+

#83#84#85#86#87#88#89#90#91#92#93#94#95;

P: string [32] = CMyCluster;

begin

GetPalette := @P;

end;

{Инициализировать окно выбора файлов}

constructor TMyFileDialog. Init(AWildCard: tWildStr;

AOptions: Word; HistoryId: Byte);

var

ScrollBar: PScrollBar;

R : TRect;

begin

{ Создание окна диалога }

R. Assign(15, 1, 64, 20);

Options:= Options or ofCentered;

WildCard:= AWildCard;

{ Строкавводаименифайла }

FileName^. Data^:= WildCard;

Insert(FileName);

Insert(New(PHistory, Init(R, FileName, HistoryId)));

{ Линейка скроллинга и список файлов }

R. Assign(3, 14, 34, 15);

ScrollBar:= New(PScrollBar, Init(R));

Insert(ScrollBar);

FileList:= New(PFileList, Init(R, ScrollBar));

Insert(FileList);

R. Assign(2, 5, 8, 6);

{ Задание кнопок }

if AOptions and fdOpenButton <> 0 then

begin

Insert(New(PButton, Init(

R, 'Открыть', cmFileOpen, bfDefault)));

Inc(R. A. Y,3); Inc(R. B. Y,3);

end;

<> 0 then

begin

Insert(New(PButton, Init(

R, 'Ага', cmFileOpen, bfNormal)));

Inc(R. A. Y,3); Inc(R. B. Y,3);

end;

if AOptions and fdReplaceButton <> 0 then

begin

R, 'Замена',cmFileReplace, bfNormal)));

Inc(R. A. Y,3); Inc(R. B. Y,3);

end;

if AOptions and fdClearButton <> 0 then

begin

Insert(New(PButton, Init(

end;

Insert(New(PButton, Init(

R, 'Нека', cmCancel, bfNormal)));

{ Информационная панель с параметрами файла }

R. Assign(1, 16, 48, 18);

Insert(New(PFileInfoPane, Init(R)));

{ Загрузкакаталога }

if AOptions and fdNoLoadDir = 0 then

begin

Directory:= NewStr(GetCurDir);

end;

end;

Var

MyApp: TMyApp; {Переменная основного объекта}

Begin

WriteLn('Система защиты данных от НСД. Версия 1. 0 beta. '+

+' 1996 МГВРК Еганов М. Ю., Юзефович А. Г. ');

GetIntVec($09,Int09Save);

MyApp. Init;

MyApp. Run;

MyApp. Done;

End.