jumpy-lion 0.0.41 → 0.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +102 -16
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +20 -1
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +21 -1
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +22 -1
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +77 -5
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-profiles/chrome/default.d.ts +116 -0
- package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/default.js +118 -1
- package/dist/browser-profiles/chrome/default.js.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.d.ts +76 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.js +300 -0
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -0
- package/dist/browser-profiles/index.d.ts +1 -0
- package/dist/browser-profiles/index.d.ts.map +1 -1
- package/dist/browser-profiles/index.js +2 -0
- package/dist/browser-profiles/index.js.map +1 -1
- package/dist/crawler.d.ts +32 -1
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +7 -0
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +87 -0
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +1 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js +342 -0
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts +40 -2
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +449 -44
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js +497 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +536 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +16 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +19 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +45 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +291 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +54 -22
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +4 -5
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +413 -70
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +10 -3
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +132 -73
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +55 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +380 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +8 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +417 -71
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js +368 -0
- package/dist/fingerprinting/fingerprint-overrides/storage-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js +438 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js +315 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +13 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +11 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
- package/dist/page.d.ts +12 -0
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +35 -3
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/fingerprinting/canvas-fingerprint.d.ts +0 -4
- package/dist/fingerprinting/canvas-fingerprint.d.ts.map +0 -1
- package/dist/fingerprinting/canvas-fingerprint.js +0 -60
- package/dist/fingerprinting/canvas-fingerprint.js.map +0 -1
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Platform Consistency Script
|
|
3
3
|
* Ensures all browser properties match the specified platform (1:1 fingerprinting)
|
|
4
|
+
*
|
|
5
|
+
* 2024-2025 Enhancements:
|
|
6
|
+
* - Screen orientation API consistency
|
|
7
|
+
* - screen.availLeft/availTop for Windows
|
|
8
|
+
* - visualViewport properties consistency
|
|
9
|
+
* - window.outerWidth/outerHeight ratios
|
|
10
|
+
* - window.screenX/screenY typical values
|
|
11
|
+
* - matchMedia() platform-appropriate results
|
|
4
12
|
*/
|
|
5
13
|
export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
6
14
|
// Platform-specific configurations for 1:1 consistency
|
|
@@ -103,103 +111,129 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
|
103
111
|
// Platform Consistency for ${platform}
|
|
104
112
|
const config = ${JSON.stringify(config)};
|
|
105
113
|
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
// Helper to safely define property with guards
|
|
115
|
+
const safeDefineProperty = (obj, prop, getter) => {
|
|
116
|
+
try {
|
|
117
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
118
|
+
if (descriptor && descriptor.configurable === false) {
|
|
119
|
+
return false; // Property already defined as non-configurable
|
|
120
|
+
}
|
|
121
|
+
Object.defineProperty(obj, prop, {
|
|
122
|
+
get: getter,
|
|
123
|
+
configurable: true, // Allow other scripts to modify if needed
|
|
124
|
+
enumerable: true
|
|
125
|
+
});
|
|
126
|
+
return true;
|
|
127
|
+
} catch (e) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Override navigator properties for platform consistency (with guards)
|
|
133
|
+
safeDefineProperty(navigator, 'platform', () => config.platform);
|
|
134
|
+
safeDefineProperty(navigator, 'vendor', () => config.vendor);
|
|
135
|
+
safeDefineProperty(navigator, 'vendorSub', () => config.vendorSub);
|
|
136
|
+
safeDefineProperty(navigator, 'productSub', () => config.productSub);
|
|
137
|
+
safeDefineProperty(navigator, 'hardwareConcurrency', () => config.hardwareConcurrency);
|
|
138
|
+
safeDefineProperty(navigator, 'maxTouchPoints', () => config.maxTouchPoints);
|
|
139
|
+
safeDefineProperty(navigator, 'cookieEnabled', () => config.cookieEnabled);
|
|
140
|
+
safeDefineProperty(navigator, 'onLine', () => config.onLine);
|
|
141
|
+
safeDefineProperty(navigator, 'language', () => config.language);
|
|
142
|
+
safeDefineProperty(navigator, 'languages', () => config.languages);
|
|
117
143
|
|
|
118
144
|
// Additional navigator properties for Windows consistency
|
|
119
145
|
if (config.userAgent) {
|
|
120
|
-
|
|
146
|
+
safeDefineProperty(navigator, 'userAgent', () => config.userAgent);
|
|
121
147
|
}
|
|
122
148
|
if (config.appVersion) {
|
|
123
|
-
|
|
149
|
+
safeDefineProperty(navigator, 'appVersion', () => config.appVersion);
|
|
124
150
|
}
|
|
125
151
|
if (config.appName) {
|
|
126
|
-
|
|
152
|
+
safeDefineProperty(navigator, 'appName', () => config.appName);
|
|
127
153
|
}
|
|
128
154
|
if (config.appCodeName) {
|
|
129
|
-
|
|
155
|
+
safeDefineProperty(navigator, 'appCodeName', () => config.appCodeName);
|
|
130
156
|
}
|
|
131
157
|
if (config.product) {
|
|
132
|
-
|
|
158
|
+
safeDefineProperty(navigator, 'product', () => config.product);
|
|
133
159
|
}
|
|
134
160
|
if (config.oscpu !== undefined) {
|
|
135
|
-
|
|
161
|
+
safeDefineProperty(navigator, 'oscpu', () => config.oscpu);
|
|
136
162
|
}
|
|
137
163
|
|
|
138
|
-
// Override navigator.plugins for Windows consistency
|
|
164
|
+
// Override navigator.plugins for Windows consistency (with guards)
|
|
139
165
|
if (config.plugins) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
});
|
|
166
|
+
const pluginsGetter = () => {
|
|
167
|
+
const arr = Object.create(PluginArray.prototype);
|
|
168
|
+
config.plugins.forEach((p, i) => {
|
|
169
|
+
const plugin = Object.create(Plugin.prototype);
|
|
170
|
+
// Use Object.defineProperty for read-only properties
|
|
171
|
+
Object.defineProperty(plugin, 'name', { value: p.name, writable: false, enumerable: true });
|
|
172
|
+
Object.defineProperty(plugin, 'filename', { value: p.filename, writable: false, enumerable: true });
|
|
173
|
+
Object.defineProperty(plugin, 'description', { value: p.description, writable: false, enumerable: true });
|
|
174
|
+
Object.defineProperty(plugin, 'length', { value: 1, writable: false, enumerable: true });
|
|
175
|
+
plugin[0] = config.mimeTypes?.[i] || { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' };
|
|
176
|
+
arr[i] = plugin;
|
|
177
|
+
arr[p.name] = plugin;
|
|
178
|
+
});
|
|
179
|
+
// Use Object.defineProperty for length (PluginArray.prototype.length is read-only)
|
|
180
|
+
Object.defineProperty(arr, 'length', { value: config.plugins.length, writable: false, enumerable: true });
|
|
181
|
+
Object.defineProperty(arr, 'item', { value: (index) => arr[index] || null, writable: false, enumerable: false });
|
|
182
|
+
Object.defineProperty(arr, 'namedItem', { value: (name) => arr[name] || null, writable: false, enumerable: false });
|
|
183
|
+
Object.defineProperty(arr, 'refresh', { value: () => {}, writable: false, enumerable: false });
|
|
184
|
+
return arr;
|
|
185
|
+
};
|
|
186
|
+
safeDefineProperty(navigator, 'plugins', pluginsGetter);
|
|
162
187
|
}
|
|
163
188
|
|
|
164
|
-
// Override navigator.mimeTypes for Windows consistency
|
|
189
|
+
// Override navigator.mimeTypes for Windows consistency (with guards)
|
|
165
190
|
if (config.mimeTypes) {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
});
|
|
191
|
+
const mimeTypesGetter = () => {
|
|
192
|
+
const arr = Object.create(MimeTypeArray.prototype);
|
|
193
|
+
config.mimeTypes.forEach((m, i) => {
|
|
194
|
+
const mimeType = Object.create(MimeType.prototype);
|
|
195
|
+
// Use Object.defineProperty for read-only properties
|
|
196
|
+
Object.defineProperty(mimeType, 'type', { value: m.type, writable: false, enumerable: true });
|
|
197
|
+
Object.defineProperty(mimeType, 'suffixes', { value: m.suffixes, writable: false, enumerable: true });
|
|
198
|
+
Object.defineProperty(mimeType, 'description', { value: m.description, writable: false, enumerable: true });
|
|
199
|
+
Object.defineProperty(mimeType, 'enabledPlugin', { value: config.plugins?.[0] || null, writable: false, enumerable: true });
|
|
200
|
+
arr[i] = mimeType;
|
|
201
|
+
arr[m.type] = mimeType;
|
|
202
|
+
});
|
|
203
|
+
// Use Object.defineProperty for length (MimeTypeArray.prototype.length is read-only)
|
|
204
|
+
Object.defineProperty(arr, 'length', { value: config.mimeTypes.length, writable: false, enumerable: true });
|
|
205
|
+
Object.defineProperty(arr, 'item', { value: (index) => arr[index] || null, writable: false, enumerable: false });
|
|
206
|
+
Object.defineProperty(arr, 'namedItem', { value: (name) => arr[name] || null, writable: false, enumerable: false });
|
|
207
|
+
return arr;
|
|
208
|
+
};
|
|
209
|
+
safeDefineProperty(navigator, 'mimeTypes', mimeTypesGetter);
|
|
186
210
|
}
|
|
187
211
|
|
|
188
212
|
// Override navigator.connection for Windows consistency
|
|
213
|
+
// Note: Some connection properties (like downlink, rtt) are non-configurable in Chrome
|
|
189
214
|
if (config.connection && navigator.connection) {
|
|
190
215
|
Object.keys(config.connection).forEach(key => {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
216
|
+
try {
|
|
217
|
+
const descriptor = Object.getOwnPropertyDescriptor(navigator.connection, key);
|
|
218
|
+
if (descriptor && descriptor.configurable === false) {
|
|
219
|
+
// Property is non-configurable, skip it
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
Object.defineProperty(navigator.connection, key, {
|
|
223
|
+
value: config.connection[key],
|
|
224
|
+
writable: false,
|
|
225
|
+
configurable: true
|
|
226
|
+
});
|
|
227
|
+
} catch (e) {
|
|
228
|
+
// Silently ignore non-configurable properties
|
|
229
|
+
}
|
|
196
230
|
});
|
|
197
231
|
}
|
|
198
232
|
|
|
199
|
-
// Override screen properties
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
233
|
+
// Override screen properties (with guards)
|
|
234
|
+
safeDefineProperty(window, 'devicePixelRatio', () => config.devicePixelRatio);
|
|
235
|
+
safeDefineProperty(screen, 'colorDepth', () => config.colorDepth);
|
|
236
|
+
safeDefineProperty(screen, 'pixelDepth', () => config.screenDepth || config.colorDepth);
|
|
203
237
|
|
|
204
238
|
// Ensure WebGL returns platform-appropriate values
|
|
205
239
|
const getParameterProto = WebGLRenderingContext.prototype.getParameter;
|
|
@@ -222,6 +256,315 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
|
222
256
|
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
223
257
|
WebGL2RenderingContext.prototype.getParameter = WebGLRenderingContext.prototype.getParameter;
|
|
224
258
|
}
|
|
259
|
+
|
|
260
|
+
// ========== 2024-2025 Enhanced Platform Consistency ==========
|
|
261
|
+
|
|
262
|
+
// Screen Orientation API Consistency
|
|
263
|
+
const spoofScreenOrientation = () => {
|
|
264
|
+
if (screen.orientation) {
|
|
265
|
+
Object.defineProperty(screen.orientation, 'type', {
|
|
266
|
+
get: () => 'landscape-primary',
|
|
267
|
+
configurable: true,
|
|
268
|
+
enumerable: true
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
Object.defineProperty(screen.orientation, 'angle', {
|
|
272
|
+
get: () => 0,
|
|
273
|
+
configurable: true,
|
|
274
|
+
enumerable: true
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// Screen availLeft/availTop for Windows (taskbar consideration)
|
|
280
|
+
const spoofScreenAvailability = () => {
|
|
281
|
+
const screenConfig = {
|
|
282
|
+
'Win32': {
|
|
283
|
+
availLeft: 0,
|
|
284
|
+
availTop: 0,
|
|
285
|
+
availWidth: screen.width || 1920,
|
|
286
|
+
availHeight: (screen.height || 1080) - 40 // Windows taskbar ~40px
|
|
287
|
+
},
|
|
288
|
+
'MacIntel': {
|
|
289
|
+
availLeft: 0,
|
|
290
|
+
availTop: 25, // macOS menu bar
|
|
291
|
+
availWidth: screen.width || 1920,
|
|
292
|
+
availHeight: (screen.height || 1080) - 25
|
|
293
|
+
},
|
|
294
|
+
'Linux x86_64': {
|
|
295
|
+
availLeft: 0,
|
|
296
|
+
availTop: 0,
|
|
297
|
+
availWidth: screen.width || 1920,
|
|
298
|
+
availHeight: (screen.height || 1080) - 30 // GNOME panel
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
const screenVals = screenConfig[config.platform] || screenConfig['Win32'];
|
|
303
|
+
|
|
304
|
+
Object.defineProperty(screen, 'availLeft', {
|
|
305
|
+
get: () => screenVals.availLeft,
|
|
306
|
+
configurable: true,
|
|
307
|
+
enumerable: true
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
Object.defineProperty(screen, 'availTop', {
|
|
311
|
+
get: () => screenVals.availTop,
|
|
312
|
+
configurable: true,
|
|
313
|
+
enumerable: true
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
Object.defineProperty(screen, 'availWidth', {
|
|
317
|
+
get: () => screenVals.availWidth,
|
|
318
|
+
configurable: true,
|
|
319
|
+
enumerable: true
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
Object.defineProperty(screen, 'availHeight', {
|
|
323
|
+
get: () => screenVals.availHeight,
|
|
324
|
+
configurable: true,
|
|
325
|
+
enumerable: true
|
|
326
|
+
});
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
// Visual Viewport consistency
|
|
330
|
+
const spoofVisualViewport = () => {
|
|
331
|
+
if (window.visualViewport) {
|
|
332
|
+
const originalViewport = window.visualViewport;
|
|
333
|
+
|
|
334
|
+
// Ensure consistent values
|
|
335
|
+
Object.defineProperty(originalViewport, 'scale', {
|
|
336
|
+
get: () => 1,
|
|
337
|
+
configurable: true
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
Object.defineProperty(originalViewport, 'offsetLeft', {
|
|
341
|
+
get: () => 0,
|
|
342
|
+
configurable: true
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
Object.defineProperty(originalViewport, 'offsetTop', {
|
|
346
|
+
get: () => 0,
|
|
347
|
+
configurable: true
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
Object.defineProperty(originalViewport, 'pageLeft', {
|
|
351
|
+
get: () => window.scrollX || 0,
|
|
352
|
+
configurable: true
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
Object.defineProperty(originalViewport, 'pageTop', {
|
|
356
|
+
get: () => window.scrollY || 0,
|
|
357
|
+
configurable: true
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// Window outer dimensions (browser chrome size)
|
|
363
|
+
const spoofWindowDimensions = () => {
|
|
364
|
+
const outerConfig = {
|
|
365
|
+
'Win32': {
|
|
366
|
+
outerWidthOffset: 16, // Windows chrome borders
|
|
367
|
+
outerHeightOffset: 92 // Title bar + tabs + bookmarks
|
|
368
|
+
},
|
|
369
|
+
'MacIntel': {
|
|
370
|
+
outerWidthOffset: 0, // macOS has no side borders
|
|
371
|
+
outerHeightOffset: 87 // Title bar + tabs
|
|
372
|
+
},
|
|
373
|
+
'Linux x86_64': {
|
|
374
|
+
outerWidthOffset: 2, // Minimal borders
|
|
375
|
+
outerHeightOffset: 85 // GNOME decorations
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
const dimConfig = outerConfig[config.platform] || outerConfig['Win32'];
|
|
380
|
+
|
|
381
|
+
Object.defineProperty(window, 'outerWidth', {
|
|
382
|
+
get: () => window.innerWidth + dimConfig.outerWidthOffset,
|
|
383
|
+
configurable: true,
|
|
384
|
+
enumerable: true
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
Object.defineProperty(window, 'outerHeight', {
|
|
388
|
+
get: () => window.innerHeight + dimConfig.outerHeightOffset,
|
|
389
|
+
configurable: true,
|
|
390
|
+
enumerable: true
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
// Window screen position
|
|
395
|
+
const spoofWindowPosition = () => {
|
|
396
|
+
const posConfig = {
|
|
397
|
+
'Win32': { screenX: 0, screenY: 0 },
|
|
398
|
+
'MacIntel': { screenX: 0, screenY: 25 }, // Below menu bar
|
|
399
|
+
'Linux x86_64': { screenX: 0, screenY: 0 }
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
const pos = posConfig[config.platform] || posConfig['Win32'];
|
|
403
|
+
|
|
404
|
+
Object.defineProperty(window, 'screenX', {
|
|
405
|
+
get: () => pos.screenX,
|
|
406
|
+
configurable: true,
|
|
407
|
+
enumerable: true
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
Object.defineProperty(window, 'screenY', {
|
|
411
|
+
get: () => pos.screenY,
|
|
412
|
+
configurable: true,
|
|
413
|
+
enumerable: true
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
Object.defineProperty(window, 'screenLeft', {
|
|
417
|
+
get: () => pos.screenX,
|
|
418
|
+
configurable: true,
|
|
419
|
+
enumerable: true
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
Object.defineProperty(window, 'screenTop', {
|
|
423
|
+
get: () => pos.screenY,
|
|
424
|
+
configurable: true,
|
|
425
|
+
enumerable: true
|
|
426
|
+
});
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
// matchMedia platform-specific behavior
|
|
430
|
+
const spoofMatchMedia = () => {
|
|
431
|
+
const originalMatchMedia = window.matchMedia;
|
|
432
|
+
|
|
433
|
+
window.matchMedia = function(query) {
|
|
434
|
+
const result = originalMatchMedia.call(this, query);
|
|
435
|
+
|
|
436
|
+
// Platform-specific media query handling
|
|
437
|
+
if (query.includes('prefers-color-scheme')) {
|
|
438
|
+
// Default to light mode (most common)
|
|
439
|
+
const isDark = query.includes('dark');
|
|
440
|
+
return new Proxy(result, {
|
|
441
|
+
get(target, prop) {
|
|
442
|
+
if (prop === 'matches') {
|
|
443
|
+
return !isDark; // Most users use light mode
|
|
444
|
+
}
|
|
445
|
+
return target[prop];
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (query.includes('prefers-reduced-motion')) {
|
|
451
|
+
// Most users don't have reduced motion
|
|
452
|
+
return new Proxy(result, {
|
|
453
|
+
get(target, prop) {
|
|
454
|
+
if (prop === 'matches') {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
return target[prop];
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (query.includes('prefers-contrast')) {
|
|
463
|
+
// Most users use default contrast
|
|
464
|
+
return new Proxy(result, {
|
|
465
|
+
get(target, prop) {
|
|
466
|
+
if (prop === 'matches') {
|
|
467
|
+
return query.includes('no-preference');
|
|
468
|
+
}
|
|
469
|
+
return target[prop];
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (query.includes('pointer')) {
|
|
475
|
+
// Desktop platforms have fine pointer (mouse)
|
|
476
|
+
const hasFinePointer = config.platform !== 'Android' && config.maxTouchPoints === 0;
|
|
477
|
+
return new Proxy(result, {
|
|
478
|
+
get(target, prop) {
|
|
479
|
+
if (prop === 'matches') {
|
|
480
|
+
if (query.includes('fine')) return hasFinePointer;
|
|
481
|
+
if (query.includes('coarse')) return !hasFinePointer;
|
|
482
|
+
if (query.includes('none')) return false;
|
|
483
|
+
}
|
|
484
|
+
return target[prop];
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (query.includes('hover')) {
|
|
490
|
+
// Desktop platforms support hover
|
|
491
|
+
return new Proxy(result, {
|
|
492
|
+
get(target, prop) {
|
|
493
|
+
if (prop === 'matches') {
|
|
494
|
+
return query.includes('hover') && !query.includes('none');
|
|
495
|
+
}
|
|
496
|
+
return target[prop];
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
return result;
|
|
502
|
+
};
|
|
503
|
+
};
|
|
504
|
+
|
|
505
|
+
// ScreenDetails API (multi-monitor detection)
|
|
506
|
+
const spoofScreenDetails = () => {
|
|
507
|
+
if ('getScreenDetails' in window) {
|
|
508
|
+
window.getScreenDetails = function() {
|
|
509
|
+
return Promise.resolve({
|
|
510
|
+
screens: [{
|
|
511
|
+
availHeight: screen.availHeight,
|
|
512
|
+
availWidth: screen.availWidth,
|
|
513
|
+
availLeft: 0,
|
|
514
|
+
availTop: 0,
|
|
515
|
+
colorDepth: config.colorDepth || 24,
|
|
516
|
+
devicePixelRatio: config.devicePixelRatio || 1,
|
|
517
|
+
height: screen.height,
|
|
518
|
+
width: screen.width,
|
|
519
|
+
isExtended: false,
|
|
520
|
+
isPrimary: true,
|
|
521
|
+
label: 'Primary Display',
|
|
522
|
+
left: 0,
|
|
523
|
+
orientation: screen.orientation || { angle: 0, type: 'landscape-primary' },
|
|
524
|
+
pixelDepth: config.screenDepth || 24,
|
|
525
|
+
top: 0
|
|
526
|
+
}],
|
|
527
|
+
currentScreen: null,
|
|
528
|
+
onscreenschange: null,
|
|
529
|
+
oncurrentscreenchange: null,
|
|
530
|
+
addEventListener: () => {},
|
|
531
|
+
removeEventListener: () => {}
|
|
532
|
+
});
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
// Initialize all enhanced spoofing
|
|
538
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
539
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
540
|
+
|
|
541
|
+
console.log(DEBUG_PREFIX, 'Starting platform consistency overrides for:', config.platform);
|
|
542
|
+
|
|
543
|
+
const applyConsistency = (name, fn) => {
|
|
544
|
+
try {
|
|
545
|
+
fn();
|
|
546
|
+
console.log(DEBUG_PREFIX, \`✓ Applied \${name}\`);
|
|
547
|
+
return true;
|
|
548
|
+
} catch (e) {
|
|
549
|
+
console.error(ERROR_PREFIX, \`✗ Failed to apply \${name}:\`, e);
|
|
550
|
+
throw e; // Rethrow to make errors visible
|
|
551
|
+
}
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
try {
|
|
555
|
+
applyConsistency('Screen Orientation', spoofScreenOrientation);
|
|
556
|
+
applyConsistency('Screen Availability', spoofScreenAvailability);
|
|
557
|
+
applyConsistency('Visual Viewport', spoofVisualViewport);
|
|
558
|
+
applyConsistency('Window Dimensions', spoofWindowDimensions);
|
|
559
|
+
applyConsistency('Window Position', spoofWindowPosition);
|
|
560
|
+
applyConsistency('Match Media', spoofMatchMedia);
|
|
561
|
+
applyConsistency('Screen Details API', spoofScreenDetails);
|
|
562
|
+
|
|
563
|
+
console.log(DEBUG_PREFIX, \`✓ Platform consistency complete for \${config.platform}\`);
|
|
564
|
+
} catch (e) {
|
|
565
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply platform consistency:', e);
|
|
566
|
+
throw e; // Rethrow to make errors visible
|
|
567
|
+
}
|
|
225
568
|
})();`;
|
|
226
569
|
};
|
|
227
570
|
//# sourceMappingURL=platform-consistency.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Runtime.enable Bypass
|
|
3
|
-
* Prevents CDP detection through console.log(Error) technique
|
|
2
|
+
* Runtime.enable Bypass Script
|
|
3
|
+
* Prevents CDP detection through console.log(Error) technique and stack trace analysis.
|
|
4
|
+
*
|
|
5
|
+
* IMPORTANT: This is now a SCRIPT to be injected via addScriptToEvaluateOnNewDocument,
|
|
6
|
+
* NOT via Runtime.evaluate (which would defeat the purpose since Runtime.evaluate IS detectable!)
|
|
4
7
|
*/
|
|
5
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Creates the runtime enable bypass script that should be bundled with other stealth scripts.
|
|
10
|
+
* This script runs BEFORE page JavaScript and patches Error/console to hide CDP markers.
|
|
11
|
+
*/
|
|
12
|
+
export declare const createRuntimeEnableBypassScript: () => string;
|
|
6
13
|
//# sourceMappingURL=runtime-enable-bypass.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-enable-bypass.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/runtime-enable-bypass.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"runtime-enable-bypass.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/runtime-enable-bypass.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QAAO,MAkIlD,CAAC"}
|