@echo off set "LOCAL_VERSION=1.8.4" :: External commands if "%~1"=="status_zapret" ( call :test_service zapret soft call :tcp_enable exit /b ) if "%~1"=="check_updates" ( if not "%~2"=="soft" ( start /b service check_updates soft ) else ( call :service_check_updates soft ) exit /b ) if "%~1"=="load_game_filter" ( call :game_switch_status exit /b ) if "%1"=="admin" ( echo Started with admin rights ) else ( echo Requesting admin rights... powershell -Command "Start-Process 'cmd.exe' -ArgumentList '/c \"\"%~f0\" admin\"' -Verb RunAs" exit /b ) :: MENU ================================ setlocal EnableDelayedExpansion :menu cls call :ipset_switch_status call :game_switch_status set "menu_choice=null" echo ========= v!LOCAL_VERSION! ========= echo 1. Install Service echo 2. Remove Services echo 3. Check Status echo 4. Run Diagnostics echo 5. Check Updates echo 6. Switch Game Filter (%GameFilterStatus%) echo 7. Switch ipset (%IPsetStatus%) echo 8. Update ipset list echo 0. Exit set /p menu_choice=Enter choice (0-8): if "%menu_choice%"=="1" goto service_install if "%menu_choice%"=="2" goto service_remove if "%menu_choice%"=="3" goto service_status if "%menu_choice%"=="4" goto service_diagnostics if "%menu_choice%"=="5" goto service_check_updates if "%menu_choice%"=="6" goto game_switch if "%menu_choice%"=="7" goto ipset_switch if "%menu_choice%"=="8" goto ipset_update if "%menu_choice%"=="0" exit /b goto menu :: TCP ENABLE ========================== :tcp_enable netsh interface tcp show global | findstr /i "timestamps" | findstr /i "enabled" > nul || netsh interface tcp set global timestamps=enabled > nul 2>&1 exit /b :: STATUS ============================== :service_status cls chcp 437 > nul sc query "zapret" >nul 2>&1 if !errorlevel!==0 ( for /f "tokens=2*" %%A in ('reg query "HKLM\System\CurrentControlSet\Services\zapret" /v zapret-discord-youtube 2^>nul') do echo Service strategy installed from "%%B" ) call :test_service zapret call :test_service WinDivert echo: tasklist /FI "IMAGENAME eq winws.exe" | find /I "winws.exe" > nul if !errorlevel!==0 ( call :PrintGreen "Bypass (winws.exe) is ACTIVE" ) else ( call :PrintRed "Bypass (winws.exe) NOT FOUND" ) pause goto menu :test_service set "ServiceName=%~1" set "ServiceStatus=" for /f "tokens=3 delims=: " %%A in ('sc query "%ServiceName%" ^| findstr /i "STATE"') do set "ServiceStatus=%%A" set "ServiceStatus=%ServiceStatus: =%" if "%ServiceStatus%"=="RUNNING" ( if "%~2"=="soft" ( echo "%ServiceName%" is ALREADY RUNNING as service, use "service.bat" and choose "Remove Services" first if you want to run standalone bat. pause exit /b ) else ( echo "%ServiceName%" service is RUNNING. ) ) else if "%ServiceStatus%"=="STOP_PENDING" ( call :PrintYellow "!ServiceName! is STOP_PENDING, that may be caused by a conflict with another bypass. Run Diagnostics to try to fix conflicts" ) else if not "%~2"=="soft" ( echo "%ServiceName%" service is NOT running. ) exit /b :: REMOVE ============================== :service_remove cls chcp 65001 > nul set SRVCNAME=zapret sc query "!SRVCNAME!" >nul 2>&1 if !errorlevel!==0 ( net stop %SRVCNAME% sc delete %SRVCNAME% ) else ( echo Service "%SRVCNAME%" is not installed. ) tasklist /FI "IMAGENAME eq winws.exe" | find /I "winws.exe" > nul if !errorlevel!==0 ( taskkill /IM winws.exe /F > nul ) sc query "WinDivert" >nul 2>&1 if !errorlevel!==0 ( net stop "WinDivert" sc query "WinDivert" >nul 2>&1 if !errorlevel!==0 ( sc delete "WinDivert" ) ) net stop "WinDivert14" >nul 2>&1 sc delete "WinDivert14" >nul 2>&1 pause goto menu :: INSTALL ============================= :service_install cls chcp 65001 > nul :: Main cd /d "%~dp0" set "BIN_PATH=%~dp0bin\" set "LISTS_PATH=%~dp0lists\" :: Searching for .bat files in current folder, except files that start with "service" echo Pick one of the options: set "count=0" for %%f in (*.bat) do ( set "filename=%%~nxf" if /i not "!filename:~0,7!"=="service" ( set /a count+=1 echo !count!. %%f set "file!count!=%%f" ) ) :: Choosing file set "choice=" set /p "choice=Input file index (number): " if "!choice!"=="" goto :eof set "selectedFile=!file%choice%!" if not defined selectedFile ( echo Invalid choice, exiting... pause goto menu ) :: Args that should be followed by value set "args_with_value=sni" :: Parsing args (mergeargs: 2=start param|3=arg with value|1=params args|0=default) set "args=" set "capture=0" set "mergeargs=0" set QUOTE=" for /f "tokens=*" %%a in ('type "!selectedFile!"') do ( set "line=%%a" call set "line=%%line:^!=EXCL_MARK%%" echo !line! | findstr /i "%BIN%winws.exe" >nul if not errorlevel 1 ( set "capture=1" ) if !capture!==1 ( if not defined args ( set "line=!line:*%BIN%winws.exe"=!" ) set "temp_args=" for %%i in (!line!) do ( set "arg=%%i" if not "!arg!"=="^" ( if "!arg:~0,2!" EQU "--" if not !mergeargs!==0 ( set "mergeargs=0" ) if "!arg:~0,1!" EQU "!QUOTE!" ( set "arg=!arg:~1,-1!" echo !arg! | findstr ":" >nul if !errorlevel!==0 ( set "arg=\!QUOTE!!arg!\!QUOTE!" ) else if "!arg:~0,1!"=="@" ( set "arg=\!QUOTE!@%~dp0!arg:~1!\!QUOTE!" ) else if "!arg:~0,5!"=="%%BIN%%" ( set "arg=\!QUOTE!!BIN_PATH!!arg:~5!\!QUOTE!" ) else if "!arg:~0,7!"=="%%LISTS%%" ( set "arg=\!QUOTE!!LISTS_PATH!!arg:~7!\!QUOTE!" ) else ( set "arg=\!QUOTE!%~dp0!arg!\!QUOTE!" ) ) else if "!arg:~0,12!" EQU "%%GameFilter%%" ( set "arg=%GameFilter%" ) if !mergeargs!==1 ( set "temp_args=!temp_args!,!arg!" ) else if !mergeargs!==3 ( set "temp_args=!temp_args!=!arg!" set "mergeargs=1" ) else ( set "temp_args=!temp_args! !arg!" ) if "!arg:~0,2!" EQU "--" ( set "mergeargs=2" ) else if !mergeargs!==2 ( set "mergeargs=1" ) else if !mergeargs!==1 ( for %%x in (!args_with_value!) do ( if /i "%%x"=="!arg!" ( set "mergeargs=3" ) ) ) ) ) if not "!temp_args!"=="" ( set "args=!args! !temp_args!" ) ) ) :: Creating service with parsed args call :tcp_enable set ARGS=%args% call set "ARGS=%%ARGS:EXCL_MARK=^!%%" echo Final args: !ARGS! set SRVCNAME=zapret net stop %SRVCNAME% >nul 2>&1 sc delete %SRVCNAME% >nul 2>&1 sc create %SRVCNAME% binPath= "\"%BIN_PATH%winws.exe\" !ARGS!" DisplayName= "zapret" start= auto sc description %SRVCNAME% "Zapret DPI bypass software" sc start %SRVCNAME% for %%F in ("!file%choice%!") do ( set "filename=%%~nF" ) reg add "HKLM\System\CurrentControlSet\Services\zapret" /v zapret-discord-youtube /t REG_SZ /d "!filename!" /f pause goto menu :: CHECK UPDATES ======================= :service_check_updates chcp 437 > nul cls :: Set current version and URLs set "GITHUB_VERSION_URL=https://raw.githubusercontent.com/Flowseal/zapret-discord-youtube/main/.service/version.txt" set "GITHUB_RELEASE_URL=https://github.com/Flowseal/zapret-discord-youtube/releases/tag/" set "GITHUB_DOWNLOAD_URL=https://github.com/Flowseal/zapret-discord-youtube/releases/latest/download/zapret-discord-youtube-" :: Get the latest version from GitHub for /f "delims=" %%A in ('powershell -command "(Invoke-WebRequest -Uri \"%GITHUB_VERSION_URL%\" -Headers @{\"Cache-Control\"=\"no-cache\"} -TimeoutSec 5).Content.Trim()" 2^>nul') do set "GITHUB_VERSION=%%A" :: Error handling if not defined GITHUB_VERSION ( echo Warning: failed to fetch the latest version. This warning does not affect the operation of zapret timeout /T 9 if "%1"=="soft" exit goto menu ) :: Version comparison if "%LOCAL_VERSION%"=="%GITHUB_VERSION%" ( echo Latest version installed: %LOCAL_VERSION% if "%1"=="soft" exit pause goto menu ) echo New version available: %GITHUB_VERSION% echo Release page: %GITHUB_RELEASE_URL%%GITHUB_VERSION% set "CHOICE=" set /p "CHOICE=Do you want to automatically download the new version? (Y/N) (default: Y) " if "%CHOICE%"=="" set "CHOICE=Y" if /i "%CHOICE%"=="y" set "CHOICE=Y" if /i "%CHOICE%"=="Y" ( echo Opening the download page... start "" "%GITHUB_DOWNLOAD_URL%%GITHUB_VERSION%.rar" ) if "%1"=="soft" exit pause goto menu :: DIAGNOSTICS ========================= :service_diagnostics chcp 437 > nul cls :: Base Filtering Engine sc query BFE | findstr /I "RUNNING" > nul if !errorlevel!==0 ( call :PrintGreen "Base Filtering Engine check passed" ) else ( call :PrintRed "[X] Base Filtering Engine is not running. This service is required for zapret to work" ) echo: :: TCP timestamps check netsh interface tcp show global | findstr /i "timestamps" | findstr /i "enabled" > nul if !errorlevel!==0 ( call :PrintGreen "TCP timestamps check passed" ) else ( call :PrintYellow "[?] TCP timestamps are disabled. Enabling timestamps..." netsh interface tcp set global timestamps=enabled > nul 2>&1 if !errorlevel!==0 ( call :PrintGreen "TCP timestamps successfully enabled" ) else ( call :PrintRed "[X] Failed to enable TCP timestamps" ) ) echo: :: AdguardSvc.exe tasklist /FI "IMAGENAME eq AdguardSvc.exe" | find /I "AdguardSvc.exe" > nul if !errorlevel!==0 ( call :PrintRed "[X] Adguard process found. Adguard may cause problems with Discord" call :PrintRed "https://github.com/Flowseal/zapret-discord-youtube/issues/417" ) else ( call :PrintGreen "Adguard check passed" ) echo: :: Killer sc query | findstr /I "Killer" > nul if !errorlevel!==0 ( call :PrintRed "[X] Killer services found. Killer conflicts with zapret" call :PrintRed "https://github.com/Flowseal/zapret-discord-youtube/issues/2512#issuecomment-2821119513" ) else ( call :PrintGreen "Killer check passed" ) echo: :: Intel Connectivity Network Service sc query | findstr /I "Intel" | findstr /I "Connectivity" | findstr /I "Network" > nul if !errorlevel!==0 ( call :PrintRed "[X] Intel Connectivity Network Service found. It conflicts with zapret" call :PrintRed "https://github.com/ValdikSS/GoodbyeDPI/issues/541#issuecomment-2661670982" ) else ( call :PrintGreen "Intel Connectivity check passed" ) echo: :: Check Point set "checkpointFound=0" sc query | findstr /I "TracSrvWrapper" > nul if !errorlevel!==0 ( set "checkpointFound=1" ) sc query | findstr /I "EPWD" > nul if !errorlevel!==0 ( set "checkpointFound=1" ) if !checkpointFound!==1 ( call :PrintRed "[X] Check Point services found. Check Point conflicts with zapret" call :PrintRed "Try to uninstall Check Point" ) else ( call :PrintGreen "Check Point check passed" ) echo: :: SmartByte sc query | findstr /I "SmartByte" > nul if !errorlevel!==0 ( call :PrintRed "[X] SmartByte services found. SmartByte conflicts with zapret" call :PrintRed "Try to uninstall or disable SmartByte through services.msc" ) else ( call :PrintGreen "SmartByte check passed" ) echo: :: VPN sc query | findstr /I "VPN" > nul if !errorlevel!==0 ( call :PrintYellow "[?] Some VPN services found. Some VPNs can conflict with zapret" call :PrintYellow "Make sure that all VPNs are disabled" ) else ( call :PrintGreen "VPN check passed" ) echo: :: DNS set "dohfound=0" for /f "delims=" %%a in ('powershell -Command "Get-ChildItem -Recurse -Path 'HKLM:System\CurrentControlSet\Services\Dnscache\InterfaceSpecificParameters\' | Get-ItemProperty | Where-Object { $_.DohFlags -gt 0 } | Measure-Object | Select-Object -ExpandProperty Count"') do ( if %%a gtr 0 ( set "dohfound=1" ) ) if !dohfound!==0 ( call :PrintYellow "[?] Make sure you have configured secure DNS in a browser with some non-default DNS service provider," call :PrintYellow "If you use Windows 11 you can configure encrypted DNS in the Settings to hide this warning" ) else ( call :PrintGreen "Secure DNS check passed" ) echo: :: WinDivert conflict tasklist /FI "IMAGENAME eq winws.exe" | find /I "winws.exe" > nul set "winws_running=!errorlevel!" sc query WinDidvert | findstr /I "RUNNING STOP_PENDING" > nul set "windivert_running=!errorlevel!" if !winws_running! neq 0 if !windivert_running!==0 ( call :PrintYellow "[?] winws.exe is not running but WinDivert service is active. Attempting to delete WinDivert..." net stop "WinDivert" >nul 2>&1 sc delete "WinDivert" >nul 2>&1 if !errorlevel! neq 0 ( call :PrintRed "[X] Failed to delete WinDivert. Checking for conflicting services..." set "conflicting_services=GoodbyeDPI" set "found_conflict=0" for %%s in (!conflicting_services!) do ( sc query "%%s" >nul 2>&1 if !errorlevel!==0 ( call :PrintYellow "[?] Found conflicting service: %%s. Stopping and removing..." net stop "%%s" >nul 2>&1 sc delete "%%s" >nul 2>&1 if !errorlevel!==0 ( call :PrintGreen "Successfully removed service: %%s" ) else ( call :PrintRed "[X] Failed to remove service: %%s" ) set "found_conflict=1" ) ) if !found_conflict!==0 ( call :PrintRed "[X] No conflicting services found. Check manually if any other bypass is using WinDivert." ) else ( call :PrintYellow "[?] Attempting to delete WinDivert again..." sc delete "WinDivert" >nul 2>&1 sc query "WinDivert" >nul 2>&1 if !errorlevel! neq 0 ( call :PrintGreen "WinDivert successfully deleted after removing conflicting services" ) else ( call :PrintRed "[X] WinDivert still cannot be deleted. Check manually if any other bypass is using WinDivert." ) ) ) else ( call :PrintGreen "WinDivert successfully removed" ) echo: ) :: Conflicting bypasses set "conflicting_services=GoodbyeDPI discordfix_zapret winws1 winws2" for %%s in (!conflicting_services!) do ( sc query "%%s" >nul 2>&1 if !errorlevel!==0 ( if "!found_conflicts!"=="" ( set "found_conflicts=%%s" ) else ( set "found_conflicts=!found_conflicts! %%s" ) set "found_any_conflict=1" ) ) if !found_any_conflict!==1 ( call :PrintRed "[X] Conflicting bypass services found: !found_conflicts!" set "CHOICE=" set /p "CHOICE=Do you want to remove these conflicting services? (Y/N) (default: N) " if "!CHOICE!"=="" set "CHOICE=N" if "!CHOICE!"=="y" set "CHOICE=Y" if /i "!CHOICE!"=="Y" ( for %%s in (!found_conflicts!) do ( call :PrintYellow "Stopping and removing service: %%s" net stop "%%s" >nul 2>&1 sc delete "%%s" >nul 2>&1 if !errorlevel!==0 ( call :PrintGreen "Successfully removed service: %%s" ) else ( call :PrintRed "[X] Failed to remove service: %%s" ) ) net stop "WinDivert" >nul 2>&1 sc delete "WinDivert" >nul 2>&1 net stop "WinDivert14" >nul 2>&1 sc delete "WinDivert14" >nul 2>&1 ) echo: ) :: Discord cache clearing set "CHOICE=" set /p "CHOICE=Do you want to clear the Discord cache? (Y/N) (default: Y) " if "!CHOICE!"=="" set "CHOICE=Y" if "!CHOICE!"=="y" set "CHOICE=Y" if /i "!CHOICE!"=="Y" ( tasklist /FI "IMAGENAME eq Discord.exe" | findstr /I "Discord.exe" > nul if !errorlevel!==0 ( echo Discord is running, closing... taskkill /IM Discord.exe /F > nul if !errorlevel! == 0 ( call :PrintGreen "Discord was successfully closed" ) else ( call :PrintRed "Unable to close Discord" ) ) set "discordCacheDir=%appdata%\discord" for %%d in ("Cache" "Code Cache" "GPUCache") do ( set "dirPath=!discordCacheDir!\%%~d" if exist "!dirPath!" ( rd /s /q "!dirPath!" if !errorlevel!==0 ( call :PrintGreen "Successfully deleted !dirPath!" ) else ( call :PrintRed "Failed to delete !dirPath!" ) ) else ( call :PrintRed "!dirPath! does not exist" ) ) ) echo: pause goto menu :: GAME SWITCH ======================== :game_switch_status chcp 437 > nul set "gameFlagFile=%~dp0bin\game_filter.enabled" if exist "%gameFlagFile%" ( set "GameFilterStatus=enabled" set "GameFilter=1024-65535" ) else ( set "GameFilterStatus=disabled" set "GameFilter=12" ) exit /b :game_switch chcp 437 > nul cls if not exist "%gameFlagFile%" ( echo Enabling game filter... echo ENABLED > "%gameFlagFile%" call :PrintYellow "Restart the zapret to apply the changes" ) else ( echo Disabling game filter... del /f /q "%gameFlagFile%" call :PrintYellow "Restart the zapret to apply the changes" ) pause goto menu :: IPSET SWITCH ======================= :ipset_switch_status chcp 437 > nul findstr /R "^203\.0\.113\.113/32$" "%~dp0lists\ipset-all.txt" >nul if !errorlevel!==0 ( set "IPsetStatus=empty" ) else ( set "IPsetStatus=loaded" ) exit /b :ipset_switch chcp 437 > nul cls set "listFile=%~dp0lists\ipset-all.txt" set "backupFile=%listFile%.backup" findstr /R "^203\.0\.113\.113/32$" "%listFile%" >nul if !errorlevel!==0 ( echo Enabling ipset based bypass... if exist "%backupFile%" ( del /f /q "%listFile%" ren "%backupFile%" "ipset-all.txt" ) else ( echo Error: no backup to restore. Update list from service menu by yourself ) ) else ( echo Disabling ipset based bypass... if not exist "%backupFile%" ( ren "%listFile%" "ipset-all.txt.backup" ) else ( del /f /q "%backupFile%" ren "%listFile%" "ipset-all.txt.backup" ) >"%listFile%" ( echo 203.0.113.113/32 ) ) pause goto menu :: IPSET UPDATE ======================= :ipset_update chcp 437 > nul cls set "listFile=%~dp0lists\ipset-all.txt" set "url=https://raw.githubusercontent.com/Flowseal/zapret-discord-youtube/refs/heads/main/.service/ipset-service.txt" echo Updating ipset-all... if exist "%SystemRoot%\System32\curl.exe" ( curl -L -o "%listFile%" "%url%" ) else ( powershell -Command ^ "$url = '%url%';" ^ "$out = '%listFile%';" ^ "$dir = Split-Path -Parent $out;" ^ "if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null };" ^ "$res = Invoke-WebRequest -Uri $url -TimeoutSec 10 -UseBasicParsing;" ^ "if ($res.StatusCode -eq 200) { $res.Content | Out-File -FilePath $out -Encoding UTF8 } else { exit 1 }" ) echo Finished pause goto menu :: Utility functions :PrintGreen powershell -Command "Write-Host \"%~1\" -ForegroundColor Green" exit /b :PrintRed powershell -Command "Write-Host \"%~1\" -ForegroundColor Red" exit /b :PrintYellow powershell -Command "Write-Host \"%~1\" -ForegroundColor Yellow" exit /b