forked from shadowsocks/shadowsocks-windows
-
Notifications
You must be signed in to change notification settings - Fork 0
Changelog
SlimRG edited this page Aug 21, 2026
·
1 revision
Fork-specific changes are tracked here. Historical upstream Shadowsocks for Windows changes remain in CHANGES.
- Added canonical English, Russian and Simplified Chinese README pages in the Wiki, refreshed EN/RU content for the current 2.2.31 DNS implementation, and kept the separate classic-style Chinese usage guide.
- Corrected stale DNS documentation: Administrator Mode currently implements transparent UDP/TCP 53 routing for
System,Direct,Proxy,CustomDohandDnsCrypt; the old 5.0.0/5.1.0 limitation is historical only. - Moved long-form Markdown documentation from the application repository into the dedicated GitHub Wiki; functional
.githubissue/PR templates remain in the main repository and legal notices are embedded fromTHIRD-PARTY-NOTICES.txt. - Added a complete Simplified Chinese usage page (
Shadowsocks Windows 使用说明) and linked it from Home, English, Russian and the Wiki sidebar. - Fixed duplicate Start-with-Windows instances by restoring stale Run-entry deduplication and adding a process-wide single-instance guard independent of unpackaged WinUI executable identity; legacy-only Run entries are migrated, disabling autostart removes stale entries too, and hidden startup activations no longer raise the already-running dialog.
- Disabled Fody-generated
FodyWeavers.xsdschema files, removed stale copies, and removednoNamespaceSchemaLocationreferences from bothFodyWeavers.xmlfiles so Visual Studio no longer requests a missing generated schema. - Fixed the final false-positive updater release-validator regex: automatic update stream disposal is now guarded by the Windows regression test instead of brittle source formatting. A real 5.2.21 -> 5.2.22 self-update was verified successfully.
- Fixed automatic update download promotion on Windows: the temporary
.downloadstream is fully disposed beforeFile.Move, eliminating the sharing violation observed during 5.2.21 -> 5.2.22 update tests. SHA-256 sidecars now accept both standardsha256sumformat and a plain 64-hex digest. - Fixed DNSCrypt loopback-port allocation on Windows/GitHub Actions hosts where TCP and UDP dynamic/excluded ranges differ: allocation is now UDP-first, verifies the same numeric port over TCP, falls back to a dual-bind application-port candidate when needed, and preserves the last socket failure for diagnostics.
- Relaxed the Bouncy Castle Bzip2 notice validator to verify the legal contract (
modified Bzip2+Apache License 2.0) instead of one obsolete wording. - Fixed the Phase 10 NetworkService version release-validator check after version response ownership moved from
Program.cstoNetworkServiceResponses.cs; validation now also requires the versioned-ping regression test. - Fixed invalid multiline PowerShell boolean expressions in
Validate-DnsCrypt.ps1; the release parser gate now passes this DNSCrypt validation block instead of stopping before repository validation. - Fixed a release-validator PowerShell interpolation parser error and added a CI/release PowerShell parser gate for every
packaging/*.ps1script. - Synchronized the living Markdown documentation with the final 2.2.31 implementation: updater integrity/UAC handoff, release security gates, current selectable
RichTextBlockLogs contract, storage architecture and release verification are now documented consistently. - Fixed the release validator after the Logs viewer migration from
ListViewto selectableRichTextBlock: validation now enforcesIsTextSelectionEnabled = trueinstead of the retiredListViewSelectionMode.Noneimplementation token. - Fixed a release-blocking self-updater compilation regression:
UpdateCheckernow resolvesSelfUpdaterfrom the service namespace, and launching the installed updated executable uses a valid explicitProcess.Startnull check instead of an invalid standalone null-coalescing expression. - Fixed the DNSCrypt TOML test so
odoh_servers = falseis no longer mistaken for adoh_servers = falseline, and added the missing resolver-filter translation in every shipped locale. - Kept the automatic updater contract release-safe: canonical
Shadowsocks-win-x64.zip/.sha256verification, PID handoff, rollback, replacement of the primary product EXE, relaunch, and cleanup remain required by repository validation. - Synchronized the product version across Core, Windows infrastructure, WinUI integration, NetworkService, manifests and
ApplicationInfoso all shipped assemblies identify as 2.2.31 / 2.2.31.0. - Strengthened release validation around updater compilation invariants,
ss://protocol-command quoting, single-file packaging and Windows 10 build 19041 compatibility metadata. - Refreshed release workflow defaults, packaging commands, checklist examples and third-party notice metadata for 2.2.31.
- Raised the release SDK security floor to .NET SDK 10.0.303 (runtime 10.0.11), made NuGet audit availability/vulnerability findings
NU1900-NU1904fail CI/release restores, and verify the finalShadowsocks.exeFileVersion exactly matches2.2.31.0before packaging. - Hardened automatic update handoff against local staged-payload tampering: the verified updater is held read-only/non-deletable across
Process.Start/UAC, its SHA-256 is carried as an internal handoff argument, and the updater re-verifies its own staged image before replacing the installed executable.
- Replaced the legacy SOCKS5 forward-proxy handshake with an RFC 1928/1929 implementation: username/password authentication now works, domain-name replies are accepted, and fragmented socket reads/writes are handled correctly.
- Replaced the stale browser impersonation User-Agent in HTTP CONNECT with the product User-Agent, made CONNECT writes/header reads fragmentation-safe, preserved tunnel bytes received with the proxy response, and added forward-proxy regression tests.
- Hardened the UDP relay: SOCKS5 UDP destinations now participate in server-strategy selection, malformed/fragmented datagrams are rejected, failed associations can be recreated, encryptors are disposed deterministically, and the borrowed generic LRU cache was replaced with a purpose-built bounded association cache.
- Replaced the download-to-Explorer update flow with a strict automatic single-file self-updater: canonical GitHub ZIP/SHA-256 assets are verified, the new EXE performs a PID handoff with rollback, replaces the product binary, launches the installed copy and is then removed by that new copy.
- Start-with-Windows now records the primary product EXE in the Run command so an automatic update launched from the stable LocalAppData startup copy updates the real product binary instead of only the startup copy.
- Removed retired executable-side configuration/PAC/cache migration, pre-SIP002 URL handling, unmanaged plugin PATH/absolute-path fallback, old IPC/thread utility code and stale updater compatibility fallbacks; release validation rejects their return.
- Rebuilt the embedded product license and third-party notices for the actual 5.2.21 dependency set; About now reads validated non-empty legal resources through
EmbeddedResources. - Fixed
ss://protocol registration so Windows quotes both the product executable path and the imported URL placeholder; associations now remain valid whenShadowsocks.exeis installed in a path containing spaces, and release validation prevents the unsafe command from returning. - Locked WinUI release validation to the intended compatibility contract: compile against the Windows 26100 SDK while keeping
SupportedOSPlatformVersionandTargetPlatformMinVersionat Windows 10 build 19041 for both WinUI projects, with the Windows 10/11 manifest compatibility declaration required.
- DNS page now starts with live Windows DNS status (active adapters, configured DNS servers, selected Shadowsocks DNS policy and transparent-interception state), adds localized tooltips/accessibility help for DNS controls, and shows only the settings relevant to the currently selected DNS mode.
- DNSCrypt
Automaticresolver selection now resolves a concrete DNSCrypt/DoH server from the signed catalog using the configured DNSSEC, no-log, unfiltered and address-family constraints. It prefers a resolver in the active Shadowsocks server country, falls back to the best compatible catalog entry, and refreshes the choice when the active server/strategy changes. - Added DNS privacy diagnostics and a self-test that verifies DNSCrypt health, Administrator DNS interception, fail-closed/system-DNS isolation, active-runtime bootstrap settings, filtered Automatic resolver pinning and the current secure transport.
- Server list labels now show the friendly server name plus a country flag and no longer append the server IP/hostname. Country metadata is resolved best-effort over HTTPS and cached in memory.
- Added a DNS-page
Test DNSCrypthealth-check action for the currently running local DNSCrypt listener. - Added built-in DoH provider presets for Cloudflare, Google Public DNS, Quad9 (secure/unfiltered), AdGuard DNS (default/unfiltered) and Mullvad while retaining a custom HTTPS endpoint option.
- Added a
Show DNS Logslogging option, disabled by default; DNS lifecycle/upstream events follow this switch, while raw dnscrypt-proxy resolver probes/RTT diagnostics additionally requireVerbose Logging, and application-level DNS errors remain visible. - Restored severity-aware log highlighting in the WinUI log viewer while keeping selectable text, wrapping control and horizontal scrolling.
- NetworkService helper extraction now uses a stable version/SHA-256 path instead of a PID/GUID path, preventing Windows Firewall from treating every Admin Mode start as a different executable.
- Direct DNS can now use primary/fallback IPv4/IPv6 resolver presets or custom addresses and can optionally route those selected DNS endpoints through the local Shadowsocks SOCKS5 path; with no explicit server, the original DNS destination can also be routed through Shadowsocks.
- Custom DoH now has an independent option to route its HTTPS upstream through the local Shadowsocks SOCKS5 endpoint.
- DNSCrypt resolver UX now shows the active Automatic resolver immediately, keeps ODoH disabled, exposes DNSCrypt/DoH protocol plus country/address-family/privacy filters for manual catalog browsing, measures manual-list latency in the background without blocking the UI, and replaces the active resolver's estimate with DNSCrypt Proxy's actual RTT when available.
- DNSCrypt settings changes are debounced and applied without locking the page; failed manual resolver changes use a bounded rollback and surface the last dnscrypt-proxy upstream error instead of an indefinite loading state.
- DNSCrypt resolver country metadata is derived exclusively from resolver endpoint IPs via batched GeoIP lookup; resolver names/descriptions are never used as geographic hints, and Anycast is neither represented as a pseudo-country nor guessed from description text.
- Final DNS regression pass reuses the verified resolver-source cache for temporary catalog/settings validation processes, removes duplicate DNS-page refreshes during background RTT probing, normalizes legacy manual resolver selections to supported DNSCrypt/DoH entries, and prevents stale manual resolver metadata from being persisted.
- Log rendering now keeps warning/error emphasis on multiline continuation and stack-trace lines and emphasizes the severity token while retaining theme-aware colors.
- DNSCrypt resolver mode is now stored explicitly instead of being inferred from
serverNames; legacy stale manual selections migrate to Automatic, manual DNSCrypt/DoH selections are health-validated before persistence, and Automatic resolves a concrete server from the signed catalog using the configured DNSSEC, no-log, unfiltered and address-family filters instead of bypassing those filters with a Cloudflare-only pin. -
Show Plugin Outputno longer reloads Shadowsocks or restarts SIP003; plugin stdout/stderr is captured asynchronously and filtered dynamically, plugin shutdown waits are bounded, and logging-level toggles no longer restart the network stack. - DNSCrypt install/update candidate validation now verifies the exact candidate version first, then resolves an eligible resolver from that candidate's signed catalog before its runtime health check, so Automatic mode remains provider-neutral without breaking first install or component upgrades.
- Completed the Russian localization audit, corrected misplaced license translations, and added repository validation that rejects CJK/Japanese/Korean text accidentally placed in the
ru-RUcolumn.
- Logs page responsiveness: logging-only switches no longer trigger full page refreshes; log file I/O is background/coalesced and RichTextBlock rendering is capped to prevent UI hangs under verbose/plugin output.
- Fixed an Administrator Mode DNSCrypt leak window: classic UDP/TCP 53 is now fail-closed before DNSCrypt startup, never falls back to plaintext system DNS, and Shadowsocks/SIP003 DNS queries no longer bypass DNSCrypt interception.
- Added signed, managed DNSCrypt Proxy installation from the official
DNSCrypt/dnscrypt-proxyWindows x64 releases, with SHA-256/Minisign verification, safe extraction, resolver selection and rollback-safe activation. - Added health-checked DNSCrypt runtime lifecycle with dynamic loopback ports, non-blocking normal startup, prepared-version
-checkvalidation, crash recovery, Job Object cleanup and optional routing through the local Shadowsocks SOCKS5 endpoint. - Added the DNS page and tray controls for System, Direct, DNS-through-Shadowsocks, Custom DoH and DNSCrypt policies, plus install/update/reinstall/remove, DNSSEC/no-log/no-filter/IPv6, resolver selection, fail-closed policy and automatic component updates.
- Added Administrator Mode transparent UDP/TCP port 53 policy routing through WinDivert for Proxy, Custom DoH and DNSCrypt, while Direct remains direct; DNSCrypt runtime also remains available in User Mode for Shadowsocks-managed hostname resolution.
- Added automatic DNSCrypt update maintenance with a persisted minimum 24-hour check interval; the first component installation remains an explicit user action.
- Added bootstrap recursion protection for DNSCrypt-over-Shadowsocks and hardened WinDivert/CaptureChild fault propagation, UDP/TCP relay lifecycle, runtime rollback and process supervision.
- Added DNSCrypt Clean Mode integration tests and release validators that reject bundled
dnscrypt-proxy, native Minisign/libsodium helpers, invalid DNS policy values and missing third-party notices. - Added embedded project and third-party license notices for the one-file executable, including Bouncy Castle and its modified Bzip2 component.
- Hardened WinDivert acquisition to the fixed official GitHub 2.2.2-A release asset with bounded streaming download, exact x64 archive paths, pinned SHA-256 verification for both x64 runtime payloads and PE architecture validation before loading.
- Added fragment-safe transparent routing: fragmented datagrams that require DNS/proxy rewriting are dropped as a whole instead of partially rewriting the first fragment, while direct fragment flows remain direct.
- Added a read-only WinDivert FLOW-layer ownership observer so new TCP/UDP endpoints are attributed to their process ID before NETWORK-layer routing; IP Helper lookup remains a safe fallback for pre-existing or ambiguous flows.
- Hardened automatic-update clock handling against implausible future timestamps and added a testable Clean Mode session lifecycle with exclusive lock ownership and deterministic tree cleanup.
- Suspend/shutdown now cancels active and queued DNSCrypt management transactions before WinDivert/DNSCrypt teardown and resumes the coordinator only on the next controller start lifecycle.
- Added managed SIP003 plugin storage below the active
Pluginsdirectory; normal mode uses%LOCALAPPDATA%\Shadowsocks\Pluginsand Clean Mode uses its disposable Temp session. - Replaced the application Registry settings backend with atomic
settings.json/settings.backup.jsonunder%LOCALAPPDATA%\Shadowsocks; old Shadowsocks Registry configuration is intentionally ignored. - Localization now uses only the embedded
i18n.csv; external LocalAppData overrides are no longer loaded or migrated. - Added Rufus-style Clean Mode: an executable stem ending in
predirects all writable application state to a disposable%TEMP%\Shadowsocks\Clean\...session and cleans it on Quit. - Added explicit LocalAppData/Clean Mode folder actions to Settings and disabled Start with Windows in Clean Mode at UI, tray, and backend levels.
- Replaced the legacy second-launch Win32 MessageBox with a localized Fluent WinUI
ContentDialogowned by the already-running instance; the existing window is restored/foregrounded first, with an InfoBar fallback if another modal dialog is active. - Fixed global hotkey modifier detection on the WinUI/.NET 10 frontend by using the Win32 key-state path.
- Main-window User/Admin traffic controls now apply immediately like tray commands; Administrator mode carries the UAC shield affordance.
- Product single-file publish removes PDB files copied from referenced projects before validating the one-EXE release layout; normal build symbols remain unchanged.
- Restored historical lower-case percent escapes when generating SIP002
ss://links for compatibility with existing URL tests/links.
- Added a Plugins page with built-in
xray-plugin,v2ray-pluginandqtuninstallation plus manual ZIP/TAR.GZ import; Servers now selects installed plugins from a dropdown and shows Server Name above Server IP. - Added localized WinUI tooltips and matching accessibility help text across navigation, server management, traffic, Game Mode, PAC/GeoSite, online configuration, hotkeys, sharing, logs, settings and update controls.
- Completed all six non-English localization columns (
ru-RU,zh-CN,zh-TW,ja,ko,fr) for every active embedded UI key and added release validation that rejects missing translations or placeholder mismatches. - Moved
Verbose LoggingandShow Plugin Outputto the Logs page, andCheck for Updates at Startupto About & updates. - Updated the pinned dependency graph to Windows App SDK 2.4.0, Microsoft.WindowsAppSDK.WinUI 2.3.6, NLog 6.2.0, Fody 6.9.3, Google.Protobuf 3.35.1, Newtonsoft.Json 13.0.4, System.Drawing.Common 10.0.11, Microsoft.NET.Test.Sdk 18.9.0, Windows SDK BuildTools 10.0.28000.2526, WinUIEx 2.9.3, ZXing.Net 0.16.11, MSTest 4.3.3 and System.Management 10.0.11.
- Updated NLog file archiving to the NLog 6
ArchiveSuffixFormatconfiguration. - Start with Windows now uses a SHA-256-verified copy at
%LOCALAPPDATA%\Shadowsocks\Startup\Shadowsocks.exe; legacy Run entries are migrated and the copy is refreshed when a newer product EXE is launched manually. - Game Mode keeps manual rules and adds optional discovery suggestions from Steam, Epic Games, GOG and Xbox installations.
- Password reveal is hidden for servers imported from
ss://links or online configuration sources; manual server entries retain the option. - Logs toolbar is always visible; the Font command and Show toolbar preference were removed.
- Tray colors were refined for clearer/professional state separation: graphite (Disabled), bronze (Local PAC), forest teal (Online PAC), navy (Global), with muted activity accents.
- Historical limitation in 5.1.0: DNS policy values existed in configuration/IPC, but transparent DNS interception/routing was not yet implemented. This limitation was resolved later; current 2.2.31 Administrator Mode implements transparent UDP/TCP 53 routing.
- Migrated the product to .NET 10, x64 and WinUI 3 / Windows App SDK.
- Retired the legacy WinForms/WPF presentation layer after functional parity was reached.
- Added the Windows 11 Fluent shell, tray-first lifecycle, AppInstance single-instance activation, Mica, navigation, native dialogs/status UI and theme support.
- Migrated localization to
ILocalizationServicebacked by the existing seven-column CSV format.
- Replaced Privoxy with the managed HTTP/HTTPS forwarding path.
- Replaced external sysproxy helpers with Windows integration.
- Added User/Admin traffic modes and transparent TCP/UDP Admin capture through WinDivert.
- Added automatic Game Mode and per-application
Proxy,Direct,Blockrouting. - Added live NetworkService/WinDivert/TCP/UDP capture status in the WinUI Traffic page.
- Preserved PAC/GeoSite, Online Config, SIP003 plugins, QR workflows, hotkeys and UDP relay.
- Moved persistent configuration away from executable-side
gui-config.json; the current backend isISettingsStore/JsonFileSettingsStoreunder LocalAppData. - Added file-backed rollback snapshots and one-time migration backups under
%LOCALAPPDATA%\Shadowsocks\Migration. - Centralized all normal-mode application-owned writable state under
%LOCALAPPDATA%\Shadowsocks; Clean Mode redirects the same logical tree to a disposable%TEMP%\Shadowsocks\Clean\...session. - Removed portable-mode storage semantics that wrote mutable data beside the EXE.
- Added global per-user single-instance behavior to protect shared Windows integration and storage state.
- Embedded the self-contained single-file NetworkService helper into the product and materialized it only on Admin activation with SHA-256 validation, extraction serialization, version handshake and cleanup.
- Added unpackaged, self-contained, win-x64, single-file release packaging with a strict final layout of one
Shadowsocks.exe. - Added repository/release validators, CI packaging checks, storage/deployment tests and read-only/removable-drive validation rules.
- Historical limitation in 5.0.0: DNS policy values existed in configuration/IPC, but transparent DNS interception/routing was not yet implemented. This limitation was resolved later; current 2.2.31 Administrator Mode implements transparent UDP/TCP 53 routing.