Floweryguard: локальный DPI-прокси с Thompson Sampling (MAB), бесконфликтным тандемом с zapret и фиксом Discord Voice.

Привет всем участникам NTC.

Хочу представить проект Floweryguard (открытый исходный код под лицензией MIT) и пригласить к тестированию на различных провайдерах и региональных ТСПУ.


1. Архитектурная концепция

Большинство пользователей Windows при использовании обходов сталкиваются с двумя проблемами:

  1. Необходимость ручного перебора десятков батников (general_alt1, alt2 и т.д.) под конкретного интернет-провайдера.
  2. Перехват L3/L4 драйвером WinDivert иногда конфликтует с античитами (Vanguard, EAC) или локальными корпоративными VPN.

Floweryguard реализован на уровне локального HTTP/HTTPS/CONNECT прокси (127.0.0.1:8118) с системной интеграцией через WinINet API.


2. Реализация десинхронизации и стратегий

Thompson Sampling Strategy Engine (Multi-Armed Bandit)

Вместо фиксированного подбора параметров реализован вероятностный алгоритм на базе бета-распределения Beta(alpha, beta):

  • Для каждого домена ведется независимый подсчет успешных и неуспешных рукопожатий.
  • Доступные стратегии:
    • disoob_sni: 1-байтный Out-of-Band (URG) инжектор перед сегментом SNI.
    • combo_tlsrec_tcpsplit: разбиение TLS-записи ClientHello на две валидные записи + фрагментация TCP-потока по границе расширения SNI.
    • tcp_split_sni_mid: разрезание TCP-сегмента посередине имени хоста.
    • tls_record_frag: фрагментация исключительно на уровне TLS Record Layer.
    • direct: прямой проброс без модификации пакетов.
  • Статистика сохраняется в strategy_scores.json. При смене поведения ТСПУ движок адаптируется на лету.

Тандем с zapret (Flowseal)

Для предотвращения двойной десинхронизации при запущенном winws.exe:

  • Процесс winws.exe детектируется автоматически.
  • Трафик Discord и YouTube переводится в режим direct (десинхронизацию выполняет WinDivert), а прокси берет на себя маршрутизацию, системные исключения и таймауты.

Discord Voice & WebRTC (UDP Helper)

Для голосовых каналов Discord (WebRTC, UDP 50000-50100) реализован изолированный модуль запуска легковесного фильтра с фейковыми пакетами, не затрагивающий TCP-трафик браузера.

Happy Eyeballs (RFC 8305) и защита от утечки сокетов

  • Каскадный параллельный опрос адресов за 250 мс для отсеивания заблокированных IP-адресов Cloudflare.
  • Таймаут TLS Handshake (select до 6 секунд) с вызовом shutdown(SHUT_RDWR) для предотвращения ошибок 503 и забивания пула дескрипторов.

Tethering Mask (TTL = 65)

Для пользователей мобильного интернета утилита через Win32 API и реестр выставляет DefaultTTL = 65 (IPv4/IPv6) с активацией меток времени RFC 1323.


3. Стек

  • Runtime: Python 3 (стандартная библиотека: socket, select, struct, ctypes, winreg, threading). Внешних зависимостей нет.
  • Скомпилирован автономный Flowery.exe (PyInstaller) с корректной резолюцией путей через sys.frozen.
  • Корректная обработка Win32 Console Control Handler при закрытии консоли (гарантированный сброс настроек прокси).

4. Тестирование

В дистрибутив включен сценарий test.bat для валидации контрольных точек (Discord Web, Gateway, CDN, Voice RTC, YouTube, X/Twitter, Rutracker, Cloudflare DNS).

Буду благодарен сообществу за:

  1. Тестирование работы Thompson Sampling на региональных ТСПУ.
  2. Логи при возникновении сбоев рукопожатия.
  3. Предложения по расширению стратегий десинхронизации.

Код проекта: GitHub - KarlMerkel/Floweryguard: DPI bypass & tethering mask tool for Windows (Discord, YouTube, mobile hotspot TTL fix). 100% autonomous, zero dependencies. · GitHub

Windows 10, v1.2.0, батники не работают (кроме test.bat). В панели задач что-то мелькает и всё, даже права админа не просит. Ручной запуск Flowery.exe не устанавливает системный прокси, в соответствующих настройках системы пусто.

v1.1.0, батники работают, системный прокси ставится. Логи не появляются в папке логов, в отличие от v1.2.0, хотя может быть так и надо.

Насчёт обходов. Сибирь, проводной Ростелеком.
v1.1.0 всё нужное открывается, кроме видео на Ютубе (googlevideo.com), помогает шинковка мультидисордером Запрета2.
v1.2.0 так же, но Дискорд работает даже без системного прокси О.о (но не без работающего Flowery), и браузеры системный прокси не видят.

test.bat всегда даёт ОК на тесте Дискорда (кроме Voice RTC), хотя нормально он не запускается без обхода.

Желательно убрать вопрос после завершения процесса “Terminate batch job? (Y/N)”, когда запускаешь через батник, и добавить в исключения системного прокси все приватные адреса (10.х.х.х, 172.16-32.х.х, 192.168.х.х). Ещё бы хотелось не требовать админских прав, если выключен фикс TTL (если только для него права и нужны). Так можно поставить ярлык в тихую автозагрузку без поп-апа.

Вижу в батниках запуск бинарника с флагом --all. Значит, есть флаги. Нашёл их в main.py. Можно добавить флаг --help для их вывода в терминал или опцию в окно программы для того же. И ещё дать возможность выключить логи, чтобы они не накапливались.

Поддержка win7 не планируется?

Спасибо за информацию.

О проблемах с батниками и видео знаю. Скоро будет новая версия где все пофиксил и добавим доп функции. Если не затруднит отправти логи работы 1.2.0 буду очень благодарен.

Посмотрим если получится добиться нормального результата на 10 и 11 то скорее всего да.

с таким батником запустился

@echo off
setlocal enabledelayedexpansion
title Flowery - DPI Bypass

reg add “HKCU\Console” /v VirtualTerminalLevel /t REG_DWORD /d 1 /f >nul 2>&1
mode con: cols=125 lines=52 >nul 2>&1
cd /d “%~dp0”

reg add “HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings” /v ProxyEnable /t REG_DWORD /d 0 /f >nul 2>&1

net session >nul 2>&1
if %errorlevel% neq 0 (
if /i “%~1” neq “elevated” (
echo [*] Requesting Administrator rights…
powershell -NoProfile -ExecutionPolicy Bypass -Command “Start-Process cmd.exe -ArgumentList '/k “”%~f0” elevated"’ -Verb RunAs"
exit /b
)
echo ERROR: Flowery requires Administrator rights.
pause
exit /b 1
)

if exist “%~dp0Flowery.exe” (
echo [*] Starting Flowery…
“%~dp0Flowery.exe”
set “EXIT_CODE=!errorlevel!”
goto :safe_exit
)

where python >nul 2>&1 && set “PY_CMD=python”
if not defined PY_CMD where py >nul 2>&1 && set “PY_CMD=py”

if not defined PY_CMD (
echo Python or Flowery.exe not found.
pause
exit /b 1
)

“%PY_CMD%” Floweryguard\main.py
set “EXIT_CODE=!errorlevel!”

:safe_exit
reg add “HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings” /v ProxyEnable /t REG_DWORD /d 0 /f >nul 2>&1

echo.
echo === Flowery exited with code !EXIT_CODE! ===
pause

джарона