xcelerate_core/stealth/
mod.rs1pub mod patcher;
2pub mod process;
3
4pub use patcher::BinaryPatcher;
5pub use process::{spawn_detached, ProcessRegistry};
6
7pub const STEALTH_JS: &str = r#"
8(() => {
9 // 1. Hide navigator.webdriver
10 const newProto = Object.getPrototypeOf(navigator);
11 delete newProto.webdriver;
12 Object.defineProperty(navigator, 'webdriver', {
13 get: () => undefined
14 });
15
16 // 2. Hide Chrome signals (CDC and others)
17 // Overriding the getter for the 'chrome' property if it exists
18 if (!window.chrome) {
19 Object.defineProperty(window, 'chrome', {
20 get: () => ({
21 runtime: {},
22 loadTimes: () => {},
23 csi: () => {},
24 app: {}
25 })
26 });
27 }
28
29 // 3. Mock plugins (scanners check for empty plugins list)
30 if (navigator.plugins.length === 0) {
31 Object.defineProperty(navigator, 'plugins', {
32 get: () => [
33 { name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer' },
34 { name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer' },
35 { name: 'Microsoft Edge PDF Viewer', filename: 'internal-pdf-viewer' },
36 { name: 'PDF Viewer', filename: 'internal-pdf-viewer' },
37 { name: 'WebKit built-in PDF', filename: 'internal-pdf-viewer' }
38 ]
39 });
40 }
41
42 // 4. Mock languages if missing
43 if (!navigator.languages || navigator.languages.length === 0) {
44 Object.defineProperty(navigator, 'languages', {
45 get: () => ['en-US', 'en']
46 });
47 }
48
49 // 5. Hide 'cdc_adoQtmxX78vj7j9v9Kw839' which chromedriver might leave behind
50 // We already patch the binary for this, but this is a runtime safeguard.
51 for (const prop in window) {
52 if (prop.startsWith('cdc_') || prop.startsWith('uniffi_')) {
53 delete window[prop];
54 }
55 }
56})();
57"#;