Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/6276| Title: | Дослідження процесів посилення мережевої безпеки критично важливої комунальної інфраструктури |
| Authors: | Рудаков, Костянтин Сергійович Шевченко, Сергій Сергійович |
| Issue Date: | Jan-2023 |
| Abstract: | У роботі проведено аналіз безпеки комп’ютерних мереж (КМ) комунальних підприємств. У українському та зарубіжному законодавстві відомі такі нормативні документи, в яких розглядається процедура аналізу захищеності КМ: ISO 15408, ISO 17799, ISO 19791, ISO 27001, NSA IAM, CHECK, NISP SP800-26, NIST SP800-42. Нажаль жоден документ не надає чітких визначень процедури аналізу захищеності та методики її виконання, що значно ускладнює впровадження технологій аналізу та аудиту інформаційної безпеки КМ. Головними об’єктами, що використовуються при забезпеченні комплексних заходів є: проксі-сервери, системи виявлення та попередження загроз зламу, засоби захисту від цільових атак, міжмережеві екрани, системи моніторингу та VPN. В рамках дослідження розглядались можливості аналізу безпеки КМ за моделлю як зовнішнього порушника так внутрішнього. Дослідження світових практики показав що головними інструментами аналізу безпеки КМ є: Network Mapper, , SNMPWalk, Fpipe, N-Stealth Security Scanner, SQLRECON, Netcat, John the Ripper та Metasploit Framework, що дає в подальшому можливість задіяти їх та провести комплексну оцінку безпеки за рахунок чотирьох основних етапів: збору даних, прив'язки, оцінки та проникнення. |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/6276 |
| Appears in Collections: | 123 Комп’ютерна інженерія (Спеціалізовані комп’ютерні системи) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| М_123_2022_Шевченко.pdf Restricted Access | 2.2 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОІЧНИЙ УНІВЕРСИТЕТ
ФАКУЛЬТЕТ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ І СИСТЕМ
КАФЕДРА РОБОТОТЕХНІКИ ТА СПЕЦІАЛІЗОВАНИХ КОМП’ЮТЕРНИХ
СИСТЕМ
Пояснювальна записка
до кваліфікаційної роботи
освітнього ступеню «магістр»
на тему: ДОСЛІДЖЕННЯ ПРОЦЕСІВ ПОСИЛЕННЯ МЕРЕЖЕВОЇ БЕЗПЕКИ
КРИТИЧНО ВАЖЛИВОЇ КОМУНАЛЬНОЇ ІНФРАСТРУКТУРИ
Виконав: студент 2 курсу, групи МСКС-2107
спеціальності 123 Комп’ютерна
інженерія, освітня програма
«Спеціалізовані комп’ютерні системи»
Сергій ШЕВЧЕНКО
(ім’я, ПРІЗВИЩЕ)
Керівник Костянтин РУДАКОВ
(ім’я, ПРІЗВИЩЕ)
Рецензент
(ім’я, ПРІЗВИЩЕ)
Черкаси 2022 року
2
Зміст
ВСТУП ......................................................................................................................... 4
РОЗДІЛ 1. АНАЛІЗ МЕХАНІЗМІВ ЗАХИСТУ МЕРЕЖ ...................................... 11
РОЗДІЛ 2. АНАЛІЗ ІНФОРМАЦІЙНОЇ БЕЗПЕКИ МЕРЕЖ ............................... 21
2.1 ПОНЯТТЯ МЕРЕЖНОЇ ІНФОРМАЦІЙНОЇ АТАКИ .................................................... 21
2.2 СПОСОБИ КЛАСИФІКАЦІЇ АТАК З ПОЗИЦІЇ ПОБУДОВИ СИСТЕМ ЇХ ВИЯВЛЕННЯ ... 23
2.3 МЕТОДОЛОГІЯ ВИЯВЛЕННЯ АТАК ....................................................................... 36
2.4 ПЕРСПЕКТИВИ РОЗВИТКУ СВА .......................................................................... 39
РОЗДІЛ 3. СИНТЕЗ АЛГОРИТМУ ВИЯВЛЕННЯ АТАК ТИПУ „ВІДМОВА
В ОБСЛУГОВУВАННІ” ....................................................................................... 40
3.1 ВИЗНАЧЕННЯ ТИМЧАСОВИХ ІНТЕРВАЛІВ СИСТЕМИ. МОДЕЛЮВАННЯ ПОТОКУ
ТРАФІКА. ............................................................................................................. 40
3.2 ПОБУДОВА СТАТИСТИЧНОГО АЛГОРИТМУ ВИЯВЛЕННЯ АТАК ............................. 42
3.3 РОЗРОБКА СТРУКТУРИ СХОВИЩА ДАНИХ........................................................... 45
РОЗДІЛ 4. СИНТЕЗ ПРОГРАМНО-АПАРАТНОГО КОМПЛЕКСУ ІСВНВ ...... 47
4.1 ВИБІР ПРОГРАМНИХ ЗАСОБІВ ............................................................................. 47
4.2 ОПИС АПАРАТНИХ ЗАСОБІВ ................................................................................ 58
4.3 ІНТЕРФЕЙС ІСВНВ ............................................................................................ 58
4.4 АНАЛІЗ ПРАЦЕЗДАТНОСТІ ІСВНВ ...................................................................... 60
4.5 СТВОРЕННЯ АПАРАТНОЇ МОДЕЛІ ЗАХИЩЕНОЇ МЕРЕЖІ ....................................... 61
СПИСОК СКОРОЧЕНЬ ............................................................................................ 72
ВИСНОВКИ ............................................................................................................... 73
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ ........................................................... 74
ДОДАТОК АПОРІВНЯННЯ ВІДОМИХ ТИПІВ СИСТЕМ ВИЯВЛЕННЯ
ВТОРГНЕНЬ .......................................................................................................... 77
ДОДАТОК Б ЖИТТЄВИЙ ЦИКЛ ТИПОВОЇ АТАКИ .......................................... 78
ДОДАТОК В БЛОК-СХЕМА АЛГОРИТМУ ПОБУДОВИ МОДЕЛІ
ЗАВАНТАЖЕНОСТІ СЕРВЕРА .......................................................................... 79
ДОДАТОК Г ФУНКЦІОНАЛЬНА МОДЕЛЬ ПРОЦЕСУ ВИЯВЛЕННЯ
АТАКИ .................................................................................................................... 80
3
ДОДАТОК Д ВАРІАНТИ ІНТЕГРАЦІЇ ІСВНВ В МЕРЕЖІ ПЕРЕДАЧІ
ДАНИХ ................................................................................................................... 81
ДОДАТОК Е ГРОШОВИЙ ЕКВІВАЛЕНТ ВТРАТ ВІД РІЗНИХ ТИПІВ
АТАК ....................................................................................................................... 82
ДОДАТОК Ж ТЕКСТ ПРОГРАМИ ......................................................................... 83
4
ВСТУП
Виявлення вторгнень залишається областю активних досліджень уже
протягом двох десятиліть. Вважається, що початок цьому напрямку, було
покладено в 1980 р. статтею Джеймса Андерсона "Моніторинг погроз
комп'ютерної безпеки". Трохи пізніше, в 1987 р. цей напрямок був розвинений
публікацією статті "Про модель виявлення вторгнення" Дороти Деннинг. Вона
забезпечила методологічний підхід, що надихнув багатьох дослідників, що й
заклав основу для створення комерційних продуктів в області виявлення
вторгнень.
Вивчення методів виявлення аномалій було випереджено аксіомою, що
можна розрізняти користувачів, що й маскуються і дійсно законних, засобами
виявлення відхилень від історично склавшегося використання системи.
Виражалася надія, що підхід на основі аналізу даних аудита буде корисний для
ідентифікації не тільки кракерів, різними способами добуваючих інформацію
про ідентифікацію й аутентификацію, що й застосовують її для маскування під
авторизованих користувачів, але також і самих авторизованих користувачів, що
виконують несанкціоновані дії, тобто, що зловживають своїми привілеями. По
статистиці, близько 80% відсотків зломів проводиться зсередини, тобто,
співробітниками самої організації.
Системи виявлення вторгнень (IDS - Intrusion Detection Systems) - один з
найважливіших елементів систем інформаційної безпеки мереж будь-якого
сучасного підприємства. Зростання в останні роки числа проблем, пов'язаних з
комп'ютерною безпекою, привів до того, що системи виявлення вторгнення
дуже швидко стали ключовим компонентом будь-якої стратегії мережного
захисту. За останні кілька років їх популярність значно зросла, оскільки
продавці засобів захисту значно поліпшили якість і сумісність своїх програм.
Системами виявлення вторгнень називають безліч різних програмних і
апаратних засобів, поєднуваних однією загальною властивістю: вони
займаються аналізом використання довірених їм ресурсів і, у випадку
5
виявлення яких-небудь підозрілих або просто нетипових подій, здатні вживати
деякі самостійні дії по виявленню, ідентифікації й усуненню їх причин.
Системами виявлення вторгнень називають безліч різних програмних і
апаратних засобів, поєднуваних однією загальною властивістю - вони
займаються аналізом використання довірених їм ресурсів і, у випадку
виявлення яких-небудь підозрілих або просто нетипових подій, здатні вживати
деякі самостійні дії по виявленню, ідентифікації й усуненню їх причин.
Але системи виявлення вторгнень лише один з інструментів захисного
арсеналу й він не повинен розглядатися як заміна для кожного з інших захисних
механізмів. Захист інформації найбільш ефективний, коли в інтрамережі
підтримується багаторівневий захист. Вона складається з наступних
компонентів:
• Політики безпеки інтромережі організації;
• Системи захисту хостів у мережі;
• Мережного аудита;
• Захисту на основі маршрутизаторів;
• Застосування міжмережевих екранів;
• Системи виявлення вторгнень;
• Плану реагування на виявлені атаки.
Отже, для повного захисту цілісності мережі необхідна реалізація всіх
перерахованих вище компонентів захисту. І використання багаторівневого
захисту є найбільш ефективним методом запобігання несанкціонованого
використання комп'ютерних систем і мережних сервісів. Таким чином, система
виявлення несанкціонованих вторгнень – це одна з компонентів забезпечення
безпеки мережі в багаторівневій стратегії її захисту.
Актуальність теми. Усе більше й більше інформаційні системи
підприємств і організацій піддаються мережним вторгненням, відповідно росте
й нанесений їм збиток. На жаль, явище це не випадкове, оскільки
інфокоммунікаційні технології, що охоплюють майже всі адміністративно-
виробничі ланцюжки, що й стали однієї з найважливіших парадигм XXI
6
століття, викликають підвищений "нездоровий" інтерес у потенційних
зловмисників. Підтвердженням тому служить не тільки приватна вибірка
автора, але й дані науково-дослідного центру CERT, організованого при
університеті Карнегі (США), згідно з якими тільки в 2006 р. було зафіксовано
більш 42 тис. інцидентів, пов'язаних з порушенням інформаційної безпеки. І це
більш ніж удвічі перевищує аналогічний показник 2005 р. Цей факт змушує
постійно підвищувати рівень захищеності підприємств, впроваджувати більш
ефективні засоби захисту, здатні протидіяти інформаційним атакам. А чи можна
взагалі виявити інформаційну атаку, якщо практично щодня з'являються всі нові
й нові погрози? [7]
По даним CERT, число інцидентів у мережі росте не щодня, а щогодини -
якщо грубо поділити 100 тисяч на 365 днів і на 24 години, то вийде приблизно
близько 11 зареєстрованих інцидентів у годину.
Але це не єдина проблема. 24 січня 2003 року був випущений у світло
W32.Sqlexp.Worm (пізніше названий Slammer/Sapphire). Цей хробак
використовував уразливість переповнення буфера в Microsoft SQL Server 2000
(включаючи MSDE 2000). Незважаючи на те, що уразливості продуктів
Microsoft не є чимсь новим, швидкість поширення хробака була воістину
страхаючою. У перебігу 10 хвилин з моменту запуску хробака, він уразив 90%
усіх уразливих систем по усьому світу. До цього випадку хропаки такого типу й
«зарізниці» існували тільки в теорії й представляли чисто академічний інтерес.
У якості одного з базових засобів захисту інформаційних ресурсів
сьогодні виступають системи виявлення атак, що дозволяють вчасно виявляти й
блокувати атаки порушників, що бажають роздобути секрети компанії. Навіть
самим швидко реагуючим постачальникам цих систем потрібні годинник або
навіть дні для випуску сигнатури для систем виявлення вторгнень, заснованих
на правилах (RBID). У випадку ж даного хробака, уразлива мережа буде
уражена протягом декількох секунд – занадто швидко навіть для самих ретельно
обновлюваних RBID систем. Тож як блокувати хробака, що подвоює кількість
заражених систем кожні 8.5 секунд? Відповідь може лежати у використанні
7
менш відомого методу виявлення вторгнень, називаного статистичним (або
заснованим на поведінці) виявленням аномалій.
Питанням дослідження та розробки систем комп’ютерної безпеки з їх
використанням присвячена низка праць, зокрема В.М. Приходько,
В.В. Сильянова, У. Браннольте, О.М. Лисенко, Ю.М. Добришкіна,
В.М. Вишневського, С.Б. Білого, В.Г. Зайцева, Е.А. Якубайтиса, В.Г. Олифера,
R. Baumann, E.M. Royer, S. Singh, L. Zhang, C.E. Perkins, A.S. Tanenbaum,
A. Retana, W. Stallings, M. Tanner та ін.
На теперішній час невирішеними залишаються задачі керування та
побудови систем безпеки в умовах військового стану в галузях критичної
міської інфраструктури. Активний розвиток комп’ютерної мережевої
інфраструктури міст розкриває можливість використання в цій області більш
досконалих рішень з побудови складних систем керування безпекою.
Тому підвищення безпеки критичної міської інфраструктури та її
ефективності обслуговування за рахунок аналізу, створення нових методів та
моделей удосконалення, систематизації і визначення найкращих рішень та їх
компонентів з малими затратами часу на проектування, розширення
експлуатаційних характеристик до можливості використання в інноваційних
проблемно-орієнтованих системах є актуальним.
Мета і завдання дослідження. Метою дослідження є підвищення
ефективності безпеки комунального підприємства за рахунок розробки нових
моделей та удосконалення методів забезпечення комп’ютерної безпеки.
Для досягнення поставленої мети вирішуються такі задачі:
• розробити класифікацію на основі дослідження існуючих методів та
моделей побудови безпеки комп’ютерних мереж;
• удосконалити метод забезпечення безпеки групи хостів з загальним
набором вимог, що взаємодіють так, ніби вони прикріплені до одного
домену, незалежно від їх фізичного розташування;
• удосконалити метод контролю доступу комп’ютерів в мережу IP-
MAC-Port Binding;
8
• синтезувати алгоритм виявлення атак типу „відмова в
обслуговуванні”;
• розробити апаратну модель захищеної мережі та провести
експериментальні дослідження зразків можливих погроз та елементів
програмного забезпечення протидії.
Об’єкт дослідження – процеси керування безпекою комп’ютерних
мереж за допомогою комутаторів рівня 3.
Предмет дослідження – методи та засоби вдосконалення захисту
комп’ютерних мереж для критичної міської інфраструктури.
Методи дослідження – для розв’язання поставлених задач
використовувалися методи: системного аналізу, евристичний та теорії
дискретної математики (для удосконалення методів та розробки моделей
класифікації). При створенні моделі дослідження використані методи
функціонального, схемотехнічного, фізичного моделювання та теорія
алгоритмів.
Наукова новизна одержаних результатів. В процесі вирішення
поставлених задач автором отримано такі результати:
• удосконалено класифікацію на основі дослідження існуючих методів
та моделей шляхом використання запропонованих ознак, що
забезпечило можливість оцінки, як самих систем безпеки та їх
компонентів.
• удосконалено метод забезпечення безпеки групи хостів з загальним
набором вимог, що взаємодіють так, ніби вони прикріплені до одного
домену, незалежно від їх фізичного розташування шляхом оптимізації
алгоритму розподілу простору адрес, що забезпечує коректність та
швидкість створення системи;
• удосконалено метод контролю доступу комп’ютерів в мережу IP-
MAC-Port Binding, шляхом визначення найбільшого значення
позитивної регресії при зростаючих коефіцієнтах часових інтервалів,
9
що забезпечить сумісність використання отриманих технічних рішень
з існуючими прототипами та їх модифікаціями;
Наукова й інженерно-технічна новизна результатів і досліджень
підтверджується публікаціями.
Практичне значення отриманих результатів. Практична цінність
результатів полягає в доведенні отриманих наукових результатів до конкретних
інженерних рішень:
• виконано синтез алгоритму виявлення атак типу „відмова в
обслуговуванні” шляхом створення програмної моделі, що
забезпечило можливість створення та дослідження моделі системи
протидії зазначеним загрозам у реальному часі;
• розроблена апаратну модель захищеної мережі та проведені
експериментальні дослідження зразків можливих погроз та елементів
програмного забезпечення протидії, що дозволило підтвердити
можливість використання цих розробок у запропонованій моделі
підвищення безпеки критичної міської інфраструктури.
Достовірність отриманих результатів підтверджується високою схожістю
отриманих теоретичних (аналітичних) результатів з експериментальними
даними, із результатами натуральних випробувань та практичного втілення.
Особистий внесок студента. Теоретичні результати дослідження, що
виносяться на захист, отримані автором особисто. Результати прикладного
характеру отримані за участю автора спільно з колективом співробітників
ЧДТУ.
Апробація результатів.
Основні положення дослідження доповідалися і обговорювалися на
науково-практичній конференції ЧДТУ: 19–22 квітня 2021 р.: (Україна, 2021).
Публікації. За матеріалами роботи теза доповідей: Аналіз безпеки
комп`ютерних мереж комунальних підприємств міста / С.С. Шевченко, К.С.
Рудаков // Збірник тез доповідей студентської науковопрактичної конференції
ЧДТУ : 19–22 квітня 2022 р. [Електронний ресурс] / [упоряд. Мельник І.В.] ;
10
Мво освіти і науки України, Черкас. держ. технол. унт. – Черкаси : ЧДТУ,
2022. – C.60.
Структура і обсяг роботи. Робота складається із вступу, чотирьох
розділів, висновків, списку використаних літературних джерел і додатків.
Загальний обсяг складає 126 сторінок, із них 65 сторінок основного тексту, 32
рисунків, 5 таблиць, 8 додатків обсягом 50 сторінок. Список використаних
джерел містить 31 найменування.
11
РОЗДІЛ 1. АНАЛІЗ МЕХАНІЗМІВ ЗАХИСТУ
МЕРЕЖ
Одним з основних шляхів забезпечення захисту комп'ютерних мереж від
атак DDoS є створення в рамках Інтернету інтегрованої системи, що поєднує
комплекс різних методів і засобів захисту [1, 22]. У цьому зв'язку актуальним
завданням є класифікація існуючих і перспективних методів захисту.
Розглянемо схеми класифікації, найбільш значимі для досліджень
перспективних механізмів захисту.
Механізми захисту від атак DDoS
Рівень активності (AL)
Ступінь взаємодії (CD)
Попередження (AL-1) Реактивні (AL-2) Автономні (CD-1)
Залежні (CD-2)
Стратегія виявлення
Що попереджати (PG) атаки (ADS)
Взаємозалежні (CD-3)
Атаку (PG-1) За зразком (ADS-1)
По аномалії (ADS-2) Місце установки (DL)
Мережа жертви (DL-1)
Захищаємий об’єкт (ST)
Опис нормального
Система (ST-1) функціонування (NBS) Проміжна мережа (DL-2)
Що базуються на
Протокол (ST-2) стандартах (NBS-1) Вихідна мережа (DL-3)
Відмова в обслуговуванні (PG-
На основі навчання
(NBS-2)
Метод попередження (PM)
Облік ресурсів (PM-1) По зовнішнім даним (ADS-3)
Стратегія протистояння (ARS)
Збільшення ресурса
(PM-2) Ідентифікация агента (ARS-1)
Обмежуюча (ARS-2)
Фільтруюча (ARS-3)
Реконфігуруюча (ARS-3)
Рис. 1.1. Класифікація механізмів захисту
12
Описані схеми класифікації дозволяють зрозуміти, які атаки
найнебезпечніші, як механізми захисту будуть працювати разом, які механізми
захисту пророблені на даний момент у недостатньому ступені й. т.п.
У статті [20] проаналізовані схеми класифікації атак DDoS і механізмів
захисту від них. У класифікацію механізмів захисти включені наступні критерії
(рис. 1.1):
• ціль захисту (рівень активності);
• спосіб досягнення (що запобігати, об'єкт, що захищається, метод
запобігання, стратегія виявлення атаки, специфікація нормальної
поведінки, стратегія протистояння атаці);
• місце, де система захисту буде встановлена;
• які умови необхідно виконати для ефективної роботи системи захисту
(ступінь взаємодії).
Чен, Лонгстафф і Карли [8] розглядають розподілені механізми захисту
від атак DDoS. Запропоновано два види класифікації механізмів захисту
(рис. 2): по алгоритму виявлення атаки й по способу реакції на атаку.
Алгоритм виявлення атаки аналізується як якась процедура, що дозволяє
ідентифікувати атаку на певному рівні із заданою точністю, використовуючи
доступні мережні дані.
Таблиця 1.1
Активні й пасивні засоби захисту
Пакети
Атакуючий Комунікація Атакуючий Боти атаки
створює Поширення ботів між атакуючим дає команду починають досягають Ціль атаки
боти і ботами атаки атаку мети повалена
атаки
Активні засоби захисту Пасивні засоби захисту
Ксианг, Зоу й Човдури [11] пропонують класифікувати системи захисту
від DDoS на пасивні й активні відповідно до етапів атаки, яким вони повинні
протистояти (табл. 1.1).
Атаку можна запобігти на стадіях створення й поширення ботів,
установки комунікації між ними й атакуючим, а також розсилання команди
13
атаки. На цих стадіях застосовуються активні засоби захисту. На стадіях
початку атаки, коли пакети досягають мети атаки й коли ціль повалена, методи,
застосовувані для захисту, є пасивними. Границя застосовності активних і
пасивних засобів захисту може бути нечіткої.
Перевантаження
Категорія Аномалії
Рівень виявлення Джерело
За алгоритмом Використовувані
виявлення атаки мережеві дані
Трафік атаки
Джерело помилкових
спрацьовувань
Фільтрація на боці
Механізми захисту від адресата атаки
атак DDoS Категорія
Фільтрація на стороні
джерела атаки
Відповідна реакція
Механізм реакції
По способу реакції на
атаку
Залежність від
топології
Протокол комунікацій
Навантаження на
ресурси
Рис. 2. Класифікація механізмів захисту
Пасивні механізми захисту (рис. 1.3) розглядаються по етапах: виявлення
атаки й реакції на неї. Виявлення може відбуватися на основі рівня трафіка, по
14
Ip-адресам відправника «підозрілих» пакетів, по вмісту пакетів. Реакція полягає
у фільтрації пакетів, керуванні потоками, пасивному відстеженні, уведенні
додаткових ресурсів.
Механізми захисту від атак DDoS
Пасивні Активні
Виявлення Реакція Захист у вихідній
підмережі
Відстеження на
За рівнем трафіка Фільтрація основі запису
«відбитків» пакетів
За IP-адресою Керування Відстеження на
відправника потоками основі розмітки
пакетів
За змістом пакетів Пасивне Введення нових
відстеження протоколів
Реплікація ресурсів
Рис. 3. Класифікація механізмів захисту
У класифікації виділені наступні типи активних механізмів захисту:
• захист у вихідній підмережі (коли система захисту встановлена в мережі
атакуючого);
• відстеження на основі запису «відбитків» пакетів (самих пакетів, їх хеш-
функцій та ін.);
• відстеження на основі розмітки пакетів, уведення нових протоколів
(більш досконалих з погляду безпеки).
15
У роботі [9], крім того, на основі запропонованої класифікації
аналізуються гідності й недоліки тих або інших механізмів захисту. Потім
проводиться порівняння сильних і слабких сторін активних і пасивних
механізмів.
Миттал [17] також приводить огляд механізмів захисту від атак DDoS.
Механізми, що ввійшли в огляд, групуються по способу захисту (рис. 4). Деякі
існуючі механізми автор виділив в окремі галузі класифікації, наприклад захист
у вихідній мережі – D-Ward [14], безпечні оверлейні сервіси – SOS [21],
фільтрацію по скачках (хопам) – HCF [19].
Механізми захисту від атак DDoS
Захист у
вихідній Методики Відстеження Керування Фільтрація по Безпечні
мережі фільтрації по ІР потоками потокам оверлейні
сервіси
На основі За
Вхідна і На основі
адрес запису службовим
вихідна відправника «відбитки» повідомл-
пакетів еннями
На основі На основі
адрес На основі
маршруту розміру Перевірка
отримувача пакетів лінії зв'язку
Диферен- Особлива
По хопам ціальна маршрут-
(імовірнісна) изація
Рис. 4. Класифікація механізмів захисту
Миттал пропонує свій підхід до захисту від DDoS, що базується на
розмітці й запису «відбитків» пакетів. Він називається «Фільтрація на основі
конфлікту сигнатур» (Signature conflict triggered filtering). Метод допомагає
відсівати пакети з неправильною Ip-адресою відправника. Його особливість
полягає в наступному: коли починається атака, легітимні клієнти посилають
певним маршрутизаторам так званий «пакет верифікації», сигнатура якого
зберігається. Якщо атакуючий використовував при підміні адреси відправника
16
адреса «верифікованого клієнта», виникає «конфлікт сигнатур» і пакет
відкидається.
У статті [19] обговорюються різні механізми захисту від Dos/DDoS-атак
web-сервера. Розглядаються підходи до захисту на рівні всього Інтернету,
включаючи маршрутизатори, міжмережні екрани, активні монітори, засоби
балансування навантаження на вузли або мережі, що є цілями атаки (рис. 1.6).
У статті [7] розглядається ряд механізмів захисту від атак DDoS і
пропонується кілька варіантів їх класифікації. Обрані наступні критерії - див.
рис. 9.
Автори роботи [7] пропонують розроблений ними метод захисту Packet
Funneling (можна перевести як «звуження трафіка»). Його основна ідея полягає
в складанні таблиці легітимних Ip-адрес клієнтів. Таблиця обмежена по
розмірах. Коли відбувається її переповнення, обслуговування нових клієнтів
відкладається.
У загальну класифікацію механізмів захисту від атак DDoS, пропоновану
в даній роботі, увійшли наступні критерії (рис. 1.7):
• по етапах захисту;
• по задачах захисту;
• по місці установки.
Механізми захисту від атак DDoS
На рівні системи На рівні мережі Глобальні
Сканування Маршрутизатори Вхідна
фільтрація Поліпшення безпеки
У проміжній Інтернету
Брандмауери мережі
Уповільнення
клієнтів Балансування Вихідна Глобальні
навантаження фільтрація скоординовані
фільтри
Переміщення
ланцюга атаки Активний MULTOPS
моніторинг Відстеження IP-адрес
джерел атаки
У мережі ланцюга атаки У вихідній мережі
Рис. 5 - Класифікація механізмів захисту
17
Можна виділити дві основні задачі систем захисту від атак DDoS:
виявлення атаки й безпосередній захист від атаки. Крім того, атаку необхідно не
тільки виявляти й блокувати, але й визначати її джерело. Тому важливою метою
є також відстеження джерела атаки. Безпосередній захист від атаки повинна
включати превентивні заходи й активні заходи протидії їй, прийняті на основі
результатів етапу виявлення.
Механізми захисту від атак DDoS
По кількості За кількістю
По області дії вузлів помилкових По складності
спрацьовувань
Ціль атаки Один узел
Мережа ланцюга Мережа вузлів, що
атаки кооперуються
Проміжна
Рис. 6. Класифікація механізмів захисту
Таким чином, ефективна система захисту від атак DDoS повинна
включати різні етапи захисту (рис. 1.8):
• попередження атаки;
• виявлення факту атаки;
• визначення джерела атаки;
• протидія атаці.
Механізми попередження атак (рис. 6) DDoS так чи інакше присутні в цей
час практично в будь-якій системі захисту зовнішнього периметра мережі,
наприклад на міжмережних екранах, розташовуваних на вході в мережу, що
захищається. Навіть незважаючи на те, що більшість механізмів не орієнтована
на захист від атак DDoS, і те, що можливі превентивні заходи відомі, реалізація
18
механізмів попередження суттєво ускладнює завдання реалізації атак
зловмисником.
Механізми захисту від атак DDoS
По етапам захисту По задачам захисту За містом встановлення
Вихідна мережа
Попередження атаки
Проміжна мережа
Визначення факту атаки
Захист від атаки
Захищаєма мережа
Визначення джерела
Попередження атаки
Протидія атаці
За способом запобігання За способом визначення За способом виявлення За способом визначення
та протидії атаці факту атаки відхилення від модельних джерела атаки
даних
Фільтрація Виявлення Пороги По відновленню
зловживань шляху (traceback)
Правила
Пакети Виявлення По сигнатурам
аномалій
Зміна імовірнісних
Потоки параметрів Під час атаки
По ресурсам Зберігання
Витяг даних сигнатур
(data mining)
Перенос ресурсів
Розмітка пакетів
Розмежування ресурсів Спектральний аналіз
Генерація
Зміна кількості Нейронні мережі службових пакетів
ресурсів
Аутентифікація
Рис. 7. Пропонована класифікація механізмів захисту
Механізми попередження – перше, із чим зустрічається зловмисник,
посилаючи пакети атаки.
Виявлення факту атаки DDoS, на перший погляд, повинне мати
найпростішу реалізацію: якщо законні користувачі не можуть одержати якийсь
сервіс або не досягається задана якість сервісу (QoS – Quality of Service), то
19
причиною може бути атака. Однак у той же час це може бути пов'язано як з
відмовою або виходом з ладу мережного обладнання, так і з підвищеною
кількістю запитів клієнтів до даного сервісу. Дана стадія є ключовою: тут
вирішується, чи задіяти механізми визначення джерела атаки й блокування
атаки, і здійснюється вибір цих механізмів.
Безпосередній захист від атаки
Виявлення атаки
Рис. 8. Завдання й етапи захисту від атак DDoS
Визначення джерела атаки являє собою самий складний етап захисту. З
одного боку, це пов'язане з тим, що зловмисник може змінювати всі параметри,
що посилають мережних пакетів і у випадку достатньої кількості атакуючих
може легко імітувати зростання запитів звичайних клієнтів. З іншого боку,
визначення джерела атаки серйозно ускладнюється зміною адреси джерела
пакетів або атакою через проміжні вузли.
Протидія атаці виконується досить просто, якщо успішно пройдені
попередні стадії захисту. У цьому випадку на найближчому до джерела атаки
вузлі (маршрутизаторі) установлюються відповідні правила фільтрації. Якщо ж
визначення джерела атаки не привело до успіху або воно взагалі неможливо, то
в справу вступають зовсім інші механізми. Наприклад, можна перерозподілити
ресурси з метою зниження навантаження на критичний сервіс. Можливо також
включення режимів аутентифікації клієнтів або примусової затримки їх
функціонування. Слід зазначити, що протидія атаці може бути ускладнено
20
самою атакою, що не дозволяє компонентам системи захисту ефективно
взаємодіяти між собою.
21
РОЗДІЛ 2. АНАЛІЗ ІНФОРМАЦІЙНОЇ БЕЗПЕКИ
МЕРЕЖ
2.1 Поняття мережної інформаційної атаки
Перш ніж описувати способи виявлення атак, визначимо поняття «атака».
Отже, атака - це сукупність дій зловмисника, що приводять до порушення
інформаційної безпеки ІС. Результатом успішної атаки може стати, наприклад,
несанкціонований доступ порушника до інформації, що зберігається в ІС,
втрата працездатності системи або спотворення даних в ІС. У якості цілей атаки
можуть розглядатися сервери, робочі станції користувачів або комунікаційне
обладнання ІС. При організації інформаційних атак зловмисники часто
використовують спеціалізоване ПЗ, що дозволяє автоматизувати дії, виконувані
на різних стадіях атаки. [2]
У загальному випадку в будь-якій атаці можна виділити чотири стадії
(рис. 2.1).
Рис. 2.1. Життєвий цикл типової атаки
Рекогносцировка. На цій стадії порушник намагається одержати
якнайбільше інформації про об'єкт атаки, щоб на її основі спланувати подальші
етапи вторгнення. Цим цілям може служити, наприклад, інформація про тип і
22
версії ОС, установленої на хостах ІС; список користувачів, зареєстрованих у
системі; відомості про використовуване прикладне ПЗ і т.д.
Вторгнення. На цьому етапі порушник одержує несанкціонований
доступ до ресурсів тих хостів, на які відбувається атака.
Атакуючий вплив. На даній стадії реалізуються ті цілі, заради яких і
починалася атака, - наприклад, порушення працездатності ІС, крадіжка
конфіденційної інформації із системи, видалення або модифікація даних і т.д.
При цьому атакуючий часто виконує операції, спрямовані на видалення слідів
його присутності в ІС.
Розвиток атаки. Зловмисник прагне розширити об'єкти атаки, щоб
продовжити несанкціоновані дії на інші складові ІС.
Розглянемо на конкретних прикладах, як можуть реалізовуватися ці стадії.
Так, на етапі рекогносцировки дії порушника можуть бути націлені на
одержання наступних даних: про структуру й топології іС, про тип ОС, про тип
прикладних сервісів, про зареєстрованих користувачів.
Для одержання інформації про структуру й топології системи порушник
може скористатися стандартними утилітами, такими, як traceroute, що входять
до складу практично будь-якої ОС, які дозволяють сформувати список Ip-адрес
транзитних маршрутизаторів аж до хоста-об'єкта нападу. Інформацію про
структуру ІС зловмисник може одержати й шляхом звертання до Dns-серверу.
Один з найпоширеніших методів визначення типу ОС заснований на тому,
що різні системи по-різному реалізують вимоги RFC, що обумовлюють правила
взаємодії з мережними протоколами. При тих самих мережних запитах різні ОС
відправляють у відповідь різні дані, і по них можна з великою часткою
ймовірності визначити характеристики ОС, що атакується, і навіть тип
апаратної платформи.
Інформацію про тип прикладних сервісів порушник може одержати
шляхом сканування відкритих портів і аналізу заголовків відповідей, отриманих
від цих служб. Дані ж про зареєстрованих користувачів можна витягти з бази
даних SNMP MIB, установленої на робочих станціях і серверах ІС.
23
Коли необхідна інформація зібрана, можна починати вторгнення. Усяка
атака заснована на наявності в ІС уразливостей, і "правильне" використання
хоча б однієї з них відкриває зловмисникові вхід у систему.
Найпоширенішими уразливостями є:
• помилки при конфігуруванні мережних служб ІС;
• помилки в ПО, не "закриті" пакетами відновлення (service packs, patches,
hotfixes);
• використання "слабких" і "нестійких" паролів;
• відсутність необхідних засобів захисту.
У результаті порушник одержує несанкціонований доступ до ресурсів
атакованого хоста, що дозволяє йому перейти до наступної стадії інформаційної
атаки.
На стадії атакуючого впливу порушник виконує ті дії, які й становлять
мету атаки, - наприклад, витягує із СУБД атакованого хоста номера кредитних
карток або іншу конфіденційну інформацію.
Після атакуючого впливу порушник може перевести атаку у фазу
подальшого розвитку. Для цього в систему звичайно впроваджується програма,
за допомогою якої можна організувати атаку на інші хости ІС. Після її
установки знову починається перший етап атаки - збір інформації про наступну
ціль. [10]
2.2 Способи класифікації атак з позиції
побудови систем їх виявлення
Існують різні типи класифікації атак. Наприклад, розподіл на активні й
пасивні, зовнішні й внутрішні, навмисні й ненавмисні й ін. Класи, у свою чергу,
можуть ділитися на підкласи, підвиди, що часто перетинаються, у результаті
можна одержати наступну класифікацію:
1. Віддалене проникнення (remote penetration). Атаки, які дозволяють
реалізувати віддалене керування комп'ютером через мережу. Прикладами
24
програм, що реалізують таке керування, є, Netbus або Back Orifice, реверсивний
сеанс telnet.
2. Локальне проникнення (local penetration). Атака, що приводить до
одержання несанкціонованого доступу до вузла, на якому вона запущена, або
підвищенню прав користувача. Прикладом такої програми є Getadmin або
реалізація експлоіта для уразливості в ядрах Linux через ptrace.
3. Віддалена відмова в обслуговуванні (remote Dos (denial of service)).
Атаки, які дозволяють порушити функціонування системи або перезавантажити
комп'ютер віддалено. Прикладами такої атаки є teardrop, trinoo, fapi.
4. Локальна відмова в обслуговуванні (local Dos). Атаки, що
дозволяють порушити функціонування системи або перезавантажити
комп'ютер, на якому вони реалізуються. Як приклад такої атаки можна привести
ворожий аплет, який завантажує центральний процесор нескінченним циклом,
що приводить до неможливості обробки запитів інших додатків. Також, у
випадку неправильного настроювання, це може бути заплутаний додаток з
купою нащадків, що займають усі вільні ідентифікатори PID.
5. Мережні сканери (network scanners). Програми, які аналізують
топологію мережі й виявляють сервіси, доступні для атаки. Прикладом такої
програми може служити nmap.
6. Сканери уразливостей (vulnerability scanners). Програми, що
здійснюють пошук уразливостей на вузлах мережі і які можуть бути
використані для реалізації атак. Приклади: система SATAN або Shadow Security
Scanner, Xspider, Languard, Xfocus-x-scan і ін.
7. Зломщики паролів (password crackers). Програми, які підбирають
паролі користувачів. Прикладом зломщика паролів може служити L0pht Crack
для Windows або Crack для *nix.
8. Аналізатори протоколів і сніфери (sniffers). Програми, які
«прослуховують» мережний трафік. За допомогою цих програм можна
автоматично шукати таку інформацію, як ідентифікатори й паролі користувачів,
інформацію про кредитні карти і так далі. Фактично аналізатор протоколу - це
25
сніфер плюс деяка частина, що здійснює фільтрацію й розбір перехоплених
пакетів за деякими правилами. Часто обидві задачі виконує той самий продукт.
Прикладами таких програм можуть служити tcpdump, ethereal, Microsoft
Network Monitor, Netxray компанії Network Associates, Lan Explorer.
Належність реальних атак до того або іншому класу не завжди
однозначна, тому що не завжди можна чітко визначити кінцеву мету атаки, якої
можна добитися різними шляхами. Наприклад, у випадку неможливості
здійснення прямо Dos-Атаки може бути виконана атака на віддалене
проникнення, після чого можуть бути зупинені ті або інші служби [17].
З погляду систем виявлення атак не має значення класифікувати атаки по
основних видах погроз: порушення конфіденційності, цілісності, доступності,
тому що ці погрози досить загальні й реалізуються по-різному, відповідно їх
виявлення може бути здійснене не єдиним способом.
Кожна фірма воліє класифікувати атаки по-своєму, наприклад, компанія
Internet Security Systems Inc ще більше скоротила число можливих категорій,
довівши їх до п'яти:
збір інформації (Information gathering);
спроби несанкціонованого доступу (Unauthorized access attempts);
відмова в обслуговуванні (Denial of service);
підозріла активність (Suspicious activity);
системні атаки (System attack).
Перші чотири категорії ставляться до віддалених атак, а остання - скоріше
до локальних, тому що віддалене здійснення системних атак важко. Також у цю
класифікацію не потрапили деякі атаки, наприклад, «неправильний Dns-
Сервер», «підміна» Arp-Сервера й ін.
Сучасні атаки настільки різноманітні, що єдиної однозначно правильної
класифікації, що враховує всі нюанси, вони не піддаються.
Найбільш правильним підходом є класифікація з погляду систем
виявлення атак, тому що в цьому випадку більш чітко можна віднести ті або
26
інші дії до того або іншого класу атак, указавши реальні, а не гіпотетичні атаки,
і визначити способи протидії й виявлення.
Розглянемо різні класи атак разом із засобами протидії. З позиції СВА
споконвічно атаки слід розділити на два великі класи: активні й пасивні, як це
показано на рисунку 2.2 [22].
Атаки
Пассивные Активные
Активный сбор Нарушение работы
информации (служб, узлов, сетей) Без последствий
Работа со Сканирование Атака для получения Изменения алгоритма Отказ в
службой информации функционирования обслуживании
Открытое Полуоткрытое
Рис. 2.2. Класифікація атак
Пасивні атаки - це різний збір інформації про яку-небудь службу, вузол
або мережу вузлів без якого-небудь впливу на їхню роботу. Наприклад,
прослуховування й перехоплення трафіка. Також пасивною атакою вважається
аналіз відкритих джерел, однак даний підклас ми розглядати не будемо, тому
що це не пряма, а непряма атака.
Пасивні атаки є найбільш складними з погляду їх виявлення, тому що
грамотно організована атака ніяк себе не виявляє. Даним класом не варто
зневажати, тому що основна частина трафіка в мережі передається у відкритому
виді і ця атака може служити складовою частиною більш великомасштабної
атаки. Для її реалізації найчастіше мережний адаптер ethernet переводиться в
режим promiscuous mode. Тому що середовище ethernet спільне для всіх, крім
випадку крапка-крапка, мережний адаптер починає ухвалювати
(прослуховувати) увесь минаючий трафік. Надходячі так засоби називаються
27
сніферами. Звичайно сніфери запускаються на машинах, що реально працюють
у мережі, тобто що мають легітимні мережні адреси.
Якщо сніфер використовується порушником, то це вважається атакою.
Якщо сніфер санкціоновано використовується адміністратором мережі, то це
потужний засіб аналізу роботи мережі. Також сніфер є складовою частиною
будь-якої мережа-орієнтованої СВА.
Виявлення сніферів найчастіше ґрунтується на помилках їх роботи або
непрямими методами. При неправильнім настроюванні хости зі сніферами
можуть видавати відповіді на пакети, адресовані їм, виявляючи себе, у той час
як при звичайному режимі роботи вони на ці пакети відповідати не сталі б.
(Наприклад, виявлення більшості Linux-Машин зі сніферами трохи простіше: у
режимі прослуховування вони відповідають на всі пакети, адресовані їх Ip-
Адресі, незалежно, чи їх Mac-Адреса в пакеті чи ні, через особливості
реалізації й використовуваних настроювань за замовчуванням. У звичайному ж
режимі роботи всі пакети із чужими Mac-Адресами відкидаються, не будучи
обробленими.)
Іншим недоліком сніферів є статистична залежність. Будь-якому сніферу
необхідно обробляти трафік або зберігати його кудись на диск. У випадку
недостатньої продуктивності неминучі затримки. При цьому затримка реакції
на звичайні пакети може корелювати з підвищенням трафіка в мережі у вузлів,
що перебувають у режимі прослуховування. Тому що сніфери постійно
удосконалюються, то на подібних помилках можна відловити тільки вразливі
сніфери або встановлювані віддалено (у процесі атак, коли багато дріб'язків
неможливо не тільки передбачити, але й реалізувати). Існує кілька способів
боротьби зі сніферами.
Розповсюдженим методом боротьби зі сниферами є їхнє виявлення за
допомогою антисніферів. Серед таких програмних засобів, що ловлять сніфери
в мережі, можна назвати наступні: Antisniff, CPM (Check Promiscuous Mode),
neped, sentinel. Зі своїм завданням дані програмні продукти справляються дуже
непогано. Однак добре настроєний сніфер виявити ними неможливо.
28
Боротися зі сніферами краще попереджуючими способами, зводячи
ефективність їх використання до нуля.
Наприклад, за допомогою сильних засобів аутентифікації. Під
«сильними» ми розуміємо такі методи аутентифікації, які важко обійти.
Наприклад, використання одноразових паролів (OTP - One-Time Passwords).
Існує кілька способів реалізації одноразових паролів, у тому числі й з
використанням однобічних функцій. Якщо порушник довідається одноразовий
пароль за допомогою сніфера, то ця інформація буде неактуальна, тому що в цей
момент пароль уже буде використаний і виведений із уживання. Помітимо, що
цей спосіб боротьби зі сніфингом ефективний тільки для боротьби з
перехопленням паролів. Сніфери, що перехоплюють іншу інформацію
(наприклад, повідомлення електронної пошти), не втрачають своєї
ефективності.
У такий спосіб боротьби зі сніфингом пакетів у вашому мережному
середовищі є локалізація трафіка шляхом використання комутуючої
інфраструктури. Якщо, наприклад, у всій організації використовується ethernet,
що комутирується, хакери можуть одержати доступ тільки до трафіка, що
надходить на той порт, до якого вони підключені. Інфраструктура, що
комутирується, не ліквідує погрозу сніфинга, але помітно знижує її гостроту. На
практиці даний клас атак має дуже вузьке застосування, що обмежується у
випадку локалізації трафіка одним сегментом. Сьогоднішнє значне падіння цін
на комутатори дозволяє повністю відмовитися від концентраторів (hub), чому
значно знизити актуальність застосування даної атаки на практиці.
У випадку використання фізичного середовища, відмінної від ethernet,
реалізація програмними засобами прослуховування сильно ускладнюється, аж
до неможливості. Фізичне зняття інформації нами взагалі не розглядається.
У випадку проходження трафіка через ненадійні вузли також можливий
витік інформації, що попадає під даний клас атак. Реалізація в цьому випадку не
вимагає розгляду. Боротися треба або шифруванням трафіка, або, якщо дозволяє
маршрутизація, завданням маршруту через надійні вузли.
29
Використання засобів шифрування трафіка (криптографії) не запобігає
можливостям перехоплення повідомлень і не розпізнає роботу сніферів, однак є
найдійовішим засобом по боротьбі зі сніферами. Якщо канал зв'язку є
кріптографічно захищеним, то це значить, що порушник перехоплює
зашифровані повідомлення. Використання стійких алгоритмів шифрування,
наприклад ГОССТАНДАРТ 28147-89, робить цю роботу пошуки. На сьогодні
існують різні реалізації даного способу з різним ступенем надійності.
Наприклад, криптографія деяких пристроїв фірми Cisco на мережному рівні
базується на протоколі Ipsec, який являє собою стандартний метод захищеного
зв'язку між пристроями за допомогою протоколу IP. До прочих криптографічних
протоколів, які можна використовувати для боротьби зі сніфингом, можна
віднести SSH (Secure Shell) і SSL (Secure Socket Layer).
Активні атаки – це взаємодія зі службою, вузлом або мережею вузлів з
метою порушення їх функціонування або одержання несанкціонованим образом
якої-небудь інформації. (На сьогоднішній день немає точного визначення
терміна «атака», як і точного визначення «активна атака».)
Виходячи із цього визначення, можна укласти, що воно захоплює основні
три типи погроз: порушення конфіденційності, цілісності, доступності, але, як
було помічене вище, реально ці три типи зводяться до двох: активному збору
інформації й порушенню роботи. Для обох типів є засоби протидії. Результатом
порушення роботи може бути витік інформації, наприклад, правила
функціонування можуть бути такі, що інформація недоступна. Також може бути
відмова в обслуговуванні, заміна одних параметрів або даних іншими.
Формально в це визначення потрапить і клас атак «без наслідків», коли щось
було змінено, але нічого від цього не порушилося, але від цього атаки не
перестали бути атаками, як якби ви перейшли дорогу під час відсутності машин
і свідків на червоне світло, тому такі атаки треба також розглядати. Багато
визначень упускають цей на перший погляд невинний клас атак. З погляду СВА
цей клас атак практично нічим не буде відрізнятися від інших.
30
Під активним збором інформації слід розуміти всі способи, за допомогою
яких можна одержати інформацію: сканування, роботу зі службами, одержання
інформації в результаті порушення роботи. (Існують способи одержання
інформації не технічними засобами або способами, яким не можна
протиставити СВА. Такі способи не розглядаються, тому що з технічної точки
зору ні атаками, ні телекомунікаційними атаками вони не є. Наприклад, огляд
друкованих джерел відкритої інформації.)
Термін «телекомунікаційна атака» більш правильний, але в силу його
«громіздкості й довжини» у письмовому і усному мовленні він практично
завжди заміняється просто «атакою», всі розуміють зміст із контексту, хоча
формально, наприклад, удар сокирою по працюючому серверу з наступним його
виходом з ладу буде атакою на відмову в обслуговуванні. Скрізь ми будемо мати
на увазі телекомунікаційні атаки, якщо не вказано навпаки.
Сканування буває двох видів: звичайне (або відкрите) і напіввідчинене
(закрите).
Відкрите сканування – це коли проводиться спроба з'єднатися
звичайним образом з однієї або декількома службами. Тому що служби
прив'язані до портів, то спроба з'єднання називається «випробуванням порту»
або просто випробуванням. Найчастіше це робиться з метою одержання
інформації прямим або непрямим образом. При цьому робота вузлів, зв'язаних
якимось образом з роботою даної служби, не порушується.
Звичайне сканування/випробування йде серіями, як варіант, розтягнуте за
часом і випадковим образом.
Після з'єднання зі службою й одержання від неї привітальних заголовків
з'єднання закривається.
Сканування здійснюється програмами, називаними «сканерами».
Звичайно під сканером розуміють засіб захисту, що виявляє вразливі місця в
системі, яке крім різних сканувань може працювати зі службами. Якщо
сканування не санкціоноване, то воно вважається атакою.
31
Сканери можуть запускатися як локально, так і віддалено на інших
вузлах. Різні сканери шукають різні слабкі місця, але всі вони можуть бути
розділені на дві категорії: сканери системи й сканери мережі. Сканери мережі
подібні людині, перевіряючого, закрив він двері чи ні, смикаючи при цьому за
ручку. Посмикування ручки не у своїх дверей аналогічно несанкціонованому
скануванню.
З метою збору інформації відкритому скануванню можуть зазнати не
тільки окремі служби й вузли, але й цілі мережі. Сканування може проводитися
як вручну, так і автоматичними засобами. З метою утруднення виявлення в
балку-файлах факту сканування, воно може проводитися з випадковим
порядком сканування портів і тривалий час. Для боротьби зі скануванням
рекомендується використовувати програми, що відслідковують звертання до
одної Ip-Адреси в короткий час до різних портів і блокувальні весього трафіку
для даної адреси. Також рекомендується замість повідомлення про помилку, у
випадку відсутності сервісу/вузла/ мережі, у зовнішню мережу взагалі не
висилати ніякої інформації [21]. Серед програм-сканерів можна перелічити
наступні програмні продукти, що мають ті або інші додаткові можливості:
nmap, ISS, SATAN, Connect, exsscan, getethers, Identtcpscan, jakal, portscan,
Queso, sl0scan, spoofscan, strobe, xscan і ін. Для захисту від атак, виконуваних
сканерами, існують різні програми, наприклад: courtney, Icmpinfo, scan-detector,
klaxon, Portsentry і багато інші, включаючи більшість систем виявлення
вторгнень.
У звичайного відкритого сканування є один мінус, а саме, воно може бути
легко виявлене без використання систем виявлення вторгнень шляхом ручного
перегляду лог-файлів. Спочатку сканування так і виявляли. У відповідь на це
був придуманий спосіб закритого або напіввідчиненого сканування, коли
простим способом без використання додаткових програм виявити факт
сканування неможливо.
Напіввідчинене сканування - це формальне незавершене звичайне
відкрите сканування. Якщо розглянути звичайну процедуру тристороннього
32
«рукостискання» при установці Tcp-З'єднання, то відмінність від звичайного
сканування буде полягати у відсутності третьої - завершальної стадії. Якщо
коротко, то згідно з рекомендаціями при установці з'єднання з вузла, що
здійснює сканування, посилає пакет із установленим прапором SYN (перша
стадія), у відповідь висилається підтвердження встановлення з'єднання пакетом
із установленими прапорами SYN і ACK зі скануємого вузла (друга стадія).
Далі потрібне підтвердження встановлення з'єднання зі скануючого вузла
пакетом із установленим прапором SYN (третя стадія). При відсутності
останньої стадії відбувається розрив з'єднання, що формально не встановився
до кінця, по тайм-ауту, як наслідок, запис у лог-файлах про успішне з'єднання
не робиться. Відсутність запису про спробу встановлення з'єднання свідчать
про відсутність сканування.
Також у цей клас слід віднести сканування пакетами без прапорів,
пакетами з усіма встановленими прапорами й різними їхніми неправильними
комбінаціями, у літературі подібні сканування носять свої назви, як NULL scan,
FIN scan, X-MAS scan, «oddball packet» і ін. Тому що в RFC чітко не визначене,
як слід реагувати на неправильні пакети, то різні операційні системи роблять це
по-різному, у такий спосіб є можливість визначити використовувану операційну
систему на хості непрямим способом. Ситуація порівнянна з наступною: ви
підходите або під'їжджаєте до світлофора, а там одночасно горять і червоний і
зелений сигнали. Хтось почекає, хтось піде або поїде напролом, також по-
різному реагують і операційні системи на неправильні пакети. Для боротьби з
витоком інформації рекомендується викидати всі неправильні пакети, не
відповідаючи на них повідомленнями про помилки. Так само можна
використовувати системи виявлення сканувань або вторгнень. З метою
ускладнення роботи на скануючії стороні можливе використання липучих
пасток. Більшість скануючих й програмних засобів що виявляють,
перерахованих параграфом вище в розділі відкритого сканування, здатні
працювати й із закритими скануваннями.
33
Саме по собі сканування без наступного продовження атак не несе ніякої
погрози, однак виникла й існуюча донині практика безкарності змушує
звернути на даний вид атак більше уваги. Безкарність приводить до
регулярного, практично безперервному й випадковому скануванню всього блоку
Ip-Адрес. Це відзначається й у різних останніх звітах по мережній безпеці. Факт
сканування вже не може, як раніше, використовуватися в якості
високодостовірного сигналу про початок якої-небудь атаки. Випадкові
сканування не стільки становлять небезпеку для скануємого вузла, скільки
«засмічують» лог-файли й утрудняють виявлення атак, безпосередньо
спрямованих на даний вузол. Для підвищення значимості сканування як
сигнального фактора виявлення першої стадії атаки слід використовувати
обробку інформації з декількох розподілених вузлів.
Робота зі службами – це взаємодія з однієї або декількома службами,
коли метою ставиться одержання інформації, не порушуючи роботи. Звичайно у
випадку використання автоматичних засобів нападу й сканування даний клас
атак випливає відразу ж після сканування. Нерідко розділити стадію сканування
від стадії роботи зі службами буває неможливо. Однак у цих двох класів атак є
відмінність – різна вірогідність одержуваних результатів. Робота зі службами
може більш точно визначати тип і діапазон версій операційної системи й
запущених сервісів, тим самим подавати більш достовірну інформацію, що
підвищує ймовірність здійснення успішної атаки на наступних стадіях.
Класичним прикладом боротьби на першій стадії з даним і попереднім класом
атак є заміна заголовків, видаваних тими або іншими сервісами після
встановлення з'єднання.
Метою будь-якої роботи зі службою звичайно є одержання інформації для
наступного порушення роботи служб.
Порушення роботи може бути спрямоване на окремі служби, групи
служб, вузли й мережі вузлів з метою одержання інформації, зміни алгоритму
функціонування, що атакується об'єкта, відмови в обслуговуванні. Більш ясно
представити класифікацію атак можна, подивившись на рисунок 2.3.
34
Атака для одержання інформації. Даний клас є логічним продовженням
попередніх. Після роботи зі службою ідуть дії, що викликають разову зміну
нормального алгоритму роботи, у результаті чого може відбутися витік
інформації. Ціль атаки – тільки одержання інформації, при цьому атакуючий
може відновити роботу вузла й спробувати сховати сліди своєї присутності.
Захист від даного класу атак нічим не відрізняється від заходів, що протидіють
скануванню й іншим атакам. Додатково вжитими заходами може бути
шифрування важливої інформації, починаючи від swap-розділу й закінчуючи
шифруванням усього трафіка. Не має смислу намагатися виділити кошти, що
протидіють тільки даному класу атак.
Атака з метою зміни алгоритму функціонування є або продовженням
попереднього класу, або окремим класом. Метою атак даного класу, як бачимо з
назви, є явна зміна алгоритму функціонування. Часто атаки попадають відразу
під кілька класів, тому що мають кілька цілей.
Два вищеописані класи атак є класичними, і найчастіше, коли вживають
слово «атака» без уточнень, то маються на увазі саме ці два класи. Системи
виявлення атак і/або вторгнень споконвічно роблять більший акцент на ці
класи, тому що збиток від них, особливо від другої, відразу стає явним.
Формальна зміна алгоритму функціонування може бути зроблене таким
чином, що вузол або служба «зависне» або просто не буде ніяк реагувати на
звертання до нього. Однак даний вид атак звичайно виділяють окремим класом,
тому що привести систему до стану відмови в обслуговуванні буває набагато
більш простим завданням, чим щось змінити в алгоритмах функціонування, не
порушивши працездатності.
Відмова в обслуговуванні. (Dos, Denial of Service). Окремий вид атак,
коли метою ставиться перевести вузол, мережу або службу в такий стан, коли
вона не могла б обслуговувати легальних користувачів, видаючи їм
повідомлення про неприступність або взагалі не відповідаючи. Добитися цього
можна двома шляхами. Перший – за допомогою уразливостей в об'єкті, що
атакується. Незважаючи на те, що ціль атак підходить під визначення даного
35
класу, їх прийнято класифікувати як «зміна алгоритму функціонування».
Другий – за допомогою великої кількості запитів. Будь-який вузол, навіть без
уразливостей, з веріфікованим алгоритмом роботи, можна перевести в стан
відмови в обслуговуванні. Історично споконвічно була спроба боротьби з даним
класом атак шляхом збільшення продуктивності вузлів і швидкості пропускних
каналів до них, але відразу пішла відповідь у вигляді розподілених атак на
відмову в обслуговуванні (Ddos, Distributed Denial of Service). Розподілена атака
на відмову в обслуговуванні – це коли атака ведеться не з одного вузла в мережі,
а з декількох. Логічно помітити, що шляхом збільшення числа атакуючих вузлів,
навіть при маленькій пропускній здатності й продуктивності, на них можна
«забити» будь-який високошвидкісний вузол/канал. Набір вузлів для
проведення подібних атак звичайно є наслідком інших атак. У результаті
уразливостей на вузлах вони атакуються й на них розміщається деякий код,
який працює по продуманому алгоритму.
З погляду обираної мети здійснення тієї або іншої атаки в даний клас
можливе включення й деяких видів вірусів-хробаків. Розміщений код може
вичікувати команди, а може й атакувати й «завербовувати» собі інші вузли,
створюючи розподілену мережу із заражених вузлів. Коли розподілена мережа
із заражених вузлів почне атаку на відмову в обслуговуванні, то захищатися від
даної атаки окремо неможливо. Наслідки можна якось зменшити, якщо у
вищого провайдера під час атаки ставити up-stream-фільтри. Боротьба в цьому
випадку ведеться вже вручну, а не автоматичними засобами, поступовим
відключенням кожного вузла, що засмічує мережу, через його провайдера.
Найбільше ефективно даний клас атак попереджати, тому що заблокувати
дані атаки за короткий час на сьогоднішній день важко. Якби у вузлах не
існували уразливості, то даний клас атак було б дуже складно реалізувати через
труднощі створення об'єднаної атакуючої мережі. З нескомпрометованих вузлів
атакувати можна, але великий ризик бути пійманим і покараним. Атакуючі
воліють не ризикувати в такий спосіб.
36
Зараз цей клас у більшості становлять саме розподілені атаки на відмову в
обслуговуванні, так що слово «розподілені» частіше опускається.
2.3 Методологія виявлення атак
Традиційний шлях виявлення вторгнень. Найбільш відомі системи
виявлення вторгнень засновані на правилах (сигнатурах). RBID системи для
виявлення потенційної атаки використовують «сигнатуру» атаки з наступний
аналізом вхідного трафіка. Сигнатури досить різноманітні й можуть визначати
якісь параметри від номера порту в пакеті до послідовності байт у серії пакетів.
Після того, як сигнатура розроблена, її використання звичайне досить
ефективно запобігає небажаній мережній активності.
Головним недоліком підходу RBID є той факт, що сигнатури спершу треба
розробити й обновити систему новими сигнатурами. Тому що виявлення
зловмисного трафіка в RBID системах засноване на сигнатурах, без сигнатур
ефективність системи значно знижується. На жаль, розробка правил навіть для
атаки середньої складності не тривіальна. Розробка вимагає часу. Спочатку
атака повинна бути виявлена, записана й проаналізована. Потім сигнатуру треба
створити й, нарешті, випустити її у світло. Після того, як сигнатура випущена,
оператор IDS повинен створити нове правило для своєї IDS (іноді це теж не так-
то просто). Усі ці кроки забирають час, а як уже обговорювалося раніше, такі
хробаки, що швидко поширюються, як W32.Sqlexp, часу адміністраторові не
дають зовсім. Навіть якщо всі ці кроки виконати із запаморочливою швидкістю,
фундаментальна проблема залишається: якщо це нова атака, і для неї немає
сигнатури, RBID система може не помітити цю активність.
Статистичний шлях виявлення вторгнень. Статистичні системи
(SBID) мають інший підхід до виявлення вторгнень. Концепція SBID систем
проста: система визначає «нормальну» мережну активність і потім увесь
трафік, що не підпадає під визначення «нормального» позначається як
аномальний. SBID системи намагаються вивчити мережний трафік кожної
конкретної мережі. Процес аналізу трафіка триває увесь час, поки SBID система
37
активна, тому, припускаючи, що типовий мережний трафік залишається
постійним, можна сказати, що чім довше система використовується в цій
мережі, тем точніше й ефективніше вона стає. Аналізуючи мережний трафік і
обробляючи інформацію за допомогою складних статистичних алгоритмів,
SBID системи шукають аномалії в картині, що встановився, нормального
мережевого трафіка. Усім пакетам дається оцінка «аномальності» (ступінь, що
включає в себе, ненормальності специфічної події) і якщо ця оцінка вище
певного межі, IDS генерує сигнал тривоги. Ключовою особливістю будь-якої
SBID системи є її можливість вивчати мережну активність і відрізняти
нормальну мережну активність від аномальної.
Достоїнства. SBID системи мають ряд достоїнств. Аналіз характеру
трафіка з наступним повідомленням про аномальну активність може бути
критично важливим у наш час кібернебезпеки. Так, як статистичні системи не
вимагають яких-небудь точних знань про атаку, необхідні для роботи IDS,
заснованої на правилах, SBID системи можуть виявляти навіть “0-day” (зовсім
нові) види атак. Тільки це вже є серйозним аргументом на їхню користь, тому
що традиційні RBID системи чи навряд виявлять 0-day атаки.
Якщо мережа атакована новим хробаком, вірусом або атакою Denial of
Service (DOS), SBID система, швидше за все, просигналізує про наявність
незвичайної активності. SBID системи також можуть виявляти “low and slow”
атаки. Ці атаки (або сканування портів) звичайно проводяться досвідченими
порушниками й характеризуються великою тривалістю (можливо, тривають
місяцями), великою точністю й методичним виконанням. Звичайно, ці атаки
призначені для збору інформації про мережу або окрему систему. Не має
значення, наскільки атака розтягнута за часом, тому що в більшості випадків,
навіть якщо атакуючий посилає всього лише пакет на місяць, SBID система
помітить аномальний трафік і просигналізує про цю подію.
Іншим важливим достоїнством SBID систем є те, що обслуговувати їх
потенційно набагато простіше, чим RBID системи. Немає потреби у відновленні
сигнатур, тому що система не використовує специфічну інформацію про атаки.
38
Недоліки. SBID системи, дійсно, мають чудовий потенціал того, що вони
можуть робити, але є трохи досить значних технологічних недоліків.
Корисність SBID системи цілком заснована на її можливостях по аналізу
звичайного характеру трафіка для даного сегмента мережі. Теоретично,
принцип здається гарним, це зовсім не означає, що на практиці все буде так
само чудово.
Правда, полягає в тому, що більшість мереж надзвичайно мінлива в плані
використовуваних програм, протоколів, служб і часу використання. У багатьох
випадках, єдина “нормальна” характеристика мережі - це те, що мережа
постійно змінюється. Тому, SBID системи також страждають від можливості
бути обманутими атакуючим. Наприклад, що атакує може використовувати
програму типу Nmap і посилати численні SYN запити по мережі. Через якийсь
час SBID система буде вважати цю активність цілком нормальної для даної
мережі й ігнорувати. SBID система вивчає, що є “нормальний” трафік для даної
мережі, тому, якщо web-трафік - це все, що передається по мережі, то все, що не
попадає під визначення web-трафіка, дійсно буде приводом для тривожного
сигналу. З іншого боку, якщо flood-пінгування або старі трояни - це звичайне
для даної мережі справа, то SBID система дозволить цю активність, тому що
вона не може відрізнити “гарну” активність від “поганої”, а тільки «нормальну»
від «аномальної»
Інша проблема статистичних систем виявлення вторгнень - це
розгортання цих систем. На відміну від RBID систем, SBID системи не мають
негайного ефекту при їхній установці в мережі. Навіть якщо SBID система
встановлена в досить погодженій мережі, процес її навчання може зайняти дні
або тижні, для того, щоб нагромадився якийсь обсяг даних і аналіз став точним
і ефективним. SBID системи вимагають від оператора високої майстерності в
мистецтві аналізу пакетів. SBID системи, на відміну від RBID систем, не
генерують повідомлення, що точно описують що ж конкретно відбулося.
Аналітик, наприклад, не одержить повідомлення із заголовком “EXPLOIT
dtspcd exploit attempt“. Повідомлення буде просто набором пакетів, і визначення
39
природи даних пакетів лягає на оператора. Крім того, оператор SBID повинен
установити ефективне граничне значення. Так само, як і число певних правил в
RBID системі, граничне значення критично важливе й може зробити систему
ефективної або пошуки. Установка граничного значення занадто високим
приведе до того, що система не буде видавати сигнали там, де це було
необхідне, а при занадто низькім значенні, система буде видавати велику
кількість фіктивних тривог.
Незважаючи на ці недоліки, SBID система залишається важливим
інструментом забезпечення безпеки. Треба помітити, що така форма виявлення
аномалій, як виявлення аномалій протоколу, дозволяє розв'язати деякі з
перерахованих проблем SBID систем. Замість того щоб тренувати модель по
нормальній поведінці, детектори аномалій протоколу будують моделі TCP/IP
протоколів, що використовують RFC, хоча, необхідно уточнити, що правильний
по RFC трафік також може бути аномальним.
2.4 Перспективи розвитку СВА
У цей час в області СВА йде перехід до створення систем, орієнтованих
на захист мережних сегментів. Для американського ринку характерна наступна
ситуація: комерційні системи значно відрізняються від програмних продуктів,
які рекомендовані для використання в державних установах. Відзначимо, що це
загальна тенденція в сфері ІТ, - для забезпечення безпеки державних установ
повинні використовуватися тільки спеціально створені системи, недоступні на
ринку. Останні мають характерну відмінність: вони орієнтовані не на
автоматичні алгоритми розпізнавання ознак вторгнень, а на експертів-
аналітиків, що щодня оцінюють передані дані.
Вітчизняним розроблювачам слід звернути увагу на вільно
розповсюджувані системи, доступні у вихідних кодах. В умовах, коли
вітчизняні розробки в цій області практично відсутні, наявність вихідних
текстів програм дозволить вивчити властивості продуктів цього класу й
приступити до власних розробок.
40
РОЗДІЛ 3. СИНТЕЗ АЛГОРИТМУ ВИЯВЛЕННЯ
АТАК ТИПУ „ВІДМОВА В ОБСЛУГОВУВАННІ”
3.1 Визначення тимчасових інтервалів
системи. Моделювання потоку трафіка.
Вибір частоти дискретизації аналізу отриманих статистичних даних є
серйозною проблемою при побудові алгоритму, тому що, вибираючи інтервали
часу, слід варіювати між швидкодією системи й точністю отриманих даних. При
цьому цей параметр потрібно коректувати, залежно від швидкодії сервера на
якім використовується дане програмне забезпечення. В алгоритмі
розроблювальної ІСВНВ цей параметр може змінюватися в процесі роботи,
отже, система може настроюватися, щодо необхідного використання
процесорного часу.
У процесі розробки виникали проблеми з вибором досліджуваної мережі.
Тому що всі доступні для аналізу мережі були погано спроектовані. Неякісне
фізичне виконання й відсутність належного моніторингу стану привели до того,
що порти, що безсистемно відсилають широкомовні пакети, і численність
плохообжатих конекторів перешкоджають нормальному розгортанню даної
системи. У зв'язку з вищеописаними проблемами в програмному забезпеченні
передбачена робота з модельованим трафіком.
Щоб більш точно змоделювати завантаженість мережного ресурсу,
потрібно проаналізувати від чого вона залежить найбільше. З'ясувати, як
подібного роду модель можна побудувати за допомогою доступних програмних
засобів реалізації.
Завантаженість мережі прямо залежить від людського фактору. Точніше
від наявності в людини доступу до мережного ресурсу. У більшості випадків
це доступ з робочого місця. Отже, динаміка завантаженості каналу буде
змінюватися протягом робочого дня. Проаналізувавши доступні дані про
завантаженість web і proxy серверів, були зроблені виводи:
41
Піки активності доводяться приблизно на 10, 16 годин;
З напівночі до шести ранку завантаженість мінімальна;
Інтервалом для розрахунків параметрів розподіли було обрано 30
хвилин
Для генерації завантаженості сервера була створена модель, що
відповідає вищеописаним вимогам. Вона складається із суми трьох нормально
розподілених величин.
2 4 6 8 10 12 14 16 18 20 22 24 2
Рис. 3.1. Розміщення нормальне розподілених величин
Мови програмування можуть реалізувати тільки рівномірний розподіл
випадкової величини, тому, для реалізації запропонованої моделі
скористаємося формулами перетворення рівномірного в нормальний розподіл.
n
y 3
= ∑ (2ζ i −1) (3.1)
n i=1
Отримана випадкова величина є нормально розподіленою з математичним
очікуванням рівним нулю, і дисперсією рівній одиниці. Формула забезпечує
гарні результати вже при n=8, але для зручності подальших перетворень
візьмемо n=12, тоді формула придбає вид:
12
y =∑ζ i − 6 (3.2)
i=1
Для того щоб одержати нормально розподілену величину з математичним
очікуванням і дисперсією , потрібно перетворити випадкову величину по
формулі:
r =σ ⋅ y + a (3.3)
Завантаженість
42
Виразимо три необхідні, нормально розподілених величини виходячи з
формули 3.3:
12
1) y = 360*∑ (ζ i − 6) + 600
i=1
12
2) y = 780*∑ (ζ i − 6) + 960
i=1
12
3) y = 360*∑(ζ i − 6) + 720
i=1
В остаточному підсумку одержали модель, яка реалізовується наступним
алгоритмом (Додаток В).
3.2 Побудова статистичного алгоритму
виявлення атак
Проаналізувавши можливі методи реалізації атак типу відмова в
обслуговуванні, був розроблений алгоритм виявлення шкідливих IP - адрес, на
основі еталонної завантаженості сервера. Роботу алгоритму можна розділити на
два етапи:
Збір і аналіз статистики еталонної завантаженості сервера;
Виявлення атак і коректування еталонної моделі.
На першому етапі програма перехоплює всі пакети, що надійшли на
обраний мережний інтерфейс сервера, і зберігає в таблицю бази даних наступну
інформацію:
1. час одержання пакета;
2. Protocol ID - протокол, пов'язаний з подією (TCP = 0, UDP = 1, ICMP
= 2, ARP = 3 і Unknown = 4);
3. вихідний порт - номер порту джерела;
4. порт призначення - номер порту одержувача;
5. вихідна адреса - Ip-Адреса джерела;
6. адреса призначення - Ip-Адреса одержувача;
7. Raw Data Length - довжина даних у пакеті, Байт.
Алгоритм передбачає два варіанти збереження еталонного трафіка:
43
денний;
тижневий;
Використовуючи перший варіант, ми зневажаємо залежністю варіацій
завантаженості трафіка від дня тижня, (дослідження доступних графіків
завантаженості показало що, у перший і останній робочі дні тижня
інтенсивність використання мережних ресурсів користувачами більше, чим в
інші дні) і в наступному виявленні атак застосовуємо денну завантаженість
сервера. Під час використання другого варіанта знадобитися більше часу для
розгортання системи, але зате облік зміни інтенсивності трафіка протягом
тижня, дасть більш повну картину поведінки даної мережі.
На першому етапі важливу роль у процесі розгортання даної системи
відіграє системний адміністратор ( особа, ідповідальна за безпеку й
працездатність мережі), який наприкінці робочого дня проаналізувавши надані
йому графіки завантаженості самих активних IP - адрес повинен підтвердити
відсутність атак типу відмова в обслуговуванні, для підтвердження безпеки
зібраних статистичних даних.
Після підтвердження проводиться підрахунок для кожного кванта часу
(алгоритм передбачає зміну часу перерахування) пакетів від кожного IP -
адреси по кожному протоколу й заносяться в тимчасову таблицю. Далі
розраховується математичне очікування й середньоквадратичне відхилення по
IP - адресам за півгодинний інтервал часу й заносяться в таблицю, яка й буде
еталонною.
На другому етапі - виявлення атак, так само як і на першому
перехоплюються, усі пакети що надійшли й інформація про них записується в
таблицю. По витіканню кванта часу проводиться підрахунок пакетів від
кожного IP – адреси й максимальний відсоток кількості однакових пакетів для
кожної IP – адреси від загальної кількості присланих їм пакетів за розглянутий
період часу. Результати обчислень заноситься в тимчасову таблицю. Далі існує
кілька критеріїв виявлення атаки:
44
1. Нове спостереження є анормальним і розглядається як атака, якщо
воно не укладається в границях довірчого інтервалу,
κ > m + d * s , (3.4)
де k – кількість пакетів від аналізованї IP – адреси; m – математичне
очікування для даного інтервалу часу й аналізованї IP–адреси, узяте з таблиці
еталонних значень;s – середньоквадратичне відхилення для даного інтервалу
часу й аналізованого IP–адреси, узяте з таблиці еталонних значень;d – довірчий
коефіцієнт, обраний у настроюваннях ІАСОВ.
2. Якщо максимальний відсоток кількості однакових пакетів для
кожного IP – адреси від загальної кількості присланих їм пакетів за розглянутий
період часу більше обраного в настроюваннях показника;
3. Якщо загальна кількість прийнятих пакетів більше обраної в
настроюваннях граничної величини, то небезпечними вважаються IP – адреси з
максимальною інтенсивністю;
4. Якщо інформації про аналізованій IP–адресі немає в таблиці з
еталонними даними й кількість прийнятих від нього пакетів більше довірчого
рівня встановленого для нових IP–адрес;
При виявленні атаки передбачено кілька варіантів відповідних дій
системи:
1. Вивід повідомлення про виявлену атаку;
2. Занесення небезпечнї IP–адреси в спеціальну таблицю бази даних, з
наступним непропущенням пакетів від усіх адрес із цієї таблиці;
3. Відправлення спеціальної команди по Com-Порту прикордонному
маршрутизатору з підтримкою ACL (Access Control List) – листів, для занесення
небезпечнї IP–адреси в список заборонених. Таким чином, використовуваний
сервер не буде витрачати час на обробку пакетів відправлених цими станціями.
Не залежно від вибору варіанта відповідної дії ведеться журнал
системних записів, проаналізувавши який можна повністю відновити
послідовність виконаних дій системою.
45
Також системою передбачена адаптація під зміни в завантаженості
сервера. Залежно від обраного режиму збереження еталонного трафіка (денний,
тижневий), наприкінці періоду система пропонує особі, відповідальному за
безпеку й працездатність мережі, провести коректування таблиці еталонних
параметрів з урахуванням статистики за останній час. Коректування параметрів
проходить згідно з наступною формулою:
N = M Э + (M Н − M Э ) * D , (3.5)
де N - нове значення параметра; M Э - значення, узяте з таблиці еталонних
показників; M Н - значення, отримане в результаті вимірів; D - коефіцієнт
коректування, від якого залежить, наскільки сильно будуть впливати нові
значення.
3.3 Розробка структури сховища даних
Для зберігання інформації, швидкого доступу до неї й підтримки її в
актуальному стані в процесі роботи ІСВНВ потрібно використання бази даних.
Процес створення бази даних починається з виділення основних сутностей і
угруповання їх по таблицях. Правильне проектування бази даних зменшує
кількість збітковості у таблицях, що приводить до прискорення виконання
запитів і зменшення займаного базою місця.
Приведемо опис використаних таблиць:
Таблиця «IP» призначена для збереження інформації про отримані пакети,
містить у собі такі поля:
ID – унікальний код запису, необхідний для збереження цілісності даних;
SRCIP – IP–адреса відправника пакета;
DSTIP – IP–адреса одержувача пакета;
LENGTH_ – довжина даних у пакеті;
TIME_ – час прибуття пакета;
PROT – протокол;
SRCPORT – порт відправника пакета;
DESTPORT – порт одержувача пакета;
46
Таблиця «IP_GEN» призначена для збереження інформації про
сгенерований трафік, містить у собі такі поля:
ID – унікальний код запису, необхідний для збереження цілосності даних;
SRCIP – IP–адреса відправника пакета;
DSTIP – IP–адреса одержувача пакета;
LENGTH_ – довжина даних у пакеті;
TIME_ – час прибуття пакета;
PROT – протокол;
Таблиця «MX_DX» призначена для збереження еталонної моделі
поведінки трафіка, містить у собі такі поля:
INTERVAL – порядковий номер інтервалу часу;
IP - IP–адреса відправника пакета;
MX – математичне очікування;
DX – середньоквадратичне відхилення;
Таблиця «TIME_IP_COUNT» призначена для зберігання тимчасових
даних. Використовується для розрахунків середньоквадратичного відхилення;
TIME_ - номер інтервалу часу;
IP - IP–адреса відправника пакета;
COUNTT – кількість відправлених пакетів за інтервал часу;
Таблиця «CHART_TABLE» призначена для зберігання тимчасових даних.
Використовується при виводі на екран графіків;
TIME_ - номер інтервалу часу;
COUNTT – кількість відправлених пакетів за інтервал часу;
Таблиця «ZAPRET_IP» призначена для зберігання IP–адрес, пакети від
яких не пропускаються далі в систему;
ID - унікальний код запису, необхідний для збереження цілісності даних;
IP - заборонена IP–адреса;
TIME – час занесення адреси в таблицю.
47
РОЗДІЛ 4. СИНТЕЗ ПРОГРАМНО-АПАРАТНОГО
КОМПЛЕКСУ ІСВНВ
4.1 Вибір програмних засобів
4.1.1 Сервер баз даних Firebird 1.5
Сервер баз даних Firebird - Interbase, поставляється за відкритою
ліцензією (не потребуючої окремої оплати). Має високу відмовостійкість у
роботі й гарний механізм поновлення БД. Що стосується обсягу збереженої
інформації, то багатофайлова база даних може складатися з 65535 файлів, таким
чином, теоретична границя для однієї бази даних Firebird - 132 терабайта.
Firebird не вимогливий до ресурсів, що дозволяє використовувати його на
малопотужних комп'ютерах. Він також прекрасно працює в мережах з різною
пропускною здатністю й кількістю користувачів.
Firebird 1.5, заснована на ядрі Borland Interbase. Є повнофункціональним
Sql-Сервером, його відмітні якості :
• Висока продуктивність і надійність при мінімальних вимогах до
технічних засобів;
• Висока масштабованість. Можливість використання Firebird:
o У якості настільного, однокористувацького додатка БД
o Як потужний сервер масштабу підприємства для роботи десятків і
сотень користувачів;
• Розширена підтримка стандарту ANSI SQL-92;
• Простота установки й підтримки сервера. Зручний і не нужденний у
спеціальній підготовці механізм адміністрування БД;
• Кросплатформеність. Підтримуються всі версії Windows, починаючи з
Windows 98, Linux і трохи Unix-Платформ.
• Безкоштовність. Не доведеться платити за ліцензію, як у випадку з MS
SQL або Oracle;
• Виправлені багато обмежень Interbase;
48
• Широке використання клонів Interbase (Interbase5.x, 6.x,7.x,
Firebird1.x,1.5, Yaffil).
Не претендує на повноту список областей застосування:
У тисячах ділових додатків у країнах СНД і світі
У телефонних станціях «Motorola»
У зчитувальних пристроях на німецьких залізницях.
СУБД «Firebird» може бути встановлена як на виділений сервер, так і на
робочу станцію. «Сервером» іменується комп'ютер, на який установлена
Firebird і БД.
Можна виділити наступні рекомендації з установки сервера:
Бажане встановлювати «Firebird» на комп'ютер з Windows
NT/2000/XP/2003 у силу їх більшої надійності в порівнянні з Windows 9x/ME.
Також віддається перевага файловій системі NTFS із двох причин: по-перше,
вона більш надійна, чому FAT і FAT32; по-друге, каталог із БД можна стиснути
засобами NTFS для економії дискового простору.
Таким чином, враховуючи перераховані вище переваги СУБД «Firebird»,
вибір даного програмного продукту для реалізації поставленого завдання
випускної роботи не викликає сумніву.
4.1.2 Мова програмування Delphi
При виборі програмного засобу для реалізації ІСВНВ виникає проблема
вибору. Існує велика кількість різних середовищ програмування для ОС
Windows 95/98/ME/2000/XP. Але виходячи з вимог, які висуваються
формулюванням завдання необхідно вибрати найпростішому із середовищ
програмування, яке дасть можливість:
• створити програму, яка буде повноцінно функціонувати в середовищі ОС
Windows 95/98/ME/2000/XP;
• створити програму у вигляді виконуваного (EXE) файлу;
• створити програму у вигляді одного окремого файлу, який не має потреби
в додаткових бібліотеках або модулях;
49
• створити програму, яку можна легко переносити на дискеті або дискетах
формату 3.5" з архівацією;
• створити програму, яку не можна легко декомпілювати;
• досить легко й зрозуміло програмувати.
Після аналізу можливостей різних середовищ програмування зупинилися
на середовищі програмування Delphi 7.0.
Середовище візуального програмування Delphi завоювала своє місце
серед засобів побудови різних додатків для операційної системи Windows
95/98/ME/2000/XP - від засобів роботи з базами даних до мультимедійних
додатків. Говорячи про Delphi у цілому, можна сказати, що це комбінація
декількох найважливіших сучасних технологій:
• високопродуктивний компілятор у машинний код;
• об'єктно-орієнтована модель компонентів;
• візуальне (а, отже, і швидке) побудова додатків із програмних прототипів;
• масштабований засіб для побудови баз даних.
Компілятор, вбудований в Delphi, забезпечує високу продуктивність,
необхідну для побудови додатків в архітектурі “клієнт-сервер”. Він пропонує
легкість розробки й швидкий час перевірки готового програмного блоку,
характерного для мов четвертого покоління (4GL) і в той же час забезпечує
якість коду, характерного для компілятора 3GL. Крім того, Delphi забезпечує
швидку розробку без необхідності писати вставки на Сі або ручного написання
коду (хоча це можливо).
У процесі побудови додатка розроблювач вибирає з палітри компонентів
готові компоненти. Ще до компіляції він бачить результати своєї роботи - після
підключення до джерела даних їх можна бачити відображеними на формі,
можна зміщатися за даними, представляти їх у тому або іншім виді. У цьому
розумінні проектування в Delphi мало чому відрізняється від проектування в
інтерпретуючім середовищі, однак після виконання компіляції ми одержуємо
код, який виконується в 10-20 раз швидше, чим те ж, зроблене за допомогою
інтерпретатора. Крім того, компілятори бувають різні, в Delphi компіляція
50
проводиться безпосередньо в рідний машинний код, у той час як існують
компілятори, які перетворюють програму в такий називаний p-код, який потім
інтерпретується віртуальною p-машиною. Це не може не відбитися на
фактичній швидкодії готового додатка [4].
Основний упор цієї моделі в Delphi робиться на максимальному
використанні коду. Це дозволяє розроблювачам будувати додатки дуже швидко з
попередньо підготовлених об'єктів, а також дає їм можливість створювати свої
власні об'єкти для середовища Delphi. Ніяких обмежень по типах об'єктів, які
можуть створювати розроблювачі, не існує. Дійсно, усе в Delphi написане на
ньому ж, тому розроблювачі мають доступ до тих же об'єктів і інструментів, які
використовувалися для створення середовища розробки. У підсумку немає
ніякої різниці між об'єктами, які поставляються Borland або третіми фірмами, і
об'єктами, що можна створити.
У стандартне постачання Delphi входять основні об'єкти, які утворюють
вдало підібрану ієрархію з 270 базових класів. Але якщо виникне необхідність у
розв'язку якоїсь специфічної проблеми на Delphi, те можна спроектувати й свої
компоненти під конкретно поставлену завдання. На Delphi можна однаково
добре писати як додатки до корпоративних баз даних, так і, наприклад, ігрові
програми. Багато в чому це обґрунтовується тим, що традиційно в середовищі
Windows було достатнє складно реалізовувати інтерфейс користувача. Саме
розробка інтерфейсу в Delphi є найпростішим завданням для програміста.
Середовище Delphi містить у собі повний набір візуальних інструментів
для швидкісної розробки доповнень (RAD - rapid application development), яка
підтримує розробку інтерфейсу користувача й підключення до корпоративних
баз даних. VCL - бібліотека візуальних компонентів, містить у собі стандартні
об'єкти побудови користувацького інтерфейсу, об'єкти керування даними,
графічні об'єкти, об'єкти мультимедіа, діалоги й об'єкти керування файлами,
керування DDE і OLE.
51
В Delphi візуальні компоненти пишуться на тому ж об'єктному паскалі, на
якім пишеться й алгоритмічна частина додатка. І візуальні компоненти Delphi
виходять відкритими для надбудови й переписування [5].
Об'єкти БД в Delphi засновані на SQL. До складу Delphi також включений
Borland SQL Link, тому доступ до СУБД Oracle, Sybase, Informix, Firebird і
Interbase відбувається з високою ефективністю.
Завдяки архітектурі компілятора додатка, виготовлені за допомогою
Delphi, працюють надійно й непохитно. Delphi підтримує використання вже
існуючих об'єктів, включаючи DLL, написані на С и С++, OLE сервера, VBX,
об'єкти, створені за допомогою Delphi. З готових компонентів працюючі
додатки збираються дуже швидко. Крім того, оскільки Delphi має цілком
об'єктну орієнтацію, розроблювачі можуть створювати свої повторно
використовувані об'єкти для того, щоб зменшити витрати на розробку.
Delphi використовує структурну об'єктно-орієнтовану мову (Object
Pascal), що сполучають із однієї сторони виразну міць і простоту
програмування, характерну для мов 4GL, а з іншої сторони ефективність мови
3GL. Програмісти негайно можуть приступитися до роботи над додатками, і їм
не прийде для цього вивчати особливості програмування подій в Windows.
Delphi цілком підтримує передові програмні концепції, включаючи
інкапсуляцію, спадкування, поліморфізм і керування подіями.
Це дуже важлива особливість для розроблювачів у середовищі Windows,
оскільки у вже існуючі Windows-Додатки програміст може інтегрувати те, яке
буде розроблено за допомогою Delphi.
Delphi дозволяє розроблювачам настроїти середовище для максимальної
зручності. Можна легко змінити палітру компонентів, інструментальну лінійку,
а також набудовувати виділення синтаксису кольором.
Крім того, Delphi підтримує такі низькорівневі особливості, як підкласи
елементів керування Windows, перекриття циклу обробки повідомлень
Windows, використання вбудованого асемблера.
52
Основа доповнення на Delphi - це форми, тобто об'єкти, у які
втримуються інші об'єкти для створення користувацького інтерфейсу додатка.
Модулі складаються з коду, який реалізує функціонування додатка, оброблювачі
подій для форм і їх компонентів.
Інформація про форми зберігається у двох типах файлів - .dfm і .pas,
причому перший тип файлу - двійковий - зберігає образ форми і її властивості,
другий тип описує функціонування оброблювачів подій і поведінки
компонентів. Обидва файла автоматично синхронізуються Delphi, тому якщо
додати нову форму в проект, пов'язаний з ним файл.pas автоматично буде
створений, і його ім'я буде додано в проект.
Така синхронізація й робить Delphi two-way-інструментом, забезпечуючи
повну відповідність між кодом і візуальною виставою. Як тільки додати новий
або об'єкт або код, Delphi установлює так звану “кодову синхронізацію” між
візуальними елементами й відповідними їм кодовими виставами.
Під делегуванням в Delphi розуміється те, що деякий об'єкт може надати
іншому об'єкту опцію відповіді на деякі події.
Така модель у деяких випадках значно спрощує програмування.
Наприклад, замість того, щоб створювати підклас для Windows controls при
додаванні нової поведінки, можна просто прив'язати процедуру обробки події,
яка буде викликатися автоматично на кожний клич мишею або користувачем
при натисканні їм клавіші. Аналогічно можна написати процедуру визначення
допустимості таблиці, яка буде виконуватися оброблювачем події. Посилання на
класи додають додатковий рівень гнучкості, так, коли ви прагнете динамічно
створювати об'єкти, чиї типи можуть бути відомі тільки під час виконання коду.
Наприклад, посилання на класи використовуються при формуванні
користувачем документа з різного типу об'єктів, де користувач набирає потрібні
об'єкти або з меню палітри. Властиво, ця технологія використовувалася й при
побудові Delphi.
Таким чином, враховуючи вищесказане, вибір середовища
програмування Delphi цілком виправданий.
53
4.1.3 Winpcap
Архітектура PCAP споконвічно розроблялася для операційних систем з
відкритим вихідним кодом. Закриті комерційні операційні системи залишилися
без уваги розроблювачів. Цей факт з'явився однієї із причин, через які
практично всі більш-менш серйозні мережні додатки написані для UNIX, Linux,
BSD і т.д. Windows у цьому плані помітно відставала.
Програмування додатків на мовах високого рівня під Windows – процес
куди більш приємний, чим під тієї ж Linux. Зручність налагодження, наявність
зручної системи допомоги, швидка розробка додатків і візуальних інтерфейсів і
маса інших позитивних якостей засобів розробки додатків (Delphi, C++ Builder,
Visual Studio) і відсутність можливості низькорівневого керування мережним
інтерфейсом привели до виникнення необхідності створення архітектури,
аналогічної PCAP, для сімейства ОС Windows. Природно, розроблювачі
архітектури Winpcap не стали винаходити велосипед, а адаптували існуючу
архітектуру PCAP для ОС Windows.
Процес переносу PCAP на Windows полягав в адаптації pcap-драйвера й
бібліотеки libpcap для роботи під Win32. Оригінальна версія libpcap написана
мовою C з урахуванням можливості переносу бібліотеки на різні версії UNIX.
ОС Windows не підтримує всіх викликів Posix-Систем, однак надає деякі
аналогічні їм функції через API. Моделі пам'яті UNIX і Windows однакові
(Windows і більшість UNIX є 32-х бітними ОС) і мають аналогічний розмір
цілих чисел.
Версія PCAP для Win32 заснована на драйвері захвата пакетів, структура
й принцип дії якого аналогічний його попередникові для UNIX. Це значно
полегшує процес переносу додатків з однієї ОС на іншу. Бібліотеки й функції
ОС UNIX, відсутні в Windows (наприклад, getnetbyname) і необхідні для
компіляції libpcap на Windows-Машині, розроблювачам довелося включити у
вихідний код драйвера (директорія Win32-include дистрибутива).
Частина вихідного коду, відповідальна за взаємодію з мережним
адаптером, була змінена для підтримки його Ndis-Драйвера. Відповідно до
54
позначень, прийнятих в оригінальній версії libpcap, вихідний код для взаємодії
із драйвером перебуває в наборі файлів pcap-xxx.c (і відповідний йому pcap-
xxx.h), де XXX – указує на операційну систему (наприклад, pcap-linux.c). До
вже існуючих файлів минулого додані pcap-win32.c і pcap-win32.h.
Основній зміні піддався принцип взаємодії додатка користувача із
драйвером захвата пакетів. Libpcap для Win32 взаємодіє з апаратним
забезпеченням через інтерфейс, надаваний динамічною бібліотекою packet.dll (
на відміну від Windows, в ОС UNIX мережний адаптер або модем «видний» як
стандартний файл, тому немає необхідності у використанні проміжних
бібліотек – досить просто створити пакет необхідної структури й записати його
в цей файл). Це не впливає на нормальну роботу libpcap, однак може створити
певні проблеми програмістові, що бажає одержати доступ безпосередньо до
драйвера захвата пакетів. Наприклад, в ОС UNIX можливо використовувати
системний виклик SELECT для того, щоб довідатися, чи зробив пакет на вхід
адаптера. В ОС Windows така можливість відсутня.
Програміст може використовувати функції libpcap для забезпечення
працездатності вихідного коду додатка на різних операційних системах, але при
цьому можливості додатка будуть обмежені (наприклад, libpcap не дозволяє
відправляти пакети через мережний інтерфейс). Якщо програміст вирішить
скористатися функціями packet.dll, той його додаток буде працювати тільки під
керуванням ОС сімейства Win32, однак при цьому можливості додатка будуть
практично необмеженими.
Архітектура Winpcap доповнює стандартні функції операційних систем
сімейства Win32 можливістю ухвалювати й передавати дані по мережі,
минаючи стек протоколів операційної системи й взаємодіючи безпосередньо з
мережним адаптером комп'ютера. Більше того, вона надає додаткам API
високого рівня для керування низькорівневими процесами. Winpcap складається
із трьох компонентів: драйвер пристрою захвата пакетів (paсket.vxd),
низькорівнева динамічна бібліотека (packet.dll) і статична бібліотека високого
рівня (libpcap).
55
Дана архітектура може бути використана як для створення програм
обробки пакетів для ОС Windows, так і для переносу аналогічних програм,
написаних для ОС UNIX, і повністю сумісна з архітектурою BPF – libpcap.
Структура стека захвата пакетів
Для перехоплення пакетів, переданих по мережі, додатку необхідно
взаємодіяти безпосередньо з мережним обладнанням. Із цієї причини
операційна система повинна надавати кілька примітивних функцій для
приймання й передачі даних безпосередньо через мережний адаптер.
Призначення цих функцій полягає в тому, щоб прийняти вхідний пакет і
передати його в стек протоколів операційної системи для подальшої обробки.
Додаток одержує пакет без заголовків канального, мережного й транспортного
рівнів, інтерпретує й обробляє його й надає в зручному для користувача виді.
Рис. 4.1. Структура стека захвата пакетів від мережного адаптера до додатка верхнього рівня.
На нижньому рівні перебуває мережний адаптер, що ухвалює всі пакети,
передані по мережі. Драйвер захвата пакетів (pcap-драйвер) packet.vxd є
програмним модулем низького рівня. Він працює на рівні ядра ОС і взаємодіє
безпосередньо із драйвером мережного адаптера. Pcap-Драйвер надає набір
функцій низького рівня, що забезпечують приймання й передачу даних на
канальному рівні через NDIS, який є частиною мережної підсистеми Win32.
NDIS відповідає за керування різними типами адаптерів і забезпечує зв'язок
56
адаптера із програмним забезпеченням, відповідальним за формування пакетів
різної структури.
Динамічна бібліотека packet.dll «ізолює» програму користувача від
драйвера й надає додатку незалежний від виду ОС (сімейства Win32) інтерфейс.
Це дозволяє додатку працювати на різних Windows-Платформах без
перекомпіляції. Бібліотека packet.dll працює на рівні користувача, але окремо
від додатка.
Статична бібліотека libpcap використовується частиною програми
користувача, що забезпечує перехоплення й фільтрацію пакетів. Вона задіє
функції, надавані бібліотекою packet.dll, і забезпечує програмі користувача
керування процесами приймання й фільтрації даних на високому рівні.
Бібліотека libpcap статично пов'язана із програмою користувача і є її частиною.
Програма користувача – вищий рівень структури стека захвата пакетів.
Вона забезпечує обробку прийнятих пакетів і відображення результатів у
зручному для користувача виді.
Взаємодія з NDIS
NDIS підтримує три типи мережних драйверів:
1. Драйвери мережних карт (NIC – Network Interface Card) – нижчий
рівень мережної підсистеми.
2. Проміжні драйвери – забезпечують взаємодія драйверів верхнього
рівня (наприклад, драйверів протоколів) із драйверами NIC.
3. Драйвери транспортного рівня (драйвери протоколів) –
забезпечують приймання й передачу даних додатки верхнього рівня,
використовуючи стек стандартних мережних протоколів (наприклад, TCP/IP).
Загальний вид структури NDIS із двома стеками захвата пакетів,
прив'язаних до одному мережному адаптеру, представлено на рис. 4.2. Один з
них складається із драйвера NIC і драйвера протоколу, іншої – із драйвера NIC,
проміжного драйвера й драйвера протоколу.
57
Рис. 4.2. Структура NDIS
Для нормальної роботи драйверу захвата пакетів необхідно взаємодіяти як
із драйвером мережного пристрою ( для передачі й приймання даних), так і з
додатком користувача ( для одержання від нього даних або передачі йому
прийнятих від мережного пристрою пакетів). Тому драйвер захвата пакетів
розроблений як драйвер протоколу в структурі NDIS (рис. 4.3).
Рис. 4.3 Положення драйвера захвата пакетів у структурі NDIS
Це дозволяє йому працювати з усіма мережними пристроями,
підтримуваними ОС Windows (адаптерами Ethernet і т.д.). Проте, на даний
момент драйвер працює тільки з адаптерами Ethernet, loopback-адаптерами й
підтримує підключення до глобальної мережі через Ethernet-Адаптер. Пакет
протоколів PPP NCP-LCP «прозорий» для драйверів протоколів, оскільки Ppp-
58
З'єднання встановлюються віртуально. Тому драйвер захвата пакетів не може
працювати з такого роду з'єднаннями.
4.2 Опис апаратних засобів
Дана система призначена для використання на серверах, для захисту від
атак типу «відмова в обслуговуванні». Використання бібліотеки Winpcap
дозволяє розвертати систему на всіх операційних системах сімейства Windows.
Сама ж бібліотека зроблена так що, незначно скоректував вихідній код
програми її можна використовувати на Unix системах.
4.3 Інтерфейс ІСВНВ
Розроблена система починає свою роботу з виводу головної форми, на
якій користувач вибирає один з наступних режимів роботи програми (рис. 4.4):
Початок
Вибір
режиму роботи
Навчання Режим Режим
системи виявлення атак тестування
Кінець
Рис. 4.4. Можливі режими роботи
Якщо обраний режим навчання системи, то користувачеві виводиться
вікно вибору мережного підключення (рис. 4.5). Після вибору підключення
програма почне перехоплювати всі пришедшие на цей інтерфейс пакети й
затягати інформацію про них у базу даних. По завершенню дня користувачеві
демонструється графік завантаженості мережі, з варіантом виводу статистики
окремо по кожній IP–адресі й окремо по кожному протоколу, після аналізу яких,
він повинен підтвердити відсутність на даному тимчасовому проміжку атак
типу відмова в обслуговуванні (рис. 4.6).
59
Рис. 4.5. Діалогове вікно вибору параметрів захвата пакетів
Рис. 4.6. Вікно виводу графіків завантаженості мережі
При виборі режиму виявлення атак, користувач спочатку повинен вибрати
мережний інтерфейс, з якого будуть перехоплюватися пакети, після чого
програма почне виявлення атак, згідно зазначених користувачем параметрів
(рис. 4.7).
Рис. 4.7. Вікно захвата пакетів
60
Якщо обраний режим тестування, то програма буде працювати тільки зі
сгенерованим трафіком. Спочатку користувач повинен задати параметри для
генерації еталонного трафіка (рис. 4.8). Далі генерується трафік зі
змодельованими атаками. Після чого проходить аналіз працездатності
алгоритму.
Рис. 4.8. Вікно генерації трафіка
4.4 Аналіз працездатності ІСВНВ
Аналіз працездатності ІСВНВ проводився на змодельованому трафіку в
такий спосіб:
1. Моделюємо еталонну модель завантаженості трафіка.
2. Моделюємо трафік із заданою кількістю атак.
3. Застосовуємо розроблений алгоритм до змодельованого трафіка.
4. Аналізуємо кількість виявлених атак і неправильних спрацьовувань.
Після пророблених кроків були отримані наступні результати:
При атаці від однієї IP–адреси з 10000 атак за добу всі атаки були
розпізнані. Усі атаки були розпізнані на першому інтервалі часу. За час роботи
алгоритми було зафіксовано 14 неправильних спрацьовувань системи.
При атаці від 10 IP–адрес із 10000 атак за добу всі атаки були
розпізнані. Усі атаки були розпізнані на першому інтервалі часу. За час роботи
алгоритми було зафіксовано 16 неправильних спрацьовувань системи.
Отже, розроблене програмне забезпечення задовольняє вимогам,
поставленим у технічнім завданні.
61
Час регламентованих перерв за робочу зміну варто встановлювати в
залежності від виду і категорії трудової діяльності за ПЕОМ.
Тривалість безупинної роботи за ПК без регламентованої перерви не
повинна перевищувати 2 години.
4.5 Створення апаратної моделі захищеної
мережі
В програмному комплексі моделювання мереж Cisco Packet Tracert
створена модель дослідження безпеки створених заходів (рисунок 4.9), що дає
можливість перевірити критичні вузли та зв’язки.
Рис. 4.9. Модель тестованої мережевої системи
В моделі використане обладнання різних класів та призначення.
Розроблена структура IP-адресації для серверного сегменту (таблиця 4.1) та
клієнтських станцій (таблиця 4.2). Створені групи віртуальних локальних
мереж для ізоляції трафіка з метою підсилення безпеки.
62
Таблиця 4.1
IP-адресація серверного сегменту
Пристрій Інтерфейс IP адреса /
префікс Опис
Кореневий комутатор L3 VLAN 1 (native) 192.168.0.1/24
Cisco SF35024 VLAN 20 10.0.20.1/24 бухгалтерія 2 поверх
з включеною VLAN 30 10.0.30.1/24 бухгалтерія 3 поверх
маршрутизацією VLAN 40 10.0.40.1/24 абон. відділ
VLAN 50 10.0.50.1/24 юристи
VLAN 60 10.0.60.1/24 майстри по роб. з насел.
VLAN 70 10.0.70.1/24 2 поверх
VLAN 80 10.0.80.1/24 газ сервіс
VLAN 90 10.0.90.1/24 майстри 3 поверх
Fa0/1 192.168.10.1/24 сервер бухгалт.
Fa0/2 192.168.20.1/24 сервер бухгалт. 3 пов.
Fa0/3 192.168.30.1/24 сервер абон. Відділ
Fa0/4 192.168.40.1/24 сервер документообіг
Fa0/24 192.168.240.2/30 Internet
Ga0/1 trunk
Ga0/2 trunk
Комутатор другого рівня VLAN 1 (native) 192.168.0.2/24
Cisco SF35024 (1) Ga0/1 trunk
Ga0/2 trunk
Комутатор другого рівня VLAN 1 (native) 192.168.0.3/24
Cisco SF35024 (2) Ga0/1 trunk
Ga0/2 trunk
Комутатор другого рівня VLAN 1 (native) 192.168.0.4/24
Dlink DGS1100 (3) Ga0/1 trunk
Комутатор другого рівня VLAN 1 (native) 192.168.0.5/24
Dlink DGS1100 (4) Ga0/1 trunk
Router Internet LAN 192.168.240.1/30
Cisco RV082
Таблиця 4.2
IP-адресація клієнтських станцій
Пристрій IP адреса / префікс Шлюз за замовчуванням
Сервера
бухгалтерія 192.168.10.(2…254)/24 192.168.10.1/24
бухг. 3 пов. 192.168.20.(2…254)/24 192.168.20.1/24
абон. відділ 192.168.30.(2…254)/24 192.168.30.1/24
документообіг 192.168.40.(2…254)/24 192.168.40.1/24
РС
бухгалтерія 2 поверх 10.0.20.(100…254)/24 10.0.20.1/24
бухгалтерія 3 поверх 10.0.30.(100…254)/24 10.0.30.1/24
абон. відділ 10.0.40.(100…254)/24 10.0.40.1/24
юристи 10.0.50.(100…254)/24 10.0.50.1/24
майстри по роб. з насел. 10.0.60.(100…254)/24 10.0.60.1/24
2 поверх 10.0.70.(100…254)/24 10.0.70.1/24
газ сервіс 10.0.80.(100…254)/24 10.0.80.1/24
майстри 3 поверх 10.0.90.(100…254)/24 10.0.90.1/24
63
4.5.1 Базовий алгоритм налаштування всіх
комутаторів через CLI та WEB інтерфейс
1. Призначення імені пристрою
sw1# configure terminal
sw1 (config)# hostname SW-L3
Рис. 4.10. Призначення імені пристрою
2. Налаштування дати і часу
SW-L3(config)# clock timezone Kyiv 2
SW-L3(config)# clock summer-time Kyiv recurring eu
SW-L3 (config)# exit
SW-L3# clock set 12:20:55 30 Aug 2022
Рис. 4.11. Налаштування дати і часу
3. Налаштування дати і часу
SW-L3# configure terminal
SW-L3 (config)# interface vlan 1
SW-L3 (config-if)# ip address 192.168.0.1 /24 (192.168.1.11 /24)
SW-L3 (config)# exit
64
Рис. 4.12. Налаштування дати і часу
4. Створюємо всі VLAN (потрібно створити всі однакові на кожному
комутаторі (20,30,…,90))
SW-L3 (config)# vlan 20 name test
Рис. 4.13. Створення VLAN
5. Призначення на кожному комутаторі, які порти відносяться до якої
групи VLAN
(в прикладі призначення діапазону портів з fe11 до fe15 в vlan 20)
SW-L3 (config)# interface range fe11-15
SW-L3 (config-if-range)# switchport mode access
SW-L3 (config-if-range)# switchport access vlan 20
SW-L3 (config-if-range)#exit
Рис. 4.14. Групування портів по VLAN
6. Налаштування магістральних каналів (trunk)
SwL3(config)# interface ge1
SwL3(config-if)# switchport mode trunk
SwL3(config-if)# switchport trunk native vlan 1
SwL3(config-if)# exit
65
Рис. 4.15. Налаштування магістральних каналів
7. Безпека портів за МАС
(в прикладі включаємо функцію захисту на інтерфейсі FE1. Встановлюємо
обмеження вивчення адрес – 1 адреса. Після вивчення МАС-адреси блокуємо
функцію вивчення нових адрес для інтерфейсу з метою відкидання пакетів з
невивченими МАС-адресами джерела.)
SW-L3 (config)# interface fe1
SW-L3 (config-if)# port security
SW-L3 (config-if)# port security max 1
Рис. 4.16. Безпека портів за МАС
66
8. Підключити клієнта до порту та вивчити МАС-адресу
SW-L3 (config-if)# port security discard
SW-L3 (config-if)# port security mode lock
Рис. 4.17. Підключення клієнта до порту та вивчення МАС-адреси
Якщо порт заблокувався, згідно верхнього правила, треба:
• Очистити таблицю MAC-адрес
• Підняти порт з err-disable
9. Зберегти налаштування
copy running-config startup-config
4.5.2 Додаткові налаштування кореневого комутатора
L3 Cisco SF35024 через CLI та WEB інтерфейс
1. Порт L3 маршрутизації для кожного сервера і присвоєння IP-адреси
шлюзу за замовчанням
SwL3(config)# interface fe1
SwL3(config-if)# no switchport
SwL3(config-if)# ip address 192.168.10.1 /24
SwL3(config-if)# no shutdown
Рис. 4.18. Підключення клієнта до порту та вивчення МАС-адреси
67
2. Порт L3 маршрутизації для RV082 і присвоєння IP-адреси шлюзу за
замовчанням
SwL3(config)# interface fe24
SwL3(config-if)# no switchport
SwL3(config-if)# ip address 192.168.240.2 /30
SwL3(config-if)# no shutdown
Рис. 4.19. Налаштування L3 маршрутизації
3. Налаштування і активація інтерфейсу SVI для VLAN (треба зробити для
всіх VLAN)
SwL3(config)# interface vlan 20
SwL3(config-if)# ip address 10.0.20.1 /24
SwL3(config-if)# no shutdown
Рис. 4.20. Налаштування і активація інтерфейсу SVI для VLAN
4. Включення маршрутизації на комутаторе третього рівня
SwL3(config)# ip routing
Рис. 4.21. Включення маршрутизації
68
5. Налаштування списків доступу ACL для блокування доступу до
наскрізної маршрутизації.
(Робимо дозволи на доступ з кожної VLAN та дозволяємо протокол DHCP (5-
6). Створюємо список доступу з назвою «120» (1). В прикладі VLAN 20
(бухгалтерія 2 поверх) буде бачити сама себе (2), сервера документообігу (3), та
підмережу доступу до Інтернета (4). Все інше буде заблоковано (7)).
SwL3(config)#ip access-list extended 120
Рис. 4.22. Створення списку ACL
SW-L3(config-ip-al)#permit ip 10.0.20.0 0.0.0.255 10.0.20.0 0.0.0.255
SW-L3(config-ip-al)#permit ip 10.0.20.0 0.0.0.255 192.168.40.0 0.0.0.255
SW-L3(config-ip-al)#permit ip 10.0.20.0 0.0.0.255 192.168.240.0 0.0.0.3
Явно дозволити DHCP:
SW-L3(config-ip-al)#permit udp any any any bootps
SW-L3(config-ip-al)#permit udp any any any bootpc
SW-L3(config-ip-al)#deny ip any any
Рис. 4.23. Налаштування ACL
6. Призначення створеного списку доступу ACL на інтерфейсі
SwL3(config)#interface vlan 20
SwL3(config-if)#service-acl input 120
69
Рис. 4.24. Прив’язка ACL до порту
7. Відключення ACL на інтерфейсі (за потреби)
SwL3(config)# no service-acl input
8. Створення DHCP роздачі на кожну VLAN
SwL3(config)# ip dhcp server
Рис. 4.25. Включення сервісу DHCP
Виключаємо з роздачи діапазони 10.0.20.1-10.0.20.99; 10.0.30.1-10.0.30.99 і т.д.
всі зарезервовані)
SwL3(config)#ip dhcp excluded-address 10.0.20.1 10.0.20.99
Рис. 4.25. Створення винятків
Налаштовуємо DHCP relay для кожної VLAN (10,20…90). Вказується ІР-адреса
сервера DHCP.
70
SwL3(config)#interface vlan 20
SwL3(config-if)#ip helper-address 192.168.0.1
Створюємо pool роздачи для кожної VLAN (10,20…90)
SwL3(config)#ip dhcp pool network vPool20
SwL3(config-dhcp)#address 10.0.20.0 255.255.255.0
SwL3(config-dhcp)#default-router 10.0.20.1
SwL3(config-dhcp)#dns-server 8.8.8.8
SwL3(config-dhcp)#exit
Рис. 4.26. Створення пулу роздачі для кожного VLAN
9. Налаштовання шлюзу за замовчуванням
Трафік що не призначений мережам VLAN буде передаватися на зовнішній
шлюз. Потрібно для доступу до Інтернет.
SwL3(config)#ip route 0.0.0.0 0.0.0.0 192.168.240.1
Рис. 4.27. Налаштування шлюзу за замовчуванням
71
10. Створення зворотного маршруту
Обов’язково на маршрутизаторі прописати зворотні маршрути до кожної
мережі VLAN (інакше інета не буде).
Router(config)#ip route 10.0.20.0 255.255.255.0 192.168.240.2
Router(config)#ip route 10.0.30.0 255.255.255.0 192.168.240.2
…
Рис. 4.28. Приклад налаштування зворотного маршруту на маршрутизаторі ZyXEL Keenetic
72
СПИСОК СКОРОЧЕНЬ
CERT – Computer Emergency Response Team
Ddos – Distributed Denial Of Service Attack
DMZ – Demilitary Zone
DNS – Domain Name System
Dos – Denial of service
NAT – Network Address Translation
SEI – Software Engineering Institute
SQL – Structured Query Language
SSH – Secure Shell
SSL –Secure Socket Layer
VLAN - Virtual Local Area Network
VPN – Virtual Private Network
ІСВНВ – Інформаційна система виявлення несанкціонованих впливів
ІС – Інформаційна система
ОС – Операційна система
СВА – Система виявлення атак
СУБД – Система управління базами даних
73
ВИСНОВКИ
У кваліфікаційній роботі магістра була розроблена інформаційна система
захисту від зовнішніх мережних атак. Дана система заснована на статистичному
методі виявлення атак типу «відмова в обслуговуванні», а саме:
1. Удосконалено класифікацію на основі дослідження існуючих методів та
моделей шляхом використання запропонованих ознак, що забезпечило
можливість оцінки, як самих систем безпеки та їх компонентів.
2. Удосконалено метод забезпечення безпеки групи хостів з загальним
набором вимог, що взаємодіють так, ніби вони прикріплені до одного домену,
незалежно від їх фізичного розташування шляхом оптимізації алгоритму
розподілу простору адрес, що забезпечує коректність та швидкість створення
системи;
3. Удосконалено метод контролю доступу комп’ютерів в мережу IP-MAC-
Port Binding, шляхом визначення найбільшого значення позитивної регресії при
зростаючих коефіцієнтах часових інтервалів, що забезпечить сумісність
використання отриманих технічних рішень з існуючими прототипами та їх
модифікаціями;
4. Виконано синтез алгоритму виявлення атак типу „відмова в
обслуговуванні” шляхом створення програмної моделі, що забезпечило
можливість створення та дослідження моделі системи протидії зазначеним
загрозам у реальному часі;
5. Розроблена апаратну модель захищеної мережі та проведені
експериментальні дослідження зразків можливих погроз та елементів
програмного забезпечення протидії, що дозволило підтвердити можливість
використання цих розробок у запропонованій моделі підвищення безпеки
критичної міської інфраструктури.
Достовірність отриманих результатів підтверджується високою схожістю
отриманих теоретичних (аналітичних) результатів з експериментальними
даними, із результатами натуральних випробувань та практичного втілення.
74
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Aptekorz, M. (2015). It security. Stowarzyszenie Komputer i Sprawy Szkoły
KISS.
2. Bosworth, S., Kabay, M. E., Whyne, E. (2014). Computer Security handbook.
John Wiley; Sons, Inc.
3. Cyber security 2019. (2019). 2019 International Conference on Cyber Security
and Protection of Digital Services (Cyber Security).
https://doi.org/10.1109/cybersecpods.2019.8885065
4. Cyber Security and cyber risk. (2016). Cyber Security, 11–24.
https://doi.org/10.4324/9781315575674-4
5. E-security applications. (2007). Security of e-Systems and Computer
Networks, 143–144. https://doi.org/10.1017/cbo9780511536700.010
6. Enoch, S. Y., Lee, J. S., & Kim, D. S. (2021). Novel security models,
metrics and security assessment for Maritime Vessel Networks. Computer
Networks, 189, 107934. https://doi.org/10.1016/j.comnet.2021.107934
7. Gifford, C. (2016). Computer Networks. Wayland.
8. Kaufman, C., Perlman, R., Speciner, M., & Perlner, R. (2020). Network
security. Addison-Wesley.
9. Kizza, J. M. (2017). Scripting and security in computer networks and web
browsers. Guide to Computer Network Security, 133–145.
https://doi.org/10.1007/978-3-319-55606-2_6
10. Ou, X., & Singhal, A. (2012). Quantitative security risk assessment of
enterprise networks. Springer.
11. Padallan, J. O. (2020). Cyber security. Arcler Press.
12. Pardoe, T. D., Snyder, G. F. (2005). Network security. Thomson/Delmar
Learning.
13. Security threats to computer networks. (n.d.). Computer Network Security, 77–
107. https://doi.org/10.1007/0-387-25228-2_3
14. Sutton, D. (2017). Cyber security. Bcs, The Chartered Instit.
15. Tanenbaum, A. S., Wetherall, D. (2014). Computer Networks. Pearson
Education.
16. TXOne networks: 2021 cyber security report. (2022). Computer Fraud
Security, 2022(2). https://doi.org/10.12968/s1361-3723(22)70014-0
17. United States Government Accountability Office. (2014). Information security:
75
18. Whitman, M. E., Mattord, H. J. (2022). Principles of Information Security.
Cengage.
19. Winkler, I. (2007). Information security is information security. Zen and the
Art of Information Security, 111–114. https://doi.org/10.1016/b978-
159749168-6/50012-7
20. Farberov, S. (2014). Russian hackers attacked US financial system stealing
gigabytes of data in suspected retaliation for Ukraine sanctions. Mail Online.
21. Fisher, M. (2013). Syrian hackers claim AP hack that tipped stock market by
$136 billion. Is it terrorism? The Washington Post.
22. Gallagher, S. (2013, Oct. 02). We are not who we are. Onttrek Sep. 26, 2015 uit
Security Blog: https://securityblog.redhat.com/tag/two-factor-authentication/
available under a Creative Commons Attribution-ShareAlike 3.0 Unported
License.
23. Glass, E. (2003). The NTLM Authentication Protocol and Security Support
Provider. Onttrek Sep. 26, 2015 uit Sourceforge:
http://davenport.sourceforge.net/ntlm.html available under permission by the
owner to use, copy, modify, and distribute this document for any purpose and
without any fee.
24. Gollin, G. (2003). Unconventional University Diplomas from Online Vendors:
Buying a Ph.D.University That Doesn’t Exist.
25. A. Rashid, G. Danezis, H. Chivers, E. Lupu, A. Martin, M. Lewis, and C.
Peersman, “Scoping the cyber security body of knowledge,” IEEE Security &
Privacy, vol. 16, no. 3, pp. 96–102, 2018. [Online]. Available:
https://doi.org/10.1109/MSP.2018.2701150
26. J. Hallett, R. Larson, and A. Rashid, “Mirror, mirror, on the wall: What are we
teaching them all? Characterising the focus of cybersecurity curricular
frameworks,” in 2018 USENIX Workshop on Advances in Security Education,
ASE 2018, Baltimore, MD, USA, August 13, 2018., 2018. [Online]. Available:
https://www.usenix.org/conference/ase18/presentation/hallett
27. P. Bourque, R. E. Fairley et al., Guide to the software engineering body of
knowledge (SWEBOK (R)): Version 3.0. IEEE Computer Society Press, 2014.
28. HM Government, UK, “National cyber security strategy 2016–2021,” 2016.
[Online]. Available: https://www.gov.uk/government/publications/national-
cyber-securitystrategy-2016-to-2021
76
29. ETSI/CEN/CENELEC Cybersecurity Coordination Group (CSCG) and
ENISA, “Definition of Cybersecurity gaps and overlaps in standardisation,”
ENISA, Report, Dec. 2015. [Online]. Available:
https://www.enisa.europa.eu/publications/definition-of-cybersecurity
30. ISO/IEC, “Information technology – security techniques – information security
management systems – overview and vocabulary,” ISO/IEC, – 27000:2018,
2018.
31. D. Gollmann, Computer Security, 3rd ed. Wiley, 2011.
Список використаного програмного забезпечення
1. Word 2021 © Microsoft Inc. Corporation;
2. Excel 2021 © Microsoft Inc. Corporation;
3. Windows 2021 Server © Microsoft Inc. Corporation;
4. Borland Delphi 7.0 ™
5. Firebird 1.5.2 ™
6. WinPCap 4.0 ™
7. IBExpert ™
8. Microsoft Visio Professional © Microsoft Inc. Corporation.
Додаток АПорівняння відомих типів систем виявлення вторгнень
Пошук Пошук аномалій
Характеристика
сигнатур Модель потоку Модель системи
апріорно задане,
Безліч атак, що варіативно, досить варіативно,
обмежується відомими
виявляються широко максимально широко
моделями атак
Імовірність
неправильного близька до нуля 10-2 близька до нуля
спрацьовування
Імовірність пропуску
близька до нуля 10-5 10-7
атаки
Вимоги до
обчислювальних середні низькі високі
ресурсів
Додаток А
Додаток Б Життєвий цикл типової атаки
Рекогносцировка Вторгнення в
систему
Інформаційна
система
Подальший Атакуючий вплив
розвиток атаки на систему
Додаток Б
Додаток В
Блок-схема алгоритму побудови моделі завантаженості
сервера
Початок
K=1, count A
temp:=random;
Кінець temp1:=0;
i:=1, 12
temp1:=temp1+random;
Temp <= 0.25
Temp <= 0.4 +
+ r:=((temp1-6)/6)*360+600;
r:=(360*(temp1-6)/6)+720;
r:=(780*(temp1-6)/6)+960;
Занесення в базу даних
A
Додаток Г
Функціональна модель процесу виявлення атаки
Початок
Встановлення системи
Процес сбіра інформації о
роботі мережі
Налаштування параметрів
роботи статистичного
алгоритму виявлення атак
Виявлення атак типу
«відмова в
обслуговуванні»
Корегування еталонної
моделі поведінки трафіку
Додаток Д
Варіанти інтеграції ІСВНВ в мережі передачі даних
Додаток Е
Грошовий еквівалент втрат від різних типів атак
ків
1·106 $ 2·106 $ 3·106 $ 4·106 $ 5·106 $
Додаток Ж
Т е к с т п р о г р а м и
СИСТЕМИ ВИЯВЛЕННЯ ТА ПОПЕРЕДЖЕННЯ НЕСАНКЦІОНОВАНИХ
ВТОРГНЕНЬ У КОМП’ЮТЕРНУ МЕРЕЖУ
ТЕКСТ ПРОГРАМИ
482 ЧДТУ.2300-01 22 01
Аркушів 41
Розробив Сергатий В.А.
Черкаси 2012
unit Capturing;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Snoop, Global, SnoopMemory;
type
TCapturingForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
lblEthernet: TLabel;
lblIP: TLabel;
lblARP: TLabel;
lblICMP: TLabel;
lblTCP: TLabel;
lblUDP: TLabel;
lblTCPData: TLabel;
lblUDPData: TLabel;
Bevel1: TBevel;
btnClose: TButton;
tmrView: TTimer;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnCloseClick(Sender: TObject);
procedure tmrViewTimer(Sender: TObject);
private
{ Private declarations }
EthernetCount: Integer;
IPCount: Integer;
ARPCount: Integer;
ICMPCount: Integer;
TCPCount: Integer;
UDPCount: Integer;
TCPDataCount: Integer;
UDPDataCount: Integer;
public
{ Public declarations }
procedure Initialize;
procedure View;
procedure Process(PacketHeader: PPCAP_PKTHDR; EthernetHeader: PETHERNET_HDR);
end;
var
CapturingForm: TCapturingForm;
implementation
uses Main;
{$R *.DFM}
procedure TCapturingForm.Initialize;
begin
EthernetCount := 0;
IPCount := 0;
ARPCount := 0;
ICMPCount := 0;
TCPCount := 0;
UDPCount := 0;
TCPDataCount := 0;
UDPDataCount := 0;
end;
procedure TCapturingForm.View;
begin
lblEthernet.Caption := IntToStr(EthernetCount);
lblIP.Caption := IntToStr(IPCount);
lblARP.Caption := IntToStr(ARPCount);
lblICMP.Caption := IntToStr(ICMPCount);
lblTCP.Caption := IntToStr(TCPCount);
lblUDP.Caption := IntToStr(UDPCount);
lblTCPData.Caption := IntToStr(TCPDataCount);
lblUDPData.Caption := IntToStr(UDPDataCount);
end;
procedure TCapturingForm.Process(PacketHeader: PPCAP_PKTHDR; EthernetHeader:
PETHERNET_HDR);
var
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
UDPHeader: PUDP_HDR;
begin
inc(EthernetCount);
if snoopIsIP(EthernetHeader, @IPHeader) then
begin
inc(IPCount);
if snoopIsTCP(IPHeader, @TCPHeader) then
begin
inc(TCPCount);
if snoopIsTCPData(IPHeader, TCPHeader) then
inc(TCPDataCount);
end else if snoopIsUDP(IPHeader, @UDPHeader) then
begin
inc(UDPCount);
if snoopIsUDPData(IPHeader, UDPHeader) then
inc(UDPDataCount);
end else if snoopIsICMP(IPHeader) then
inc(ICMPCount);
end else if snoopIsARP(EthernetHeader) then
begin
inc(ARPCount);
end;
end;
procedure TCapturingForm.FormShow(Sender: TObject);
begin
View;
tmrView.Enabled := true;
end;
procedure TCapturingForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
tmrView.Enabled := false;
end;
procedure TCapturingForm.btnCloseClick(Sender: TObject);
begin
MainForm.ActionClose.Execute;
end;
procedure TCapturingForm.tmrViewTimer(Sender: TObject);
begin
View;
end;
end.
unit chart_Unit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, DbChart, StdCtrls, DB,
IBCustomDataSet, IBDatabase, Series, DBCtrls;
type
Tchart_frm = class(TForm)
build: TButton;
IBDataSet1: TIBDataSet;
IBTransaction1: TIBTransaction;
IBDataSet1TIME_: TIBBCDField;
IBDataSet1COUNT: TIntegerField;
DBChart1: TDBChart;
Series1: TBarSeries;
Prot_DataSet: TIBDataSet;
ip_CheckBox: TCheckBox;
ip_DataSource1: TDataSource;
ip_DBLookupComboBox1: TDBLookupComboBox;
IP_DataSet: TIBDataSet;
IBStringField1: TIBStringField;
Prot_DataSource: TDataSource;
prot_CheckBox: TCheckBox;
prot_DBLookupComboBox2: TDBLookupComboBox;
Prot_DataSetPROT: TIntegerField;
IP_chart: TIBDataSet;
IBBCDField1: TIBBCDField;
IntegerField1: TIntegerField;
prot_chart: TIBDataSet;
IBBCDField2: TIBBCDField;
IntegerField2: TIntegerField;
ip_prot_chart: TIBDataSet;
IBBCDField3: TIBBCDField;
IntegerField3: TIntegerField;
procedure buildClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
chart_frm: Tchart_frm;
implementation
uses dm;
{$R *.dfm}
procedure Tchart_frm.buildClick(Sender: TObject);
var Interval, count : integer;
begin
if ip_CheckBox.Checked and (not(prot_CheckBox.Checked))then
begin
Series1.DataSource:=IP_chart;
IP_chart.Close;
IP_chart.ParamByName('IP').asstring:=ip_DBLookupComboBox1.Text;
IP_chart.Open;
end;
if prot_CheckBox.Checked and (not(ip_CheckBox.Checked))then
begin
Series1.DataSource:=prot_chart;
prot_chart.Close;
prot_chart.ParamByName('Prot').asstring:=prot_DBLookupComboBox2.Text;
prot_chart.Open;
end;
if prot_CheckBox.Checked and ip_CheckBox.Checked then
begin
Series1.DataSource:=ip_prot_chart;
ip_prot_chart.Close;
ip_prot_chart.ParamByName('Prot').asstring:=prot_DBLookupComboBox2.Text;
ip_prot_chart.ParamByName('IP').asstring:=ip_DBLookupComboBox1.Text;
ip_prot_chart.Open;
end;
if not(prot_CheckBox.Checked) and (not(ip_CheckBox.Checked))then
begin
Series1.DataSource:=IBDataSet1;
IBDataSet1.Close;
IBDataSet1.Open;
end;
end;
procedure Tchart_frm.FormActivate(Sender: TObject);
begin
IP_DataSet.Close;
IP_DataSet.Open;
Prot_DataSet.Close;
Prot_DataSet.Open;
end;
end.
unit Common;
interface
uses
Windows, ComCtrls, IniFiles, SysUtils, Forms, WinSock, Snoop;
const
HEADER_FIELD = 1;
ETHERNET_FIELD = 2;
IP_FIELD = 3;
ARP_FIELD = 4;
ICMP_FIELD = 5;
TCP_FIELD = 6;
UDP_FIELD = 7;
TCPDATA_FIELD = 8;
UDPDATA_FIELD = 9;
procedure AddListViewField(ListView: TListView; ListViewField: Integer; AddField: Integer);
procedure LoadListColumnWidth(Form: TForm; IniFileName: String);
procedure SaveListColumnWidth(Form: TForm; IniFileName: String);
procedure ShowColumn(ListView: TListView; StartIndex: Integer; EndIndex: Integer);
procedure HideColumn(ListView: TListView; StartIndex: Integer; EndIndex: Integer);
procedure AddPacketHeader(ListItem: TListItem; PacketHeader: PPCAP_PKTHDR);
procedure AddEthernet(ListItem: TListItem; EthernetHeader: PETHERNET_HDR);
procedure AddIP(ListItem: TListItem; IPHeader: PIP_HDR);
procedure AddARP(ListItem: TListItem; ARPHeader: PARP_HDR);
procedure AddICMP(ListItem: TListItem; ICMPHeader: PICMP_HDR);
procedure AddTCP(ListItem: TListItem; TCPHeader: PTCP_HDR);
procedure AddUDP(ListItem: TListItem; UDPHeader: PUDP_HDR);
procedure AddTCPData(ListItem: TListItem; TCPData: PChar; TCPDataLen: Integer; Offset: Integer);
procedure AddUDPData(ListItem: TListItem; UDPData: PChar; UDPDataLen: Integer; Offset: Integer);
function Rsvd_Flags2Str(Flag: UCHAR): String;
implementation
procedure AddListViewField(ListView: TListView; ListViewField: Integer; AddField: Integer);
var
ListColumn: TListColumn;
begin
case AddField of
HEADER_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Time';
ListColumn.Width := 100;
ListColumn.Tag := 100;
if (ListViewField = TCPDATA_FIELD) or (ListViewField = UDPDATA_FIELD)
then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Capture';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if (ListViewField = TCPDATA_FIELD) or (ListViewField = UDPDATA_FIELD)
then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Length';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if (ListViewField = TCPDATA_FIELD) or (ListViewField = UDPDATA_FIELD)
then
ListColumn.Width := 0;
end;
ETHERNET_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'DstMac';
ListColumn.Width := 100;
ListColumn.Tag := 100;
if ListViewField <> ETHERNET_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'SrcMac';
ListColumn.Width := 100;
ListColumn.Tag := 100;
if ListViewField <> ETHERNET_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Protocol(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> ETHERNET_FIELD then
ListColumn.Width := 0;
end;
IP_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'VerLen(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Service';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Length';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Ident';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'FlagOff(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'TimeLive';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Protocol(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Checksum(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> IP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'SrcIP';
ListColumn.Width := 100;
ListColumn.Tag := 100;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'DstIP';
ListColumn.Width := 100;
ListColumn.Tag := 100;
end;
ARP_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'HardwareType';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'ProtocolType';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'HLen';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'PLen';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Operation';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'SenderHA';
ListColumn.Width := 100;
ListColumn.Tag := 100;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'SenderIP';
ListColumn.Width := 100;
ListColumn.Tag := 100;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'TargetHA';
ListColumn.Width := 100;
ListColumn.Tag := 100;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'TargetIP';
ListColumn.Width := 100;
ListColumn.Tag := 100;
end;
ICMP_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Type';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Code';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Checksum(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Data';
ListColumn.Width := 100;
ListColumn.Tag := 100;
end;
TCP_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Src Port';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Dst Port';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Seq';
ListColumn.Width := 100;
ListColumn.Tag := 100;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Ack';
ListColumn.Width := 100;
ListColumn.Tag := 100;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Off_Rsvd(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Rsvd_Flags(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Window';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Checksum(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'UrgPoint';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> TCP_FIELD then
ListColumn.Width := 0;
end;
UDP_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Src Port';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Dst Port';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Length';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> UDP_FIELD then
ListColumn.Width := 0;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Checksum(x)';
ListColumn.Width := 50;
ListColumn.Tag := 50;
if ListViewField <> UDP_FIELD then
ListColumn.Width := 0;
end;
TCPDATA_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'TCPDataLength';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Data';
ListColumn.Width := 100;
ListColumn.Tag := 100;
end;
UDPDATA_FIELD: begin
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'UDPDataLength';
ListColumn.Width := 50;
ListColumn.Tag := 50;
ListColumn := ListView.Columns.Add;
ListColumn.Caption := 'Data';
ListColumn.Width := 50;
ListColumn.Tag := 50;
end;
end;
end;
procedure LoadListColumnWidth(Form: TForm; IniFileName: String);
var
i, j, ColumnWidth: Integer;
IniFile: TIniFile;
ListView: TListView;
ListColumn: TListColumn;
begin
IniFile := TIniFile.Create(IniFileName);
for i := 0 to Form.ComponentCount - 1 do
begin
if not (Form.Components[i] is TListView) then continue;
ListView := Form.Components[i] as TListView;
for j := 0 to ListView.Columns.Count - 1 do
begin
ColumnWidth := IniFile.ReadInteger(ListView.Name, 'Width' + IntToStr(j), -1);
if ColumnWidth <> -1 then
begin
ListColumn := ListView.Columns.Items[j];
ListColumn.Width := ColumnWidth;
end;
end;
end;
IniFile.Free;
end;
procedure SaveListColumnWidth(Form: TForm; IniFileName: String);
var
i, j, ColumnWidth: Integer;
IniFile: TIniFile;
ListView: TListView;
ListColumn: TListColumn;
begin
IniFile := TIniFile.Create(IniFileName);
try
for i := 0 to Form.ComponentCount - 1 do
begin
if not (Form.Components[i] is TListView) then continue;
ListView := Form.Components[i] as TListView;
for j := 0 to ListView.Columns.Count - 1 do
begin
ListColumn := ListView.Columns.Items[j];
ColumnWidth := ListColumn.Width;
IniFile.WriteInteger(ListView.Name, 'Width' + IntToStr(j), ColumnWidth);
end;
end;
finally
IniFile.Free;
end;
end;
procedure ShowColumn(ListView: TListView; StartIndex: Integer; EndIndex: Integer);
var
i: Integer;
ListColumn: TListColumn;
begin
for i := StartIndex to EndIndex do
begin
ListColumn := ListView.Columns.Items[i];
ListColumn.Width := ListColumn.Tag;
end;
end;
procedure HideColumn(ListView: TListView; StartIndex: Integer; EndIndex: Integer);
var
i: Integer;
ListColumn: TListColumn;
begin
for i := StartIndex to EndIndex do
begin
ListColumn := ListView.Columns.Items[i];
ListColumn.Tag := ListColumn.Width;
ListColumn.Width := 0;
end;
end;
procedure AddPacketHeader(ListItem: TListItem; PacketHeader: PPCAP_PKTHDR);
var
Hour: LongWord;
Min: LongWord;
Sec: LongWord;
TimeStr: String;
begin
Sec := PacketHeader.ts.tv_sec;
Sec := Sec mod 86400; // Remove day
Hour := Sec div 3600;
Sec := Sec mod 3600;
Min := Sec div 60;
Sec := Sec mod 60;
TimeStr := TimeStr + Format('%2d:%2d:%2d:%6d', [Hour, Min, Sec, PacketHeader.ts.tv_usec]);
ListItem.Caption := TimeStr;
ListItem.SubItems.Add(IntToStr(PacketHeader.caplen));
ListItem.SubItems.Add(IntToStr(PacketHeader.len));
end;
procedure AddEthernet(ListItem: TListItem; EthernetHeader: PETHERNET_HDR);
begin
ListItem.SubItems.Add(snoopMac2Str(EthernetHeader^.Destination));
ListItem.SubItems.Add(snoopMac2Str(EthernetHeader^.Source));
ListItem.SubItems.Add(IntToHex(ntohs(EthernetHeader^.Protocol), 4));
end;
procedure AddIP(ListItem: TListItem; IPHeader: PIP_HDR);
begin
ListItem.SubItems.Add(IntToHex(SmallInt(IPHeader.Verlen), 2));
ListItem.SubItems.Add(IntToStr(IPHeader.Service));
ListItem.SubItems.Add(IntToStr(ntohs(IPHeader.Length)));
ListItem.SubItems.Add(IntToStr(ntohs(IPHeader.Ident)));
ListItem.SubItems.Add(IntToHex(ntohs(IPHeader.FlagOff), 2));
ListItem.SubItems.Add(IntToStr(IPHeader.TimeLive));
ListItem.SubItems.Add(IntToHex(IPHeader.Protocol, 2));
ListItem.SubItems.Add(IntToHex(ntohs(IPHeader.Checksum), 4));
ListItem.SubItems.Add(snoopIP2Str(ntohl(IPHeader.Source)));
ListItem.SubItems.Add(snoopIP2Str(ntohl(IPHeader.Destination)));
end;
procedure AddARP(ListItem: TListItem; ARPHeader: PARP_HDR);
begin
ListItem.SubItems.Add(IntToStr(ntohs(ARPHeader.HardwareType)));
ListItem.SubItems.Add(IntToStr(ntohs(ARPHeader.ProtocolType)));
ListItem.SubItems.Add(IntToStr(ARPHeader.HLen));
ListItem.SubItems.Add(IntToStr(ARPHeader.PLen));
ListItem.SubItems.Add(IntToStr(ntohs(ARPHeader.Operation)));
ListItem.SubItems.Add(snoopMac2Str(ARPHeader.SenderHA));
ListItem.SubItems.Add(snoopIP2Str(ntohl(ARPHeader.SenderIP)));
ListItem.SubItems.Add(snoopMac2Str(ARPHeader.TargetHA));
ListItem.SubItems.Add(snoopIP2Str(ntohl(ARPHeader.TargetIP)));
end;
procedure AddICMP(ListItem: TListItem; ICMPHeader: PICMP_HDR);
begin
ListItem.SubItems.Add(IntToStr(ICMPHeader.Type_));
ListItem.SubItems.Add(IntToStr(ICMPHeader.Code));
ListItem.SubItems.Add(IntToHex(ntohs(ICMPHeader^.Checksum), 4));
end;
procedure AddTCP(ListItem: TListItem; TCPHeader: PTCP_HDR);
begin
ListItem.SubItems.Add(IntToStr(ntohs(TCPHeader.Source)));
ListItem.SubItems.Add(IntToStr(ntohs(TCPHeader.Destination)));
ListItem.SubItems.Add(IntToStr(DWORD(ntohl(TCPHeader.Seq))));
ListItem.SubItems.Add(IntToStr(DWORD(ntohl(TCPHeader.Ack))));
ListItem.SubItems.Add(IntToHex(TCPHeader.Off_Rsvd, 2));
ListItem.SubItems.Add(IntToHex(TCPHeader.Rsvd_Flags, 2) +
Rsvd_Flags2Str(TCPHeader.Rsvd_Flags));
ListItem.SubItems.Add(IntToStr(ntohs(TCPHeader.Window)));
ListItem.SubItems.Add(IntToHex(ntohs(TCPHeader.Checksum), 4));
ListItem.SubItems.Add(IntToStr(ntohs(TCPHeader.UrgPoint)));
end;
procedure AddUDP(ListItem: TListItem; UDPHeader: PUDP_HDR);
begin
ListItem.SubItems.Add(IntToStr(ntohs(UDPHeader.Source)));
ListItem.SubItems.Add(IntToStr(ntohs(UDPHeader.Destination)));
ListItem.SubItems.Add(IntToStr(ntohs(UDPHeader.Length)));
ListItem.SubItems.Add(IntToHex(ntohs(UDPHeader.Checksum), 4));
end;
procedure AddTCPData(ListItem: TListItem; TCPData: PChar; TCPDataLen: Integer; Offset: Integer);
var
s: String;
begin
ListItem.SubItems.Add(IntToStr(TCPDataLen));
if TCPDataLen >= Offset then
begin
SetLength(s, TCPDataLen - Offset);
StrMove(PChar(s), TCPData + Offset, TCPDataLen - Offset);
ListItem.SubItems.Add(s);
end;
end;
procedure AddUDPData(ListItem: TListItem; UDPData: PChar; UDPDataLen: Integer; Offset: Integer);
var
s: String;
begin
ListItem.SubItems.Add(IntToStr(UDPDataLen));
if UDPDataLen >= Offset then
begin
SetLength(s, UDPDataLen - Offset);
StrMove(PChar(s), UDPData + Offset, UDPDataLen - Offset);
ListItem.SubItems.Add(s);
end;
end;
function Rsvd_Flags2Str(Flag: UCHAR): String;
begin
Result := '';
if (Flag and $20) <> 0 then Result := Result + ' URG';
if (Flag and $10) <> 0 then Result := Result + ' ACK';
if (Flag and $08) <> 0 then Result := Result + ' PSH';
if (Flag and $04) <> 0 then Result := Result + ' RST';
if (Flag and $02) <> 0 then Result := Result + ' SYN';
if (Flag and $01) <> 0 then Result := Result + ' FIN';
end;
end.
unit dm;
interface
uses
SysUtils, Classes, DB, IBDatabase;
type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{$R *.dfm}
end.
unit generation_mode;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, IBDatabase, DB, IBCustomDataSet,
IBQuery, Grids, DBGrids;
type
TGen_mode_frm = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Panel2: TPanel;
BitBtn1: TBitBtn;
DBGrid1: TDBGrid;
gen_DataSource: TDataSource;
insert_IP: TIBQuery;
gen_IBTransaction: TIBTransaction;
gen_DataSet: TIBDataSet;
Count_protokol: TLabel;
Label1: TLabel;
protokol_Edit: TEdit;
IP_Edit: TEdit;
read_Transaction: TIBTransaction;
gen_DataSetID: TIntegerField;
gen_DataSetSRCIP: TIBStringField;
gen_DataSetDSTIP: TIBStringField;
gen_DataSetLENGTH_: TIntegerField;
gen_DataSetTIME_: TIBBCDField;
gen_DataSetPROT: TIntegerField;
dell_IBQuery: TIBQuery;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Gen_mode_frm: TGen_mode_frm;
implementation
uses dm, Math, chart_Unit;
{$R *.dfm}
procedure TGen_mode_frm.Button1Click(Sender: TObject);
var
r, temp1, temp2 : real;
i,k, count: integer;
begin
dell_IBQuery.Close;
dell_IBQuery.Open;
randomize;
count:=strtoint(inputbox('Input generation count','Count','1000'));
for k:=1 to round(0.9*count/2) do
begin
temp1:=0;
temp2:=0;
for i:=1 to 12 do
begin
temp1:=temp1+random;
temp2:=temp2+random;
end;
r:=((temp1-6)/6)*10+10;
insert_IP.Close;
insert_IP.ParamByName('srcip').asinteger:=random(strtoint(IP_Edit.Text));
insert_IP.ParamByName('prot').asinteger:=random(strtoint(protokol_Edit.Text));
insert_IP.ParamByName('time_').AsFloat:=round(r*10);
insert_ip.Open;
r:=(10*(temp2-6)/6)+16;
insert_IP.Close;
insert_IP.ParamByName('srcip').asinteger:=random(strtoint(IP_Edit.Text));
insert_IP.ParamByName('prot').asinteger:=random(strtoint(protokol_Edit.Text));
insert_IP.ParamByName('time_').AsFloat:=round(r*10);
insert_ip.Open;
end;
for k:=1 to round(0.1*count) do
begin
temp1:=0;
for i:=1 to 12 do
begin
temp1:=temp1+random;
end;
r:=(6*(temp1-6)/6)+13;
insert_IP.Close;
insert_IP.ParamByName('srcip').asinteger:=random(strtoint(IP_Edit.Text));
insert_IP.ParamByName('prot').asinteger:=random(strtoint(protokol_Edit.Text));
insert_IP.ParamByName('time_').AsFloat:=round(r*10);
insert_ip.Open;
end;
if gen_IBTransaction.InTransaction then gen_IBTransaction.Commit;
gen_DataSet.Active:=true;
gen_DataSet.Close;
gen_DataSet.Open;
{our time}
end;
procedure TGen_mode_frm.Button2Click(Sender: TObject);
begin
chart_frm.ShowModal;
end;
end.
unit Global;
interface
uses
SysUtils, Forms, Classes, IniFiles, Snoop;
type
TGlobal = class
IniFileName: String;
// Coordination
WindowState: Integer;
Left: Integer;
Top: Integer;
Width: Integer;
Height: Integer;
ListViewHeight: Integer;
ActiveListViewIndex: Integer;
// OpenType
OpenType: Integer;
// Adapter Capture
AdapterIndex: Integer;
// Remote Capture
Host: String;
UserName: String;
Password: String;
DontShowJustOne: Boolean;
// File Capture
FileName: String;
// Snoop Property
Filter: String;
ReadTimeOut: Integer;
SnapLen: Integer;
ThreadSafe: Boolean;
// ViewHexa;
ViewHexa: Boolean;
// FilterList
FilterList: TStringList;
// Option
TCPDataOffset: Integer;
UDPDataOffset: Integer;
constructor Create;
destructor Destroy; override;
procedure Load;
procedure Save;
end;
var
_Global: TGlobal;
implementation
constructor TGlobal.Create;
begin
FilterList := TStringList.Create;
IniFileName := ExtractFilePath(Application.ExeName) + 'Expert.ini';
Load;
end;
destructor TGlobal.Destroy;
begin
Save;
if FilterList <> nil then
begin
FilterList.Free;
FilterList := nil;
end;
end;
procedure TGlobal.Load;
var
IniFile: TIniFile;
begin
IniFile := TIniFile.Create(IniFileName);
// Coordination
WindowState := IniFile.ReadInteger('Coordination', 'WindowState', Integer(wsNormal));
if WindowState = Integer(wsMaximized) then
begin
Left := 50;
Top := 50;
Width := Screen.Width - 100;
Height := Screen.Height - 100;
end else
begin
Left := IniFile.ReadInteger('Coordination', 'Left', 50);
Top := IniFile.ReadInteger('Coordination', 'Top', 50);
Width := IniFile.ReadInteger('Coordination', 'Width', Screen.Width - 100);
Height := IniFile.ReadInteger('Coordination', 'Height', Screen.Height - 100);
end;
ListViewHeight := IniFile.ReadInteger('Coordination', 'ListViewHeight', 300);
ActiveListViewIndex := IniFile.ReadInteger('Coordination', 'ActiveListViewIndex', 0);
// Open Type
OpenType := IniFile.ReadInteger('Option', 'OpenType', 0);
// Adapter Capture
AdapterIndex := IniFile.ReadInteger('AdapterCapture', 'AdapterIndex', -1);
// Remote Capture
Host := IniFile.ReadString('RemoteCapture', 'Host', '');
UserName := IniFile.ReadString('RemoteCapture', 'UserName', '');
Password := IniFile.ReadString('RemoteCapture', 'Password', '');
DontShowJustOne := IniFile.ReadBool('RemoteCapture', 'DontShowJustOne', false);
// File Capture
FileName := IniFile.ReadString('FileCapture', 'FileName', '');
// Snoop Property
Filter := IniFile.ReadString('Snoop', 'Filter', '');
ReadTimeOut := IniFile.ReadInteger('Snoop', 'ReadTimeOut', 100);
SnapLen := IniFile.ReadInteger('Snoop', 'SnapLen', SNOOP_DEFAULT_SNAPLEN);
ThreadSafe := IniFile.ReadBool('Snoop', 'ThreadSafe', true);
// ViewHexa;
ViewHexa := IniFile.ReadBool('Option', 'ViewHexa', false);
// FilterList
FilterList.CommaText := IniFile.ReadString('Option', 'FilterList', '');
// Option
TCPDataOffset := IniFile.ReadInteger('Option', 'TCPDataOffset', 0);
UDPDataOffset := IniFile.ReadInteger('Option', 'UDPDataOffset', 0);
IniFile.Free;
end;
procedure TGlobal.Save;
var
IniFile: TIniFile;
begin
IniFile := TIniFile.Create(IniFileName);
try
// Coordination
IniFile.WriteInteger('Coordination', 'WindowState', WindowState);
IniFile.WriteInteger('Coordination', 'Left', Left);
IniFile.WriteInteger('Coordination', 'Top', Top);
IniFile.WriteInteger('Coordination', 'Width', Width);
IniFile.WriteInteger('Coordination', 'Height', Height);
IniFile.WriteInteger('Coordination', 'ListViewHeight', ListViewHeight);
IniFile.WriteInteger('Coordination', 'ActiveListViewIndex', ActiveListViewIndex);
// Open Type
IniFile.WriteInteger('Option', 'OpenType', OpenType);
// Adapter Capture
IniFile.WriteInteger('AdapterCapture', 'AdapterIndex', AdapterIndex);
// Remote Capture
IniFile.WriteString('RemoteCapture', 'Host', Host);
IniFile.WriteString('RemoteCapture', 'UserName', UserName);
IniFile.WriteString('RemoteCapture', 'Password', Password);
IniFile.WriteBool('RemoteCapture', 'DontShowJustOne', DontShowJustOne);
// File Capture
IniFile.WriteString('FileCapture', 'FileName', FileName);
// Snoop Property
IniFile.WriteString('Snoop', 'Filter', Filter);
IniFile.WriteInteger('Snoop', 'ReadTimeOut', ReadTimeOut);
IniFile.WriteInteger('Snoop', 'SnapLen', SnapLen);
IniFile.WriteBool('Snoop', 'ThreadSafe', ThreadSafe);
// ViewHexa
IniFile.WriteBool('Option', 'ViewHexa', ViewHexa);
// FilterList
IniFile.WriteString('Option', 'FilterList', FilterList.CommaText);
// Option
IniFile.WriteInteger('Option', 'TCPDataOffset', TCPDataOffset);
IniFile.WriteInteger('Option', 'UDPDataOffset', UDPDataOffset);
finally
IniFile.Free;
end;
end;
end.
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, ActnList, ComCtrls, ToolWin, IniFiles, ShellAPI,
Common, ImgList, WinSock, Snoop, SnoopMemory, Global, SnoopTrace, DB,
IBCustomDataSet, IBQuery;
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
miSave: TMenuItem;
miSaveAs: TMenuItem;
N1: TMenuItem;
miExit: TMenuItem;
Panel1: TPanel;
Edit: TMenuItem;
miOpen: TMenuItem;
miClose: TMenuItem;
Help1: TMenuItem;
miAbout: TMenuItem;
miHomePage: TMenuItem;
ActionList1: TActionList;
ActionSave: TAction;
ActionSaveAs: TAction;
ActionExit: TAction;
ActionOpen: TAction;
ActionClose: TAction;
ActionAbout: TAction;
ActionHomePage: TAction;
ToolBar1: TToolBar;
tbOpen: TToolButton;
tbClose: TToolButton;
tbClear: TToolButton;
View1: TMenuItem;
ActionOption: TAction;
miOption: TMenuItem;
ImageList1: TImageList;
ActionClear: TAction;
pcView: TPageControl;
tsEthernet: TTabSheet;
tsIP: TTabSheet;
tsARP: TTabSheet;
tsICMP: TTabSheet;
lvEthernet: TListView;
tsTCP: TTabSheet;
tsTCPData: TTabSheet;
tsUDPData: TTabSheet;
tsUDP: TTabSheet;
lvIP: TListView;
lvARP: TListView;
lvICMP: TListView;
lvTCP: TListView;
lvUDP: TListView;
lvTCPData: TListView;
lvUDPData: TListView;
StatusBar1: TStatusBar;
ActionOpenFile: TAction;
miOpenFile: TMenuItem;
pmPacketField: TPopupMenu;
miPacketField: TMenuItem;
ActionPacketField: TAction;
chkViewHexa: TCheckBox;
PacketField1: TMenuItem;
odFile: TOpenDialog;
sdFile: TSaveDialog;
tmrView: TTimer;
Panel2: TPanel;
Label1: TLabel;
lblEthernet: TLabel;
Label2: TLabel;
lblIP: TLabel;
Label3: TLabel;
lblARP: TLabel;
Label4: TLabel;
lblICMP: TLabel;
Label5: TLabel;
lblTCP: TLabel;
Label6: TLabel;
lblUDP: TLabel;
Label7: TLabel;
lblTCPData: TLabel;
Label8: TLabel;
lblUDPData: TLabel;
Splitter1: TSplitter;
insert_IP: TIBQuery;
Changemode1: TMenuItem;
Snoop1: TSnoop;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ActionOpenExecute(Sender: TObject);
procedure ActionCloseExecute(Sender: TObject);
procedure ActionClearExecute(Sender: TObject);
procedure ActionOptionExecute(Sender: TObject);
procedure ActionOpenFileExecute(Sender: TObject);
procedure ActionSaveExecute(Sender: TObject);
procedure ActionSaveAsExecute(Sender: TObject);
procedure ActionExitExecute(Sender: TObject);
procedure ActionAboutExecute(Sender: TObject);
procedure ActionHomePageExecute(Sender: TObject);
procedure Snoop1GetRemoteAdapterInfo(Sender: TObject; AdapterNames,
AdapterDescriptions: TStringList; var AdapterIndex: Integer);
procedure pcViewChange(Sender: TObject);
procedure ActionPacketFieldExecute(Sender: TObject);
procedure lvDataChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure chkViewHexaClick(Sender: TObject);
procedure Snoop1Capture(Sender: TObject; PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR);
procedure lvEthernetData(Sender: TObject; Item: TListItem);
procedure lvIPData(Sender: TObject; Item: TListItem);
procedure lvARPData(Sender: TObject; Item: TListItem);
procedure lvICMPData(Sender: TObject; Item: TListItem);
procedure lvTCPData1(Sender: TObject; Item: TListItem);
procedure lvUDPData1(Sender: TObject; Item: TListItem);
procedure lvTCPDataData(Sender: TObject; Item: TListItem);
procedure lvUDPDataData(Sender: TObject; Item: TListItem);
procedure tmrViewTimer(Sender: TObject);
procedure Changemode1Click(Sender: TObject);
private
EthernetCount: Integer;
IPCount: Integer;
ARPCount: Integer;
ICMPCount: Integer;
TCPCount: Integer;
UDPCount: Integer;
TCPDataCount: Integer;
UDPDataCount: Integer;
ActiveListViewIndex: Integer;
function GetActiveListView: TListView;
function GetActiveList: TList;
protected
// for Capture Memory Management;
SnoopMemory: TSnoopMemory;
EthernetList: TList;
IPList: TList;
ARPList: TList;
ICMPList: TList;
TCPList: TList;
UDPList: TList;
TCPDataList: TList;
UDPDataList: TList;
procedure CreateAllList;
procedure ClearAllList;
procedure FreeAllList;
procedure SynchronizeListWithListView;
protected
// for File Save
SnoopDump: TSnoopDump;
ExistingFileName: String;
NewFileName: String;
IsNeedToSave: Boolean;
procedure ProcessTempFile;
protected
// for View Data in mmData.
LastListItem: TListItem;
class function IsNormalChar(ch: Char): Boolean;
procedure ViewData;
{ Public declarations }
public
procedure LoadControl;
procedure SaveControl;
procedure SetControl;
procedure InitializeListView;
procedure ViewPacket;
procedure Initialize;
procedure View;
procedure Process(PacketHeader: PPCAP_PKTHDR; EthernetHeader: PETHERNET_HDR);
end;
var
MainForm: TMainForm;
implementation
uses Option, RemoteAdapter, Open, About, PacketField, Capturing, dm,
generation_mode ;
{$R *.DFM}
procedure TMainForm.Initialize;
begin
EthernetCount := 0;
IPCount := 0;
ARPCount := 0;
ICMPCount := 0;
TCPCount := 0;
UDPCount := 0;
TCPDataCount := 0;
UDPDataCount := 0;
View;
tmrView.Enabled := true;
end;
procedure TMainForm.View;
begin
lblEthernet.Caption := IntToStr(EthernetCount);
lblIP.Caption := IntToStr(IPCount);
lblARP.Caption := IntToStr(ARPCount);
lblICMP.Caption := IntToStr(ICMPCount);
lblTCP.Caption := IntToStr(TCPCount);
lblUDP.Caption := IntToStr(UDPCount);
lblTCPData.Caption := IntToStr(TCPDataCount);
lblUDPData.Caption := IntToStr(UDPDataCount);
end;
procedure TMainForm.Process(PacketHeader: PPCAP_PKTHDR; EthernetHeader: PETHERNET_HDR);
var
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
UDPHeader: PUDP_HDR;
begin
inc(EthernetCount);
if snoopIsIP(EthernetHeader, @IPHeader) then
begin
inc(IPCount);
if snoopIsTCP(IPHeader, @TCPHeader) then
begin
inc(TCPCount);
if snoopIsTCPData(IPHeader, TCPHeader) then
inc(TCPDataCount);
end else if snoopIsUDP(IPHeader, @UDPHeader) then
begin
inc(UDPCount);
if snoopIsUDPData(IPHeader, UDPHeader) then
inc(UDPDataCount);
end else if snoopIsICMP(IPHeader) then
inc(ICMPCount);
end else if snoopIsARP(EthernetHeader) then
begin
inc(ARPCount);
end;
end;
procedure TMainForm.tmrViewTimer(Sender: TObject);
begin
View;
ActiveListViewIndex := pcView.ActivePageIndex;
SynchronizeListWithListView;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
InitializeListView;
SnoopMemory := nil;
CreateAllList;
SnoopDump := nil;
ExistingFileName := '';
NewFileName := '';
IsNeedToSave := false;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
Common.LoadListColumnWidth(Self, _Global.IniFileName);
LoadControl;
SetControl;
LastListItem := nil;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ActionClose.Execute;
SaveControl;
Common.SaveListColumnWidth(Self, _Global.IniFileName);
if SnoopMemory <> nil then
begin
SnoopMemory.Free;
SnoopMemory := nil;
end;
FreeAllList;
if SnoopDump <> nil then
begin
SnoopDump.Free;
SnoopDump := nil;
end;
ProcessTempFile;
end;
function TMainForm.GetActiveListView: TListView;
begin
Result := nil;
case ActiveListViewIndex of
0: Result := lvEthernet;
1: Result := lvIP;
2: Result := lvARP;
3: Result := lvICMP;
4: Result := lvTCP;
5: Result := lvUDP;
6: Result := lvTCPData;
7: Result := lvUDPData;
end;
end;
function TMainForm.GetActiveList: TList;
begin
Result := nil;
case ActiveListViewIndex of
0: Result := EthernetList;
1: Result := IPList;
2: Result := ARPList;
3: Result := ICMPList;
4: Result := TCPList;
5: Result := UDPList;
6: Result := TCPDataList;
7: Result := UDPDataList;
end;
end;
procedure TMainForm.CreateAllList;
begin
if EthernetList = nil then EthernetList := TList.Create;
if IPList = nil then IPList := TList.Create;
if ARPList = nil then ARPList := TList.Create;
if ICMPList = nil then ICMPList := TList.Create;
if TCPList = nil then TCPList := TList.Create;
if UDPList = nil then UDPList := TList.Create;
if TCPDataList = nil then TCPDataList := TList.Create;
if UDPDataList = nil then UDPDataList := TList.Create;
end;
procedure TMainForm.ClearAllList;
begin
EthernetList.Clear;
IPList.Clear;
ARPList.Clear;
ICMPList.Clear;
TCPList.Clear;
UDPList.Clear;
TCPDataList.Clear;
UDPDataList.Clear;
end;
procedure TMainForm.FreeAllList;
begin
if EthernetList <> nil then
begin
EthernetList.Free;
EthernetList := nil;
end;
if IPList <> nil then
begin
IPList.Free;
IPList := nil;
end;
if ARPList <> nil then
begin
ARPList.Free;
ARPList := nil;
end;
if ICMPList <> nil then
begin
ICMPList.Free;
ICMPList := nil;
end;
if TCPList <> nil then
begin
TCPList.Free;
TCPList := nil;
end;
if UDPList <> nil then
begin
UDPList.Free;
UDPList := nil;
end;
if TCPDataList <> nil then
begin
TCPDataList.Free;
TCPDataList := nil;
end;
if UDPDataList <> nil then
begin
UDPDataList.Free;
UDPDataList := nil;
end;
end;
procedure TMainForm.SynchronizeListWithListView;
begin
lvEthernet.Items.Count := EthernetList.Count;
lvIP.Items.Count := IPList.Count;
lvARP.Items.Count := ARPList.Count;
lvICMP.Items.Count := ICMPList.Count;
lvTCP.Items.Count := TCPList.Count;
lvUDP.Items.Count := UDPList.Count;
lvTCPData.Items.Count := TCPDataList.Count;
lvUDPData.Items.Count := UDPDataList.Count;
end;
procedure TMainForm.ProcessTempFile;
begin
if ExtractFileExt(ExistingFileName) = '.$$$' then
if FileExists(ExistingFileName) then
DeleteFile(ExistingFileName);
end;
class function TMainForm.IsNormalChar(ch: Char): Boolean;
begin
Result := true;
if (Ord(ch) < 31) or (Ord(ch) >= 128) then Result := false;
end;
procedure TMainForm.ViewData;
var
ListView: TListView;
List: TList;
ListItem: TListItem;
i: Integer;
Node: PSnoopMemoryNode;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
UDPHeader: PUDP_HDR;
Data: PChar;
Length: Integer;
s: String;
begin
ListView := GetActiveListView;
if ListView = nil then exit;
List := GetActiveList;
if List = nil then exit;
ListItem := ListView.Selected;
if ListItem = nil then exit;
i := ListItem.Index;
Data := nil;
Length := 0;
Node := PSnoopMemoryNode(List.Items[i]);
EthernetHeader := @Node^.Data[0];
if (List = TCPList) or (List = TCPDataList) then
begin
snoopIsIP(EthernetHeader, @IPHeader);
snoopIsTCP(IPHeader, @TCPHeader);
snoopIsTCPData(IPHeader, TCPHeader, @Data, @Length);
inc(Data, _Global.TCPDataOffset);
dec(Length, _Global.TCPDataOffset);
end else
if (List = UDPList) or (List = UDPDataList) then
begin
snoopIsIP(EthernetHeader, @IPHeader);
snoopIsUDP(IPHeader, @UDPHeader);
snoopIsUDPData(IPHeader, UDPHeader, @Data, @Length);
inc(Data, _Global.UDPDataOffset);
dec(Length, _Global.UDPDataOffset);
end;
{ if (Data = nil) or (Length <= 0) then
begin
mmData.Lines.Clear;
exit;
end;
if not chkViewHexa.Checked then
begin
SetLength(s, Length);
StrMove(PChar(s), Data, Length);
mmData.Lines.Text := s;
end else
ViewHexa(Data, Length);
LastListItem := ListItem; }
end;
procedure TMainForm.LoadControl;
begin
_Global.Load;
// Coordination
Left := _Global.Left;
Top := _Global.Top;
Width := _Global.Width;
Height := _Global.Height;
WindowState := TWindowState(_Global.WindowState);
pcView.Height := _Global.ListViewHeight;
// ViewHexa
chkViewHexa.Checked := _Global.ViewHexa;
// ListView
ActiveListViewIndex := _Global.ActiveListViewIndex;
pcView.ActivePageIndex := ActiveListViewIndex;
end;
procedure TMainForm.SaveControl;
begin
// Coordination
_Global.Left := Left;
_Global.Top := Top;
_Global.Width := Width;
_Global.Height := Height;
_Global.WindowState := Integer(WindowState);
_Global.ListViewHeight := pcView.Height;
_Global.ActiveListViewIndex := pcView.ActivePageIndex;
// ViewHexa
_Global.ViewHexa := chkViewHexa.Checked;
_Global.Save;
end;
procedure TMainForm.SetControl;
var
Active: Boolean;
begin
Active := Snoop1.Active;
ActionOpen.Enabled := not Active;
ActionClose.Enabled := Active;
ActionClear.Enabled := true;
ActionOption.Enabled := not Active;
ActionOpen.Enabled := not Active;
ActionOpen.Enabled := not Active;
ActionOpenFile.Enabled := not Active;
ActionSave.Enabled := not Active and IsNeedToSave;
ActionSaveAs.Enabled := not Active;
ActionExit.Enabled := not Active;
ActionAbout.Enabled := true;
ActionHomePage.Enabled := true;
ActionPacketField.Enabled := true;
end;
procedure TMainForm.InitializeListView;
var
i: Integer;
ListView: TListView;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TListView then
begin
ListView := Components[i] as TListView;
ListView.RowSelect := true;
ListView.ViewStyle := vsReport;
ListView.Align := alClient;
ListView.OwnerData := true;
end;
end;
// Ethernet
Common.AddListViewField(lvEthernet, ETHERNET_FIELD, HEADER_FIELD);
Common.AddListViewField(lvEthernet, ETHERNET_FIELD, ETHERNET_FIELD);
// IP
Common.AddListViewField(lvIP, IP_FIELD, HEADER_FIELD);
Common.AddListViewField(lvIP, IP_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvIP, IP_FIELD, IP_FIELD);
// ARP
Common.AddListViewField(lvARP, ARP_FIELD, HEADER_FIELD);
Common.AddListViewField(lvARP, ARP_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvARP, ARP_FIELD, ARP_FIELD);
// ICMP
Common.AddListViewField(lvICMP, ICMP_FIELD, HEADER_FIELD);
Common.AddListViewField(lvICMP, ICMP_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvICMP, ICMP_FIELD, IP_FIELD);
Common.AddListViewField(lvICMP, ICMP_FIELD, ICMP_FIELD);
// TCP
Common.AddListViewField(lvTCP, TCP_FIELD, HEADER_FIELD);
Common.AddListViewField(lvTCP, TCP_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvTCP, TCP_FIELD, IP_FIELD);
Common.AddListViewField(lvTCP, TCP_FIELD, TCP_FIELD);
Common.AddListViewField(lvTCP, TCP_FIELD, TCPDATA_FIELD);
// UDP
Common.AddListViewField(lvUDP, UDP_FIELD, HEADER_FIELD);
Common.AddListViewField(lvUDP, UDP_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvUDP, UDP_FIELD, IP_FIELD);
Common.AddListViewField(lvUDP, UDP_FIELD, UDP_FIELD);
Common.AddListViewField(lvUDP, UDP_FIELD, UDPDATA_FIELD);
// TCPData
Common.AddListViewField(lvTCPData, TCPDATA_FIELD, HEADER_FIELD);
Common.AddListViewField(lvTCPData, TCPDATA_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvTCPData, TCPDATA_FIELD, IP_FIELD);
Common.AddListViewField(lvTCPData, TCPDATA_FIELD, TCP_FIELD);
Common.AddListViewField(lvTCPData, TCPDATA_FIELD, TCPDATA_FIELD);
// UDPData
Common.AddListViewField(lvUDPData, UDPDATA_FIELD, HEADER_FIELD);
Common.AddListViewField(lvUDPData, UDPDATA_FIELD, ETHERNET_FIELD);
Common.AddListViewField(lvUDPData, UDPDATA_FIELD, IP_FIELD);
Common.AddListViewField(lvUDPData, UDPDATA_FIELD, UDP_FIELD);
Common.AddListViewField(lvUDPData, UDPDATA_FIELD, UDPDATA_FIELD);
end;
procedure TMainForm.ViewPacket;
var
ListView: TListView;
List: TList;
begin
ListView := GetActiveListView;
List := GetActiveList;
if ListView.Items.Count <> List.Count then
ListView.Items.Count := List.Count;
end;
procedure TMainForm.ActionOpenExecute(Sender: TObject);
var
FileSucceed: Boolean;
begin
if OpenForm = nil then
OpenForm := TOpenForm.Create(Application);
OpenForm.ShowModal;
if OpenForm.ModalResult <> mrOk then exit;
Snoop1.Filter := _Global.Filter;
Snoop1.ReadTimeOut := _Global.ReadTimeOut;
Snoop1.SnapLen := _Global.SnapLen;
Snoop1.ThreadSafe := _Global.ThreadSafe;
if SnoopMemory = nil then SnoopMemory := TSnoopMemory.Create;
ActionClear.Execute;
begin
if _Global.OpenType = 0 then // Adapter Capture
begin
Snoop1.AdapterIndex := _Global.AdapterIndex;
Snoop1.Open;
end else // Remote Capture
Snoop1.Open(_Global.Host, _Global.UserName, _Global.Password);
if Snoop1.Active then
begin
Initialize;
if SnoopDump = nil then
SnoopDump := TSnoopDump.Create(nil);
SnoopDump.Close;
ExistingFileName := ExtractFilePath(Application.ExeName) + 'temp.$$$';
NewFileName := '';
SnoopDump.Open(Snoop1.Pcap, ExistingFileName);
if not SnoopDump.Active then
begin
Application.MessageBox(PChar(Snoop1.Error), 'Error',
MB_ICONERROR);
exit;
end;
end else // if fail to open
begin
Application.MessageBox(PChar(Snoop1.Error), 'Error', MB_ICONERROR);
end;
end;
StatusBar1.Panels[0].Text := Snoop1.SourceName;
SetControl;
end;
procedure TMainForm.ActionCloseExecute(Sender: TObject);
begin
Snoop1.Close;
if not _Global.ThreadSafe then
SynchronizeListWithListView;
SetControl;
end;
procedure TMainForm.ActionClearExecute(Sender: TObject);
var
ListView: TListView;
begin
SnoopMemory.Clear;
ClearAllList;
Initialize;
View;
SynchronizeListWithListView;
ListView := GetActiveListView;
if ListView = nil then exit;
ListView.Items.BeginUpdate;
ListView.Items.EndUpdate;
end;
procedure TMainForm.ActionOptionExecute(Sender: TObject);
begin
if OptionForm = nil then
OptionForm := TOptionForm.Create(Application);
OptionForm.ShowModal;
lvTCPData.Repaint; // Apply changed TCPData Offset
lvUDPData.Repaint; // Apply changed UDPData Offset
end;
procedure TMainForm.ActionOpenFileExecute(Sender: TObject);
begin
if odFile.Execute then
begin
_Global.FileName := odFile.FileName;
_Global.OpenType := 2; // File Capture
_Global.Save;
ActionOpen.Execute;
end;
end;
procedure TMainForm.ActionSaveExecute(Sender: TObject);
var
_SnoopMemory: TSnoopMemory;
Node: PSnoopMemoryNode;
Succeed: Boolean;
begin
if NewFileName = '' then
begin
if not sdFile.Execute then exit;
NewFileName := sdFile.FileName;
end;
if SnoopDump.Active then // if need to save
begin
_SnoopMemory := TSnoopMemory.Create;
_SnoopMemory.Assign(SnoopMemory);
Node := _SnoopMemory.HeaderNode;
while Node <> nil do
begin
SnoopDump.Write(@Node^.PacketHeader, Node^.Data);
Node := _SnoopMemory.GetNext(Node);
end;
SnoopDump.Close;
_SnoopMemory.Free;
end;
if ExtractFileExt(ExistingFileName) = '.$$$' then
begin
if FileExists(NewFileName) then
DeleteFile(NewFileName);
Succeed := MoveFile(PChar(ExistingFileName), PChar(NewFileName))
end else
Succeed := CopyFile(PChar(ExistingFileName), PChar(NewFileName), false);
if Succeed then
begin
ExistingFileName := NewFileName;
IsNeedToSave := false;
end else
begin
Application.MessageBox(PChar('Error $' + IntToHex(GetLastError, 4)),
'Error', MB_ICONERROR);
end;
SetControl;
end;
procedure TMainForm.ActionSaveAsExecute(Sender: TObject);
begin
if sdFile.Execute then
begin
if NewFileName = sdFile.FileName then
begin
Application.MessageBox('Same file name', 'Error', MB_ICONERROR);
exit;
end;
NewFileName := sdFile.FileName;
ActionSave.Enabled := true;
ActionSave.Execute;
end;
end;
procedure TMainForm.ActionExitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainForm.ActionAboutExecute(Sender: TObject);
begin
if AboutForm = nil then
AboutForm := TAboutForm.Create(Application);
AboutForm.ShowModal;
end;
procedure TMainForm.ActionHomePageExecute(Sender: TObject);
begin
ShellExecute(0, 'open', 'http://www.netlab.co.kr', nil, nil, SW_SHOW);
end;
procedure TMainForm.ActionPacketFieldExecute(Sender: TObject);
var
ListView: TListView;
begin
ListView := GetActiveListView;
if ListView = nil then exit;
if PacketFieldForm = nil then
PacketFieldForm := TPacketFieldForm.Create(Application);
PacketFieldForm.ListView := ListView;
PacketFieldForm.ShowModal;
end;
procedure TMainForm.Snoop1GetRemoteAdapterInfo(Sender: TObject;
AdapterNames, AdapterDescriptions: TStringList;
var AdapterIndex: Integer);
var
Index: Integer;
begin
if _Global.DontShowJustOne and (AdapterNames.Count = 1) then
begin
AdapterIndex := 0;
exit;
end;
if RemoteAdapterForm = nil then
RemoteAdapterForm := TRemoteAdapterForm.Create(Application);
RemoteAdapterForm.lbRemoteAdapter.Items := AdapterDescriptions;
RemoteAdapterForm.ShowModal;
if RemoteAdapterForm.ModalResult = mrOk then
begin
Index := RemoteAdapterForm.lbRemoteAdapter.ItemIndex;
if Index >= 0 then
AdapterIndex := Index;
end;
end;
procedure TMainForm.pcViewChange(Sender: TObject);
begin
ActiveListViewIndex := pcView.ActivePageIndex;
SynchronizeListWithListView;
end;
procedure TMainForm.lvDataChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
ViewData;
end;
procedure TMainForm.chkViewHexaClick(Sender: TObject);
begin
LastListItem := nil;
ViewData;
end;
procedure TMainForm.Snoop1Capture(Sender: TObject;
PacketHeader: PPCAP_PKTHDR; EthernetHeader: PETHERNET_HDR);
var
Node: PSnoopMemoryNode;
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
UDPHeader: PUDP_HDR;
begin
IsNeedToSave := true;
if _Global.OpenType <> 2 then // if not File Capture
Process(PacketHeader, EthernetHeader);
Node := SnoopMemory.Enqueue(PacketHeader, PChar(EthernetHeader));
EthernetList.Add(Node);
if snoopIsIP(EthernetHeader, @IPHeader) then
begin
IPList.Add(Node);
insert_IP.Close;
insert_IP.ParamByName('srcip').asstring:=snoopIP2Str(ntohl(IPHeader.Source));
insert_IP.ParamByName('dstip').asstring:=snoopIP2Str(ntohl(IPHeader.Destination));
insert_IP.ParamByName('length_').AsInteger:=ntohs(IPHeader.Length);
insert_IP.ParamByName('time_').AsTime:=Time;
insert_ip.Open;
if snoopIsTCP(IPHeader, @TCPHeader) then
begin
TCPList.Add(Node);
if snoopIsTCPData(IPHeader, TCPHeader) then
TCPDataList.Add(Node);
end else
if snoopIsUDP(IPHeader, @UDPHeader) then
begin
UDPList.Add(Node);
if snoopIsUDPData(IPHeader, UDPHeader) then
UDPDataList.Add(Node);
end else
if snoopIsICMP(IPHeader) then
ICMPList.Add(Node);
end else
if snoopIsARP(EthernetHeader) then
ARPList.Add(Node);
if _Global.ThreadSafe then
ViewPacket;
end;
procedure TMainForm.lvEthernetData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
begin
i := Item.Index;
if i >= EthernetList.Count then exit;
Node := PSnoopMemoryNode(EthernetList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
end;
procedure TMainForm.lvIPData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
i_str : integer;
begin
i := Item.Index;
if i >= IPList.Count then exit;
Node := PSnoopMemoryNode(IPList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
i_str:=strtoint(MainForm.Caption);
Inc(i_str);
MainForm.Caption:=inttostr(i_str);
end;
procedure TMainForm.lvARPData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
ARPHeader: PARP_HDR;
begin
i := Item.Index;
if i >= ARPList.Count then exit;
Node := PSnoopMemoryNode(ARPList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsARP(EthernetHeader, @ARPHeader) then exit;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddARP(Item, ARPHeader);
end;
procedure TMainForm.lvICMPData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
ICMPHeader: PICMP_HDR;
begin
i := Item.Index;
if i >= ICMPList.Count then exit;
Node := PSnoopMemoryNode(ICMPList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
if not snoopIsICMP(IPHeader, @ICMPHeader) then exit;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
Common.AddICMP(Item, ICMPHeader);
end;
procedure TMainForm.lvTCPData1(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
TCPData: PChar;
TCPDataLen: Integer;
CheckDataLen: Integer;
begin
i := Item.Index;
if i >= TCPList.Count then exit;
Node := PSnoopMemoryNode(TCPList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
if not snoopIsTCP(IPHeader, @TCPHeader) then exit;
snoopIsTCPData(IPHeader, TCPHeader, @TCPData, @TCPDataLen);
CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(TCP_HDR);
if TCPDataLen > CheckDataLen then
TCPDataLen := CheckDataLen;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
Common.AddTCP(Item, TCPHeader);
Common.AddTCPData(Item, TCPData, TCPDataLen, _Global.TCPDataOffset);
end;
procedure TMainForm.lvUDPData1(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
UDPHeader: PUDP_HDR;
UDPData: PChar;
UDPDataLen: Integer;
CheckDataLen: Integer;
begin
i := Item.Index;
if i >= UDPList.Count then exit;
Node := PSnoopMemoryNode(UDPList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
if not snoopIsUDP(IPHeader, @UDPHeader) then exit;
snoopIsUDPData(IPHeader, UDPHeader, @UDPData, @UDPDataLen);
CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(UDP_HDR);
if UDPDataLen > CheckDataLen then
UDPDataLen := CheckDataLen;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
Common.AddUDP(Item, UDPHeader);
Common.AddUDPData(Item, UDPData, UDPDataLen, _Global.UDPDataOffset);
end;
procedure TMainForm.lvTCPDataData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
TCPHeader: PTCP_HDR;
TCPData: PChar;
TCPDataLen: Integer;
CheckDataLen: Integer;
begin
i := Item.Index;
if i >= TCPDataList.Count then exit;
Node := PSnoopMemoryNode(TCPDataList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
if not snoopIsTCP(IPHeader, @TCPHeader) then exit;
if not snoopIsTCPData(IPHeader, TCPHeader, @TCPData, @TCPDataLen) then exit;
CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(TCP_HDR);
if TCPDataLen > CheckDataLen then
TCPDataLen := CheckDataLen;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
Common.AddTCP(Item, TCPHeader);
Common.AddTCPData(Item, TCPData, TCPDataLen, _Global.TCPDataOffset);
end;
procedure TMainForm.lvUDPDataData(Sender: TObject; Item: TListItem);
var
i: Integer;
Node: PSnoopMemoryNode;
PacketHeader: PPCAP_PKTHDR;
EthernetHeader: PETHERNET_HDR;
IPHeader: PIP_HDR;
UDPHeader: PUDP_HDR;
UDPData: PChar;
UDPDataLen: Integer;
CheckDataLen: Integer;
begin
i := Item.Index;
if i >= UDPDataList.Count then exit;
Node := PSnoopMemoryNode(UDPDataList.Items[i]);
PacketHeader := @Node^.PacketHeader;
EthernetHeader := @Node^.Data[0];
if not snoopIsIP(EthernetHeader, @IPHeader) then exit;
if not snoopIsUDP(IPHeader, @UDPHeader) then exit;
if not snoopIsUDPData(IPHeader, UDPHeader, @UDPData, @UDPDataLen) then exit;
CheckDataLen := ntohs(IPHeader^.Length) - sizeof(IP_HDR) - sizeof(UDP_HDR);
if UDPDataLen > CheckDataLen then
UDPDataLen := CheckDataLen;
Common.AddPacketHeader(Item, PacketHeader);
Common.AddEthernet(Item, EthernetHeader);
Common.AddIP(Item, IPHeader);
Common.AddUDP(Item, UDPHeader);
Common.AddUDPData(Item, UDPData, UDPDataLen, _Global.UDPDataOffset);
end;
procedure TMainForm.Changemode1Click(Sender: TObject);
begin
Gen_mode_frm.ShowModal;
end;
end.
unit Open;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Global, Buttons;
type
TOpenForm = class(TForm)
lblFilter: TLabel;
lblReadTimeOut: TLabel;
lblSnapLen: TLabel;
edReadTimeOut: TEdit;
edSnapLen: TEdit;
chkThreadSafe: TCheckBox;
btnOK: TButton;
btnCancel: TButton;
odFile: TOpenDialog;
cbxFilter: TComboBox;
pcOpen: TPageControl;
tsAdapter: TTabSheet;
cbxAdapter: TComboBox;
tsRemote: TTabSheet;
lblHost: TLabel;
lblUserName: TLabel;
lblPassword: TLabel;
edHost: TEdit;
edUserName: TEdit;
edPassword: TEdit;
procedure FormShow(Sender: TObject);
{ procedure FormClose(Sender: TObject; var Action: TCloseAction);}
procedure btnOKClick(Sender: TObject);
procedure pcOpenChange(Sender: TObject);
private
{ Private declarations }
procedure SetControl;
public
{ Public declarations }
end;
var
OpenForm: TOpenForm;
implementation
uses Option, Main;
{$R *.DFM}
procedure TOpenForm.SetControl;
var
Index: Integer;
begin
Index := pcOpen.ActivePageIndex;
// if file load, ReadTimeOut, SnapLen, ThreadSafe do not need.
edReadTimeOut.Enabled := Index <> 2;
edSnapLen.Enabled := Index <> 2;
chkThreadSafe.Enabled := Index <> 2;
end;
procedure TOpenForm.FormShow(Sender: TObject);
begin
_Global.Load;
// Open Type
pcOpen.ActivePageIndex := _Global.OpenType;
// Adapter
cbxAdapter.Items := MainForm.Snoop1.AdapterDescriptions;
cbxAdapter.ItemIndex := _Global.AdapterIndex;
if cbxAdapter.ItemIndex = -1 then
cbxAdapter.ItemIndex := 0;
// Remote
edHost.Text := _Global.Host;
edUserName.Text := _Global.UserName;
edPassword.Text := _Global.Password;
// Snoop Property
cbxFilter.Text := _Global.Filter;
cbxFilter.Items := _Global.FilterList;
edReadTimeOut.Text := IntToStr(_Global.ReadTimeOut);
edSnapLen.Text := IntToStr(_Global.SnapLen);
chkThreadSafe.Checked := _Global.ThreadSafe;
SetControl;
end;
procedure TOpenForm.btnOKClick(Sender: TObject);
var
i: Integer;
begin
// Open Type
_Global.OpenType := pcOpen.ActivePageIndex;
// Adapter Capture
_Global.AdapterIndex := cbxAdapter.ItemIndex;
// Remote Capture
_Global.Host := edHost.Text;
_Global.UserName := edUserName.Text;
_Global.Password := edPassword.Text;
// Snoop Property
_Global.Filter := cbxFilter.Text;
i := _Global.FilterList.IndexOf(cbxFilter.Text);
if i <> -1 then
_Global.FilterList.Delete(i);
_Global.FilterList.Insert(0, cbxFilter.Text);
cbxFilter.Items := _Global.FilterList;
_Global.ReadTimeOut := StrToInt(edReadTimeOut.Text);
_Global.SnapLen := StrToInt(edSnapLen.Text);
_Global.ThreadSafe := chkThreadSafe.Checked;
_Global.Save;
end;
procedure TOpenForm.pcOpenChange(Sender: TObject);
begin
SetControl;
end;
end.
unit Option;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Global;
type
TOptionForm = class(TForm)
btnOK: TButton;
btnCancel: TButton;
lblTCPDataOffset: TLabel;
edTCPDataOffset: TEdit;
lblUDPDataOffset: TLabel;
edUDPDataOffset: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnOKClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
OptionForm: TOptionForm;
implementation
{$R *.DFM}
procedure TOptionForm.FormCreate(Sender: TObject);
begin
//
end;
procedure TOptionForm.FormShow(Sender: TObject);
begin
_Global.Load;
// Option
edTCPDataOffset.Text := IntToStr(_Global.TCPDataOffset);
edUDPDataOffset.Text := IntToStr(_Global.UDPDataOffset);
end;
procedure TOptionForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//
end;
procedure TOptionForm.btnOKClick(Sender: TObject);
begin
// Option
_Global.TCPDataOffset := StrToInt(edTCPDataOffset.Text);
_Global.UDPDataOffset := StrToInt(edUDPDataOffset.Text);
_Global.Save;
Close;
end;
procedure TOptionForm.btnCancelClick(Sender: TObject);
begin
Close;
end;
end.
unit PacketField;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, ExtCtrls;
type
TPacketFieldForm = class(TForm)
btnOK: TButton;
btnCancel: TButton;
pnlMain: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnOKClick(Sender: TObject);
private
{ Private declarations }
CheckBoxes: array [0 .. 255] of TCheckBox;
procedure FreeAllCheckBox;
public
{ Public declarations }
ListView: TListView;
end;
var
PacketFieldForm: TPacketFieldForm;
implementation
{$R *.DFM}
procedure TPacketFieldForm.FreeAllCheckBox;
var
i: Integer;
CheckBox: TCheckBox;
begin
i := 0;
while i < ComponentCount do
begin
if Components[i] is TCheckBox then
begin
CheckBox := Components[i] as TCheckBox;
CheckBox.Free;
end else
inc(i);
end;
end;
procedure TPacketFieldForm.FormCreate(Sender: TObject);
begin
pnlMain.BevelOuter := bvNone;
end;
procedure TPacketFieldForm.FormShow(Sender: TObject);
var
i, Top: Integer;
ListColumn: TListColumn;
begin
FreeAllCheckBox;
if ListView = nil then exit;
Top := 0;
for i := 0 to ListView.Columns.Count - 1 do
begin
ListColumn := ListView.Columns[i];
CheckBoxes[i] := TCheckBox.Create(Self);
CheckBoxes[i].Parent := pnlMain;
CheckBoxes[i].Left := 8;
Top := i * Font.Size * 2;
CheckBoxes[i].Top := Top;
CheckBoxes[i].Caption := ListColumn.Caption;
CheckBoxes[i].Checked := ListColumn.Width <> 0;
CheckBoxes[i].Tag := ListColumn.Width; // for backup of ListColumn Width
end;
if Top <> 0 then
begin
pnlMain.Height := Top + Font.Size * 3;
ClientHeight := pnlMain.Height + 16;
end;
Caption := 'Packet Field (' + ListView.Hint + ')';
end;
procedure TPacketFieldForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//
end;
procedure TPacketFieldForm.btnOKClick(Sender: TObject);
var
i: Integer;
ListColumn: TListColumn;
begin
ListView.Visible := false;
for i := 0 to ListView.Columns.Count - 1 do
begin
ListColumn := ListView.Columns[i];
ListColumn.Width := CheckBoxes[i].Tag;
if not CheckBoxes[i].Checked then
ListColumn.Width := 0;
// if show packet field
if CheckBoxes[i].Checked and (ListColumn.Width = 0) then
ListColumn.Width := ListColumn.Tag;
end;
ListView.Visible := true;
end;
end.