UC Mode launches Chromium with stealth flags and applies JavaScript evasions that
mask navigator.webdriver, plugins, WebGL, and other fingerprints. Removing the
automation markers from the chromedriver binary itself is a separate step that
you run yourself (below).
What you will learn
- How to enable UC mode.
- How binary patching removes injected markers.
- How engine spoofing args hide additional automation signals.
- What to do if a site still detects the browser.
Quick enable#
Set the driver mode to Uc in BrowserConfig:
BrowserConfig::default() is headless.
On the command line, sbrs --uc open https://example.com does the same (put
--uc before the subcommand).
UC mode needs Chrome, Chromium or Edge.
Binary patching#
Even in UC mode, a stock chromedriver may inject cdc_ variables into every
page.
UC mode does not patch the driver for you.
Patch the executable before launch to strip those signatures:
See Binary Patching for the full API, backup/restore, and safety notes.
Engine spoofing arguments#
The engine_spoofing_args() helper returns Chromium flags that disable
automation features such as --disable-blink-features=AutomationControlled.
Pass them through BrowserConfig or StealthOptions:
Still detected?#
If a site still flags the browser:
Patch chromedriver
Patch chromedriver and verify needs_patch() returns false.
Add the spoofing arguments
Add engine_spoofing_args() to the launch flags.
Use a coherent fingerprint
Use a Fingerprint with consistent
user agent, platform, screen size, WebGL vendor, and geolocation.
Run headful
Run headful (with_headless(false)). A headless session already starts
Chrome with --headless=new, so there is no newer headless mode to switch to.
Align the egress IP
Align egress IP with the spoofed geolocation and timezone.
Try the pure CDP engine
Try the pure CDP engine, which needs no chromedriver.
Troubleshooting#
Detection after patching
Likely cause: Missing engine args.
Fix: Add engine_spoofing_args() to launch flags.
Detection only in headless
Likely cause: Headless artifacts.
Fix: Run headful with with_headless(false) (or sbrs --headed).
Inconsistent signals
Likely cause: Fingerprint values mismatch.
Fix: Validate with Fingerprint::validate().