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

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

1. Введення.

З'явилися в початку 80-их персональні ЕОМ (ПЕОМ або ПК) міцно увійшли у всі сфери людської діяльності. Разом з ними у експлуатують ПЕОМ організацій і відомств виникли і численні проблеми. Одна з них - захист інформації. Згідно зі статистичними даними більше 80% компаній і агентств несуть фінансові збитки через порушення безпеки даних.

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

Характерна особливість використання ПЕОМ в нашій країні полягає у тому, що доступ до них мають багато користувачів. У зв'язку з таким "багатокористувацьким" режимом роботи виникає цілий набір взаємопов'язаних питань з захисту інформації, що зберігається в ПЕОМ.

При створенні та використанні ПЕОМ виникає цілий ряд взаємозв'язаних теоретичних і практичних проблем. У комерційних і військових галузях однією з основних є проблема захисту інформації. Так можна виділити наступні об'єктивні причини, що визначають важливість проблеми захисту інформації:

високі темпи зростання парку ПЕОМ, що знаходяться в експлуатації;

широке застосування ПЕОМ в самих різних сферах людської діяльності;

висока ступінь концентрації інформації в ПЕОМ;

вдосконалення способів доступу користувачів до ресурсів ПЕОМ;

ускладнення обчислювального процесу в ПЕОМ.

Ускладнення методів і засобів організації машинної обробки інформації призводять до того, що інформація стає все більш уразливою. Цьому сприяють такі чинники, як постійно зростаючі обсяги об'єми даних, накопичення і зберігання даних в обмежених місцях, постійне розширення кола користувачів, що мають доступ як до ресурсів ПЕОМ, так і до програм і даних, що зберігаються в них, ускладнення режимів експлуатації обчислювальних систем і т . п. [6]

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

1. 1. Організаційно-економічна сутність задачі

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

перевірка цілісності інформації;

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

виключення несанкціонованого використання зберігаються в ПЕОМ програм (тобто захист програм від копіювання).

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

Класифікацію можливих каналів витоку інформації виходячи з типу засобу, що є основним при отриманні інформації по можливому каналу витоку. Отже, можна виділити три типи засобів: людина, апаратура, програма. Стосовно до ПЕОМ групу каналів, в яких основним засобом є людина, складають наступні основні можливі канали витоку:

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

читання інформації з екрану сторонньою особою (під час відображення інформації на екрані законним користувачем або за відсутності законного користувача на робочому місці);

читання інформації з залишених без нагляду роздруківок програм.

У групі каналів, в яких основним засобом є апаратура, можна виділити такі основні канали витоку:

підключення до пристроїв ПЕОМ спеціально розроблених апаратних засобів,

забезпечують доступ до інформації;

використання спеціальних технічних засобів для перехоплення електромагнітних випромінювань технічних засобів ПЕОМ.

У групі каналів, в яких основним засобом є програма, можна виділити такі основні канали витоку:

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

розшифровка програмою зашифрованої інформації;

копіювання програмою інформації з носіїв.

У даній роботі нас цікавить остання група тому система захисту даних від несанкціонованого доступу повинна забезпечувати виконання таких функцій:

ідентифікація ресурсів, тобто привласнення ресурсів ідентифікаторів - унікальних ознак, за якими в подальшому система виробляє аутентифікацію;

аутентифікація захищаються ресурсів, тобто встановлення їх автентичності на основі порівняння з еталонними ідентифікаторами;

розмежування доступу користувачів за операціями над ресурсами (програми, дані), захищаються за допомогою програмних засобів;

адміністрування:

визначення прав доступу до ресурсів, що захищаються,

установка системи захисту на ПЕОМ,

зняття системи захисту з ПЕОМ,

контроль цілісності і працездатності систем захисту.

Під час створення системи захисту можна виділити наступні основні принципи, яких слід дотримуватися при проектуванні:

Простота механізму захисту. Цей принцип загальновідомий але не завжди глибоко усвідомлюється. Дійсно, деякі помилки, не виявлені в ході проектування і експлуатації, дозволяють виявити невраховані шляхи доступу. Необхідно ретельне тестування програмного або апаратного засобу захисту, проте на практиці така перевірка можлива тільки для простих і компактних схем.

Відсутність доступу. У механізмі захисту в нормальних умовах доступ повинен бути відсутній, і для роботи системи захисту необхідні умови, при яких доступ стає можливим. Крім того, вважається, що заборона доступу при відсутності особливих вказівок забезпечує високу ступінь надійності механізму захисту.

Механізм захисту можна не засекречувати, тобто не має сенсу засекречувати деталі реалізації систем захисту, призначеної для широкого користування.

Психологічна привабливість. Система захисту повинна бути простою в експлуатації [6].

Виходячи з цього, потрібно розробити систему захисту від несанкціонованого доступу, яка повинна забезпечувати виконання таких функцій:

аутентифікація користувача по паролю і за ключовою дискеті;

шифрування вибраних файлів;

установка на програми захисту від несанкціонованого запуску;

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

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

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

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

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

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

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

2. Обчислювальна система

2. 1. Операційна система

Програма "Захист даних від несанкціонованого доступу" розроблялася під управлінням операційної системи 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. Програмні засоби реалізації завдання

Програма "Захист даних від несанкціонованого доступу" розроблена в середовищі Borland Pascal 7.0 (Borland International ©, 1992). Пакет Borland Pascal 7.0 враховує новітні досягнення в програмуванні та практиці створення програм і включає в себе три режими роботи:

звичайний режим операційної системи MS-DOS

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

режим Windows.

Пакет Borland Pascal включає в себе як мова програмування - одне з розширень мови Паскаль для ПЕОМ клонів IBM, так і середу, призначену для написання, налагодження і запуску програм.

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

Середовище програмування дозволяє створювати тексти програм, компілювати їх, знаходити помилки і оперативно їх виправляти, компонувати програми з окремих частин, включаючи стандартні модулі, налагоджувати і виконувати налагоджену програму. Пакет надає користувачеві також великий обсяг довідкової інформації.

Версія 7.0 також, як і попередня, дозволяє застосовувати об'єктно-орієнтоване програмування, має вбудований асемблером, має інструментальний засіб створення інтерактивних програм - Turbo 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].

Також при розробці алгоритму шифрування використовувався алгоритм американського федерального стандарту на шифрування даних - Data Encryption Standard (DES).

При зашифруванні вхідні дані шифруються за формулою (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: потоки, колекції і ресурси.

Модуль App. Модуль App (надано у вихідних кодах) забезпечує елементи оболонки Turbo Vision. 4 дуже потужних об'єктних типу визначені в App, включаючи об'єкти TApplication і TProgram, які служать в якості програм Turbo Vision і об'єкт панелі екрана, який керує більшістю елементів у програмах.

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

Модуль Dialogs. Модуль Dialogs визначає більшість елементів найбільш часто використовуваних при створенні діалогових вікон. Цей модуль включає самі діалогові вікна (які є спеціалізованими вікнами) і різні елементи управління, такі як кнопки, мітки, залежні і незалежні кнопки, рядки введення і списки історії.

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

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

Модуль Memory. Модуль Memory містить процедури монітора пам'яті Turbo Vision, які забезпечують функції управління купою.

Модуль CRT. Модуль CRT містить константи, змінні і підпрограми, призначені для роботи з консоллю. На відміну від стандартного вводу-виводу, коли він здійснюється через операційну систему, підпрограми цього модуля працюють з BIOS і безпосередньо з відеопам'яттю.

Модуль DOS. Модуль DOS дозволяє використовувати можливості операційної системи MS-DOS, не передбачені у стандарті мови Паскаль, і містить типи, константи, змінні і для реалізації цих додаткових можливостей.

Крім перерахованих вище стандартних модулів був розроблений модуль 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.

Plus (процедура). Установка захисту паролем або за ключовою дискеті на програми.

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

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

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

CheckExec (процедура). Обробляє помилки DOS.

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, оскільки параметри вінчестера можуть бути лічені за допомогою команди контролера.

Додаток 1

Лістинг програми

Program Sub_Rosa;

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; {Змінні роботи з файлами і каталогами}

MainPass, Pass: string; {Змінні паролів}

Pos: string [3];

FilePass: file of char; {Змінна файлу паролів}

OptFile, OptInd: word; {Змінні опцій}

Int09_Save: 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;

TMyStaticText = object (TStaticText)

function GetPalette: PPalette; virtual; {Перевизначення палітри}

end;

{Об'єкти для роботи з файлами і каталогами}

PMyFDialog = ^ TMyFDialog;

TMyFDialog = object (TFileDialog)

function GetPalette: PPalette; virtual;

end;

PMyFileDialog = ^ TMyFileDialog;

TMyFileDialog = object (TMyFDialog)

constructor Init (AWildCard: tWildStr; const ATitle,

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

end;

PDirDialog = ^ TDirDialog;

TDirDialog = object (TChDirDialog)

function GetPalette: PPalette; virtual;

end;

PMyChDirDialog = ^ TMyChDirDialog;

TMyChDirDialog = object (TDirDialog)

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

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;

PMyDesktop = ^ TMyDesktop;

TMyDesktop = object (TDesktop)

procedure InitBackground; virtual;

end;

{Об'єкт "Про Програму"}

PAboutBox = ^ TAboutBox;

TAboutBox = object (TDialog)

constructor Init;

end;

{Основний об'єкт}

PMyApp = ^ TMyApp;

TMyApp = object (TApplication)

constructor Init; {ініціалізація}

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;

AOptions: word): word;

const

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

Commands: array [0 .. 3] of Word = (cmYes, cmNo, cmOK, cmCancel);

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

begin

Options: = Options or ofCentered;

R. Assign (3, 2, Size.X - 2, Size.Y - 3);

FormatStr (S, Msg, Params ^);

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

X: = -2;

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

for I: = 0 to 3 do

if AOptions and ($ 0100 shl I) 0 then

Inc (X, RBX - RAX + 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;

SelectNext (False);

end;

if AOptions and mfInsertInApp = 0 then

MyMessageBoxRect: = DeskTop ^. ExecView (Dialog)

else

MyMessageBoxRect: = Application ^. ExecView (Dialog);

Dispose (Dialog, Done);

end;

{Русифікована функція формування повідомлення

стандартного розміру}

function MyMessageBox (const Msg: String;

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

begin

Inc (CurDir [0]);

CurDir [Length (CurDir)]: ='';

end;

GetCurDir: = CurDir;

end;

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

procedure TMyApp.FileOpen (WildCard: PathStr);

var

FileName: FNameStr;

begin

FileName: ='*.*';

if ExecuteDialog (New (PMyFileDialog, Init (

WildCard, 'Відкрити файл', 'Ім'я', fdOpenButton,

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

{Відкрити файл, потім ...}

end;

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

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

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

{Шифрування файлів}

procedure Shifr (InputFileName: string);

const

A = 5; {Константи для}

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

M = 65536; {псевдовипадкових чисел, далі - ПСЧ}

var

TempFile: file of byte;

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

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

OutputFileName, Exten: string; {змінні імен файлів}

I, J, K, tmp: byte; {змінні кодування}

Temp, SCode, TByte, Code: word;

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;

DirInfo, DirInfo1: SearchRec; {дані про фото}

begin

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

begin

{Отримати пароль}

Password: ='';

Password1: ='';

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

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

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

begin

{Перетворити файл}

FindFirst (InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

if DirInfo.Size mod 2 = 1 then

begin

assign (TempFile, InputFileName);

reset (TempFile);

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

tmp: = 255;

write (TempFile, tmp);

close (TempFile);

end;

{Перетворити ім'я файлу}

Position: = 0;

assign (InpF, InputFileName);

reset (InpF);

for i: = length (InputFileName) downto 1 do

if InputFileName [i] = '.' then

begin

OutputFileName: = copy (InputFileName, 1, i) + 'M & A';

break;

end;

assign (OutF, OutputFileName);

rewrite (OutF);

for i: = 0 to length (InputFileName) do

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

case i of

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

Temp: = ord (Exten [i]);

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]);

Mas: = MasByte;

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];

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);

MyMessageBox ('Файл' + InputFileName + 'зашифрований з ім'ям' +

OutputFileName, nil, mfInformation + mfOkButton);

Close (InpF);

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, mfError + mfOkButton);

end;

procedure DeShifr (InputFileName: String);

const

A = 5;

C = 27;

M = 65536;

var

InpF, OutF: file of word;

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;

DirInfo: SearchRec;

begin

if (length (InputFileName)> 3) and

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

begin

Password: ='';

Password1: ='';

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

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

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

begin

FindFirst (InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

Assign (InpF, InputFileName);

Reset (InpF);

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);

for i: = 1 to length (Password) do TPassword [i]: = ord (Password [i]);

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];

6: Mas [8 * (i-1) + j]: = MasByte [67-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;

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

Code: = Mas [i];

Code: = T [i] xor Code;

Mas [i]: = Code;

end;

MasEnd: = Mas;

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);

Close (InpF);

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,

mfError + mfOkButton);

end;

{Опції криптографії}

constructor TOptions.Init;

var

R: TRect;

Q, Q1: PView;

Butt: TRadioButtons;

begin

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 (40, 8, 50, 10);

Insert (New (PButton, Init (R, '~ Н ~ ека', cmCancel, bfNormal)));

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)));

R. Assign (30, 4, 50, 6);

Q1: = New (PRadioButtons, Init (R,

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

NewSItem ('~ Н ~ е висвічувати', nil ))));

Insert (Q1);

end;

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

procedure Passwords;

var

Ps, Ps1: string;

I: byte;

tmp: char;

begin

Ps: ='';

Ps1: ='';

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

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

if Ps Pass then

begin

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

ClrScr;

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

Halt;

end;

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

'Введіть новий пароль:', Ps, 255);

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

'Ще раз введіть:', Ps1, 255);

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;

Close (FilePass);

end

else MyMessageBox ('Помилка введення пароля !!!', nil, mfError + mfOkButton);

end;

{Обробка помилок}

procedure CheckExec;

var

St: string;

begin

Str (DOSError, St);

case DOSError of

2: MyMessageBox ('Помилка DOS №' +

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

nil, mfError + mfOkButton);

3: MyMessageBox ('Помилка DOS №' +

St + '"Шлях не знайдено"',

nil, mfError + mfOkButton);

5: MyMessageBox ('Помилка DOS №' +

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

nil, mfError + mfOkButton);

6: MyMessageBox ('Помилка DOS №' +

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

nil, mfError + mfOkButton);

8: MyMessageBox ('Помилка DOS №' +

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

nil, mfError + mfOkButton);

10: MyMessageBox ('Помилка DOS №' +

St + '"Невірна середовище"',

nil, mfError + mfOkButton);

11: MyMessageBox ('Помилка DOS №' +

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

nil, mfError + mfOkButton);

18: MyMessageBox ('Помилка DOS №' +

St + '"Немає вільних обробників для файлів"',

nil, mfError + mfOkButton);

end;

end;

procedure MakeComFile (k: byte);

const

S: array [1 .. 4] of string = ('c: sub_rosaplus.', 'C: sub_rosapassw.',

'C: sub_rosablock.', 'C: sub_rosakeydisk.');

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

Inden: array [1 .. 4, 1 .. 3] of byte = ((ord ('и'), 26, ord ('Р')),

(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, 1], S [k]); reset (F [k, 1], 1);

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

for i: = 1 to 3 do

begin

BlockRead (F [k, 1], tmp, 1, NumRead);

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

end;

BlockRead (F [k, 1], M, Size [k] -3, NumRead);

BlockWrite (F [k, 2], M, Size [k] -3, NumWritten);

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: sub_rosaplus.com',

'C: sub_rosapassw.com',

'C: sub_rosablock.com',

'C: sub_rosakeydisk.com');

var

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

begin

Assign (F [k], S [k]);

Erase (F [k]);

end;

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

{*----------=========== Д О П И С А Т Ь К Ф А Й Л У ==========--- -------*}

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

procedure Plus (WhatDo: string);

var

FileStr, Err: string;

CmdLine: string;

I: byte;

FileName: FNameStr;

Regs: Registers;

begin

{Перевірка умов}

if Length (FName)> 3 then

begin

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

if fname [i] =''then

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

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

MakeComFile (1);

If WhatDo = SetPass then MakeComFile (2);

If WhatDo = KeyDisk then MakeComFile (4);

{Виконати дописування}

SwapVectors;

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

SwapVectors;

DelComFile (1);

If WhatDo = SetPass then DelComFile (2);

If WhatDo = KeyDisk then DelComFile (4);

{Обробник помилок}

if DosError 0 then

CheckExec

else

begin

regs.ah: = $ 4D;

with regs do

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);

3: MyMessageBox ('TSR - програма.',

nil, mfError + mfOkButton);

end;

end;

end

else MyMessageBox ('Помилка вибору файлу!',

nil, mfError + mfOkButton);

end

else MyMessageBox ('Файл не вибрано!',

nil, mfError + mfOkButton);

end;

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

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

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

procedure LockDisk;

label

end_;

var

Regs: registers;

Err: string;

Inst: byte;

begin

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

asm

push ax

push dx

mov Inst, 0

mov ax, 1059h

mov dx, 2517h

int 13h

cmp ax, 2517h

jne End_

cmp dx, 1059h

jne End_

mov Inst, 1

End_: pop dx

pop ax

end;

if Inst = 0 then

begin

MakeComFile (3);

{Установити захист}

SwapVectors;

SetIntVec ($ 09, Int09_Save);

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

GetIntVec ($ 09, Int09_Save);

SwapVectors;

{Обраюотчік помилок}

if DosError 0 then

CheckExec

else

begin

regs.ah: = $ 4D;

with regs do

msdos (regs);

case Regs.AH of

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

nil, mfError + mfOkButton);

1: MyMessageBox ('Ctrl-C або Ctrl-Break.',

nil, mfError + mfOkButton);

2: MyMessageBox ('Критична помилка пристрою.',

nil, mfError + mfOkButton);

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

nil, mfInformation + mfOkButton); {TSR}

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;

P: string [32] = CMyCluster;

begin

GetPalette: = @ P;

end;

{Вікно роботи з каталогами}

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

var

R: TRect;

ScrollBar: PScrollBar;

CurDir: DirStr;

begin

{Створення вікна}

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));

Insert (DirInput);

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

Insert (New (PLabel, Init (

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

{Список каталогів}

R. Assign (32, 6, 33, 16);

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

Insert (ScrollBar);

R. Assign (3, 6, 32, 16);

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 (RAY, 3); Inc (RBY, 3);

ChDirButton: = New (PButton, Init (

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

Insert (ChDirButton);

Inc (RAY, 3); Inc (RBY, 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

begin

DirInput ^. Data ^: = CurDir;

DirInput ^. DrawView;

end;

end;

end;

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

var

P: PathStr;

begin

Valid: = True;

if Command = cmOk then

begin

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

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

Dec (P [0]);

{$ I-}

ChDir (P);

if IOResult 0 then

begin

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;

procedure TMyBackground.Draw;

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);

Background: = New (PMyBackground, Init (R,'___'));

end;

{Змінити стандартну палітру}

function TMyStaticText.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 TAboutBox.Init;

var

R: TRect;

begin

R. Assign (0, 0, 30, 16);

inherited Init (R, 'Про програму');

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, 'Юзефовичем Артемом')));

R. Assign (6, 11, 29, 12); P>

Insert (New (pStaticText, Init (R, 'МГВРК, Мінськ, 1996')));

end;

{Робота програми починається тут ...}

constructor TMyApp.Init;

var

ReturnVal, i: Word;

DirInfo, DirInfo1, DirInfo2: SearchRec;

DirInfo3, DirInfo4, DirInfo5: SearchRec;

Pas: string;

st: char;

begin

OptInd: = 1;

{Ініціалізувати файл ресурсів}

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

if MyRes.Stream ^. Status 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

{Отримати пароль}

Assign (FilePass, 'system.res');

Reset (FilePass);

Pass: ='';

while not EOF (FilePass) do

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

begin

writeln ('Порушення цілісності!');

Halt;

end;

end;

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

destructor TMyApp.Done;

begin

TApplication.Done;

MyRes.Done;

end;

{Обробка подій}

procedure TMyApp.HandleEvent (var Event: TEvent);

procedure ChangeDir;

var

D: PMyChDirDialog;

begin

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

case Event.Command of

cmAboutBox: ReturnVal: =

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

cmOpen: FileOpen ('*.*');

cmChangeDir: ChangeDir;

cmSetPass: Plus (SetPass);

cmKeyDisk: Plus (KeyDisk);

cmCode: Shifr (FName);

cmDeCode: DeShifr (FName);

cmLockDisk: LockDisk;

cmOptions: ReturnVal: =

ExecuteDialog (New (POptions, Init), @ OptFile);

cmPasswords: Passwords

end;

ClearEvent (Event);

end;

end;

end;

{Ініціалізувати меню}

procedure TMyApp.InitMenuBar;

var

R: TRect;

begin

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

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

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

if MenuBar = nil then

begin

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

halt (1);

end;

end;

{Ініціалізувати робоче поле}

procedure TMyApp.InitDesktop;

var

R: TRect;

begin

GetExtent (R);

R. Grow (0, -1);

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

end;

{Ініціалізувати рядок стану}

procedure tMyApp.InitStatusLine;

var

R: tRect;

begin

GetExtent (R);

RAY: = RBY - 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;

{Змінити основну палітру}

function TMyApp.GetPalette: PPalette;

const

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

(CAppColor, CAppBlackWhite, CAppMonochrome);

begin

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

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

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

GetPalette: = @ P [AppPalette];

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;

const ATitle, InputName: string;

AOptions: Word; HistoryId: Byte);

var

ScrollBar: PScrollBar;

R: TRect;

begin

{Створення вікна діалогу}

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

TDialog.Init (R, ATitle);

Options: = Options or ofCentered;

WildCard: = AWildCard;

{Рядок введення імені файлу}

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

FileName: = New (PFileInputLine, Init (R, 79));

FileName ^. Data ^: = WildCard;

Insert (FileName);

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

Insert (New (PLabel, Init (R, InputName, FileName)));

R. Assign (31, 3, 34, 4);

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

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

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

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

Insert (ScrollBar);

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

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

Insert (FileList);

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

Insert (New (PLabel, Init (R, 'Файли', FileList)));

{Завдання кнопок}

R. Assign (35, 3, 46, 5);

if AOptions and fdOpenButton 0 then

begin

Insert (New (PButton, Init (

R, 'Відкрити', cmFileOpen, bfDefault)));

Inc (RAY, 3); Inc (RBY, 3);

end;

if AOptions and fdOkButton 0 then

begin

Insert (New (PButton, Init (

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

Inc (RAY, 3); Inc (RBY, 3);

end;

if AOptions and fdReplaceButton 0 then

begin

Insert (New (PButton, Init (

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

Inc (RAY, 3); Inc (RBY, 3);

end;

if AOptions and fdClearButton 0 then

begin

Insert (New (PButton, Init (

R, 'Видал.', CmFileClear, bfNormal)));

Inc (RAY, 3); Inc (RBY, 3);

end;

Insert (New (PButton, Init (

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

{Інформаційна панель з параметрами файлу}

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

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

SelectNext (False);

{Завантаження каталогу}

if AOptions and fdNoLoadDir = 0 then

begin

FileList ^. ReadDirectory (WildCard);

Directory: = NewStr (GetCurDir);

end;

end;

Var

MyApp: TMyApp; {Змінна основного об'єкта}

Begin

WriteLn ('Система захисту даних від несанкціонованого доступу. Версія 1.0 beta.' +

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

GetIntVec ($ 09, Int09_Save);

MyApp.Init;

MyApp.Run;

MyApp.Done;

SetIntVec ($ 09, Int09_Save);

End.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Диплом
98.5кб. | скачати


Схожі роботи:
Захист від несанкціонованого доступу
Захист інформації від несанкціонованого доступу
Розробка програми захисту інформації від несанкціонованого доступу на базі алгоритму шифрування
Инфологическая модель бази даних Захист доступу
Використання Internetintranet технологій для організації доступу до баз даних
Захист даних і адміністрування бази даних
Основи використання WWW - технологій для доступу до існуючих баз даних
Основи використання WWW - технологій для доступу до існуючих баз даних
Засоби доступу до баз даних в Internet і вільно доступна СУБД POSTGRES95
© Усі права захищені
написати до нас