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 SizeFormat 
М_123_2022_Шевченко.pdf
  Restricted Access
2.2 MBAdobe PDFView/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.