jumpy-lion 0.1.1 → 0.1.2
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 +22 -3
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +316 -71
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +56 -7
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +268 -56
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +39 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +125 -16
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/process.d.ts +9 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +100 -6
- package/dist/browser-process/process.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 +81 -9
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +26 -10
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/all-fingerprint-defender/_locales/en/messages.json +95 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-16ff15da.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-1a1456ec.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts +83 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-3a7b59dd.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-7ce85519.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-aaea1190.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-b4410958.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts +2 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.d.ts.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/chunk-dfed3562.js.map +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/debounce-09920c81.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/options-fe2fb5aa.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/assets/popup-1886d2ef.css +1 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-128.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-16.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-24.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-32-disabled.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-32.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/img/icon-48.png +0 -0
- package/dist/fingerprinting/all-fingerprint-defender/manifest.json +83 -0
- package/dist/fingerprinting/all-fingerprint-defender/options.html +17 -0
- package/dist/fingerprinting/all-fingerprint-defender/popup.html +23 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/background.js +4 -0
- package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
- 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 +157 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-injector.js +632 -0
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +119 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +149 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
- 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 +763 -0
- package/dist/fingerprinting/fingerprint-overrides/cdp-detection-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +195 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts +10 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +195 -0
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +28 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +1181 -0
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +171 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +36 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js +40 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
- 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 +268 -0
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +301 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +58 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +249 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +33 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +618 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts +13 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js +356 -0
- package/dist/fingerprinting/fingerprint-overrides/prototype-integrity.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +171 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
- 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 +244 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +925 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
- 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 +346 -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 +264 -0
- package/dist/fingerprinting/fingerprint-overrides/timing-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +27 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +213 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.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 +517 -0
- package/dist/fingerprinting/fingerprint-overrides/utils.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +215 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +202 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +188 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/launcher-wrap.d.ts +2 -2
- package/dist/launcher-wrap.d.ts.map +1 -1
- package/dist/launcher-wrap.js.map +1 -1
- package/dist/page.d.ts +160 -13
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +1027 -42
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGL Fingerprinting Protection
|
|
3
|
+
* Platform-aware GPU spoofing for WebGL contexts
|
|
4
|
+
*/
|
|
5
|
+
export const createWebGLSpoofingScript = (fingerprintWebGL) => {
|
|
6
|
+
// If fingerprint data is provided, use it; otherwise use platform-based defaults
|
|
7
|
+
const useFingerprint = fingerprintWebGL && (fingerprintWebGL.vendorUnmasked || fingerprintWebGL.rendererUnmasked);
|
|
8
|
+
return `
|
|
9
|
+
(() => {
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
// WebGL Spoofing for 2025 - Platform-aware
|
|
13
|
+
const spoofWebGL = () => {
|
|
14
|
+
const getParameterProto = WebGLRenderingContext.prototype.getParameter;
|
|
15
|
+
const getExtensionProto = WebGLRenderingContext.prototype.getExtension;
|
|
16
|
+
const getSupportedExtensionsProto = WebGLRenderingContext.prototype.getSupportedExtensions;
|
|
17
|
+
|
|
18
|
+
${useFingerprint ? `
|
|
19
|
+
// Use fingerprint-provided WebGL values
|
|
20
|
+
const fingerprintConfig = ${JSON.stringify(fingerprintWebGL)};
|
|
21
|
+
const selectedVendor = fingerprintConfig.vendorUnmasked || fingerprintConfig.vendor || 'Intel Inc.';
|
|
22
|
+
const selectedRenderer = fingerprintConfig.rendererUnmasked || fingerprintConfig.renderer || 'Intel Iris OpenGL Engine';
|
|
23
|
+
console.log('[CDP-FP-DEBUG] WebGL using fingerprint data - Vendor:', selectedVendor, 'Renderer:', selectedRenderer.substring(0, 50));
|
|
24
|
+
` : `
|
|
25
|
+
// Detect platform from navigator
|
|
26
|
+
const platform = navigator.platform || 'Win32';
|
|
27
|
+
|
|
28
|
+
// Platform-specific GPU configurations - 2024-2025 updated
|
|
29
|
+
// IMPORTANT: Windows GPU strings must follow the exact Chrome ANGLE format
|
|
30
|
+
const gpuConfigs = {
|
|
31
|
+
'Win32': {
|
|
32
|
+
// Windows uses "Google Inc. (VENDOR)" format for vendor
|
|
33
|
+
vendors: [
|
|
34
|
+
'Google Inc. (NVIDIA)',
|
|
35
|
+
'Google Inc. (AMD)',
|
|
36
|
+
'Google Inc. (Intel)'
|
|
37
|
+
],
|
|
38
|
+
// Windows renderers use Direct3D11 format - authentic Chrome strings
|
|
39
|
+
renderers: [
|
|
40
|
+
'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
41
|
+
'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
42
|
+
'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
43
|
+
'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
44
|
+
'ANGLE (AMD, AMD Radeon RX 6600 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
45
|
+
'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
46
|
+
'ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
47
|
+
'ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
48
|
+
'ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)',
|
|
49
|
+
],
|
|
50
|
+
vendorPairs: [
|
|
51
|
+
{ vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)' },
|
|
52
|
+
{ vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
|
|
53
|
+
{ vendor: 'Google Inc. (AMD)', renderer: 'ANGLE (AMD, AMD Radeon RX 6700 XT Direct3D11 vs_5_0 ps_5_0, D3D11)' },
|
|
54
|
+
{ vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel, Intel(R) UHD Graphics 630 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
|
|
55
|
+
{ vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce RTX 4060 Direct3D11 vs_5_0 ps_5_0, D3D11)' },
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
'MacIntel': {
|
|
59
|
+
vendors: ['Google Inc. (Apple)', 'Google Inc. (Intel)', 'Google Inc. (AMD)'],
|
|
60
|
+
renderers: [
|
|
61
|
+
'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)',
|
|
62
|
+
'ANGLE (Apple, Apple M2, OpenGL 4.1)',
|
|
63
|
+
'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)',
|
|
64
|
+
'ANGLE (AMD, AMD Radeon Pro 5500M OpenGL Engine, OpenGL 4.1)',
|
|
65
|
+
],
|
|
66
|
+
vendorPairs: [
|
|
67
|
+
{ vendor: 'Google Inc. (Apple)', renderer: 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)' },
|
|
68
|
+
{ vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel Inc., Intel(R) Iris(TM) Plus Graphics OpenGL Engine, OpenGL 4.1)' },
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
'Linux x86_64': {
|
|
72
|
+
vendors: ['Google Inc. (Intel)', 'Google Inc. (NVIDIA)', 'Google Inc. (AMD)'],
|
|
73
|
+
renderers: [
|
|
74
|
+
'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)',
|
|
75
|
+
'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)',
|
|
76
|
+
'ANGLE (AMD, AMD Radeon RX 6600 (NAVY_FLOUNDER, DRM 3.42.0, 5.15.0-56-generic, LLVM 12.0.0), OpenGL 4.6)',
|
|
77
|
+
],
|
|
78
|
+
vendorPairs: [
|
|
79
|
+
{ vendor: 'Google Inc. (Intel)', renderer: 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630 (CFL GT2), OpenGL 4.6)' },
|
|
80
|
+
{ vendor: 'Google Inc. (NVIDIA)', renderer: 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2, OpenGL 4.6)' },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Default to Windows for better anti-bot evasion (most common platform)
|
|
86
|
+
const config = gpuConfigs[platform] || gpuConfigs['Win32'];
|
|
87
|
+
|
|
88
|
+
// Select a consistent vendor/renderer pair per session.
|
|
89
|
+
// Use Date.now() XOR'd with UA hash so different sessions get different GPUs
|
|
90
|
+
// even with the same user agent (avoids mass correlation).
|
|
91
|
+
const uaHash = (navigator.userAgent || '').split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0);
|
|
92
|
+
const sessionSeed = (Date.now() ^ uaHash) >>> 0;
|
|
93
|
+
const seededIdx = sessionSeed % config.vendorPairs.length;
|
|
94
|
+
const selectedPair = config.vendorPairs[seededIdx];
|
|
95
|
+
const selectedVendor = selectedPair.vendor;
|
|
96
|
+
const selectedRenderer = selectedPair.renderer;
|
|
97
|
+
|
|
98
|
+
console.log('[CDP-FP-DEBUG] WebGL using platform:', platform, '- Vendor:', selectedVendor, 'Renderer:', selectedRenderer.substring(0, 60) + '...');
|
|
99
|
+
`}
|
|
100
|
+
|
|
101
|
+
// Override getParameter
|
|
102
|
+
WebGLRenderingContext.prototype.getParameter = function(param) {
|
|
103
|
+
// UNMASKED_VENDOR_WEBGL
|
|
104
|
+
if (param === 0x9245) {
|
|
105
|
+
return selectedVendor;
|
|
106
|
+
}
|
|
107
|
+
// UNMASKED_RENDERER_WEBGL
|
|
108
|
+
if (param === 0x9246) {
|
|
109
|
+
return selectedRenderer;
|
|
110
|
+
}
|
|
111
|
+
// Standard WebGL parameters - use fingerprint values if available
|
|
112
|
+
if (param === 0x1F00) { // VENDOR
|
|
113
|
+
return ${useFingerprint && fingerprintWebGL?.vendor ? `'${fingerprintWebGL.vendor}'` : "'WebKit'"};
|
|
114
|
+
}
|
|
115
|
+
if (param === 0x1F01) { // RENDERER
|
|
116
|
+
return ${useFingerprint && fingerprintWebGL?.renderer ? `'${fingerprintWebGL.renderer}'` : "'WebKit WebGL'"};
|
|
117
|
+
}
|
|
118
|
+
if (param === 0x1F02) { // VERSION
|
|
119
|
+
return 'WebGL 1.0 (OpenGL ES 2.0 Chromium)';
|
|
120
|
+
}
|
|
121
|
+
// MAX_TEXTURE_SIZE
|
|
122
|
+
if (param === 0x0D33) {
|
|
123
|
+
return 16384;
|
|
124
|
+
}
|
|
125
|
+
// MAX_VIEWPORT_DIMS
|
|
126
|
+
if (param === 0x0D3A) {
|
|
127
|
+
return new Int32Array([32767, 32767]);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return getParameterProto.apply(this, arguments);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Also apply to WebGL2
|
|
134
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
135
|
+
WebGL2RenderingContext.prototype.getParameter = function(param) {
|
|
136
|
+
// For WebGL2, return appropriate version
|
|
137
|
+
if (param === 0x1F02) { // VERSION
|
|
138
|
+
return 'WebGL 2.0 (OpenGL ES 3.0 Chromium)';
|
|
139
|
+
}
|
|
140
|
+
// Use same logic as WebGL1 for other params
|
|
141
|
+
return WebGLRenderingContext.prototype.getParameter.call(this, param);
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Override getSupportedExtensions with platform-appropriate extensions
|
|
146
|
+
const baseExtensions = [
|
|
147
|
+
'ANGLE_instanced_arrays', 'EXT_blend_minmax', 'EXT_color_buffer_half_float',
|
|
148
|
+
'EXT_disjoint_timer_query', 'EXT_float_blend', 'EXT_frag_depth',
|
|
149
|
+
'EXT_shader_texture_lod', 'EXT_texture_compression_rgtc',
|
|
150
|
+
'EXT_texture_filter_anisotropic', 'EXT_sRGB', 'KHR_parallel_shader_compile',
|
|
151
|
+
'OES_element_index_uint', 'OES_fbo_render_mipmap', 'OES_standard_derivatives',
|
|
152
|
+
'OES_texture_float', 'OES_texture_float_linear', 'OES_texture_half_float',
|
|
153
|
+
'OES_texture_half_float_linear', 'OES_vertex_array_object', 'WEBGL_color_buffer_float',
|
|
154
|
+
'WEBGL_compressed_texture_s3tc', 'WEBGL_compressed_texture_s3tc_srgb',
|
|
155
|
+
'WEBGL_debug_renderer_info', 'WEBGL_debug_shaders', 'WEBGL_depth_texture',
|
|
156
|
+
'WEBGL_draw_buffers', 'WEBGL_lose_context', 'WEBGL_multi_draw'
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
${!useFingerprint ? `
|
|
160
|
+
// Add platform-specific extensions
|
|
161
|
+
const platformExtensions = {
|
|
162
|
+
'Win32': ['EXT_texture_compression_bptc', 'WEBGL_compressed_texture_astc'],
|
|
163
|
+
'MacIntel': ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc'],
|
|
164
|
+
'Linux x86_64': ['EXT_texture_compression_bptc'],
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const allExtensions = [...baseExtensions, ...(platformExtensions[platform] || [])];
|
|
168
|
+
` : `
|
|
169
|
+
const allExtensions = baseExtensions;
|
|
170
|
+
`}
|
|
171
|
+
|
|
172
|
+
WebGLRenderingContext.prototype.getSupportedExtensions = function() {
|
|
173
|
+
return allExtensions;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
177
|
+
WebGL2RenderingContext.prototype.getSupportedExtensions = function() {
|
|
178
|
+
return [...allExtensions, 'EXT_color_buffer_float', 'EXT_disjoint_timer_query_webgl2', 'WEBGL_compressed_texture_etc'];
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Override getExtension to handle WEBGL_debug_renderer_info properly
|
|
183
|
+
WebGLRenderingContext.prototype.getExtension = function(name) {
|
|
184
|
+
const result = getExtensionProto.apply(this, arguments);
|
|
185
|
+
|
|
186
|
+
if (name === 'WEBGL_debug_renderer_info' && result) {
|
|
187
|
+
// Return the extension but ensure our spoofed values are used
|
|
188
|
+
return {
|
|
189
|
+
UNMASKED_VENDOR_WEBGL: 0x9245,
|
|
190
|
+
UNMASKED_RENDERER_WEBGL: 0x9246,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return result;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
198
|
+
WebGL2RenderingContext.prototype.getExtension = WebGLRenderingContext.prototype.getExtension;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
203
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
console.log(DEBUG_PREFIX, 'Starting WebGL spoofing...');
|
|
207
|
+
spoofWebGL();
|
|
208
|
+
console.log(DEBUG_PREFIX, '✓ WebGL spoofing applied');
|
|
209
|
+
} catch (e) {
|
|
210
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply WebGL spoofing:', e);
|
|
211
|
+
throw e; // Rethrow to make errors visible
|
|
212
|
+
}
|
|
213
|
+
})();`;
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=webgl-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgl-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,gBAA8B,EAAU,EAAE;IAChF,iFAAiF;IACjF,MAAM,cAAc,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,cAAc,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAElH,OAAO;;;;;;;;;;UAUD,cAAc,CAAC,CAAC,CAAC;;oCAES,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;;;;SAI3D,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2EH;;;;;;;;;;;;;;yBAcgB,cAAc,IAAI,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;;;yBAGxF,cAAc,IAAI,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CjH,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;;SASnB,CAAC,CAAC,CAAC;;SAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2CH,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,kCAA+B,MAoMrE,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGPU Fingerprinting Protection
|
|
3
|
+
* Spoofs GPU adapter information
|
|
4
|
+
*/
|
|
5
|
+
export const createWebGPUSpoofingScript = (experimentalMode = false) => {
|
|
6
|
+
return `
|
|
7
|
+
(() => {
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
// WebGPU Fingerprinting Protection
|
|
11
|
+
const spoofWebGPU = () => {
|
|
12
|
+
// Experimental mode: completely disable WebGPU
|
|
13
|
+
${experimentalMode ? `
|
|
14
|
+
if ('GPU' in window) {
|
|
15
|
+
delete window.GPU;
|
|
16
|
+
}
|
|
17
|
+
if ('navigator' in window && 'gpu' in navigator) {
|
|
18
|
+
delete navigator.gpu;
|
|
19
|
+
}
|
|
20
|
+
// Return early as WebGPU is completely disabled
|
|
21
|
+
return;
|
|
22
|
+
` : ''}
|
|
23
|
+
|
|
24
|
+
// Standard mode: spoof WebGPU
|
|
25
|
+
// Session-stable seeded PRNG to ensure consistent GPU selection across navigations
|
|
26
|
+
const sessionSeed = Date.now() ^ 0xD4E5F617;
|
|
27
|
+
const createSeededRNG = (seed) => {
|
|
28
|
+
let s = seed | 0;
|
|
29
|
+
return () => {
|
|
30
|
+
s = s + 0x6D2B79F5 | 0;
|
|
31
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
32
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
33
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const seededRandom = createSeededRNG(sessionSeed);
|
|
37
|
+
|
|
38
|
+
if ('GPU' in window && window.GPU) {
|
|
39
|
+
const OriginalGPU = window.GPU;
|
|
40
|
+
|
|
41
|
+
// Override requestAdapter to provide consistent fake adapter info
|
|
42
|
+
window.GPU = new Proxy(OriginalGPU, {
|
|
43
|
+
get(target, prop) {
|
|
44
|
+
if (prop === 'requestAdapter') {
|
|
45
|
+
return async function(options) {
|
|
46
|
+
const adapter = await target.requestAdapter.call(target, options);
|
|
47
|
+
if (!adapter) return null;
|
|
48
|
+
|
|
49
|
+
// Wrap the adapter to provide fake but consistent info
|
|
50
|
+
return new Proxy(adapter, {
|
|
51
|
+
get(adapterTarget, adapterProp) {
|
|
52
|
+
if (adapterProp === 'name') {
|
|
53
|
+
// Return a common GPU name based on platform
|
|
54
|
+
const gpuNames = [
|
|
55
|
+
'NVIDIA GeForce RTX 4060',
|
|
56
|
+
'NVIDIA GeForce RTX 3060',
|
|
57
|
+
'NVIDIA GeForce GTX 1660 Ti',
|
|
58
|
+
'AMD Radeon RX 7600',
|
|
59
|
+
'AMD Radeon RX 6600',
|
|
60
|
+
'Intel(R) Arc(TM) A770',
|
|
61
|
+
'Intel(R) UHD Graphics 770',
|
|
62
|
+
];
|
|
63
|
+
const idx = Math.floor(seededRandom() * gpuNames.length);
|
|
64
|
+
return gpuNames[idx];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (adapterProp === 'features') {
|
|
68
|
+
// Return a consistent set of features
|
|
69
|
+
const fakeFeatures = new Set([
|
|
70
|
+
'depth-clip-control',
|
|
71
|
+
'depth32float-stencil8',
|
|
72
|
+
'texture-compression-bc',
|
|
73
|
+
'texture-compression-etc2',
|
|
74
|
+
'texture-compression-astc',
|
|
75
|
+
'timestamp-query',
|
|
76
|
+
'indirect-first-instance',
|
|
77
|
+
'shader-f16',
|
|
78
|
+
'rg11b10ufloat-renderable',
|
|
79
|
+
'bgra8unorm-storage',
|
|
80
|
+
'float32-filterable',
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
return new Proxy(adapterTarget.features || fakeFeatures, {
|
|
84
|
+
get(featuresTarget, featuresProp) {
|
|
85
|
+
if (featuresProp === 'has') {
|
|
86
|
+
return (feature) => fakeFeatures.has(feature);
|
|
87
|
+
}
|
|
88
|
+
if (featuresProp === 'size') {
|
|
89
|
+
return fakeFeatures.size;
|
|
90
|
+
}
|
|
91
|
+
if (featuresProp === Symbol.iterator) {
|
|
92
|
+
return fakeFeatures[Symbol.iterator].bind(fakeFeatures);
|
|
93
|
+
}
|
|
94
|
+
return Reflect.get(featuresTarget, featuresProp);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (adapterProp === 'limits') {
|
|
100
|
+
// Return realistic GPU limits
|
|
101
|
+
return {
|
|
102
|
+
maxTextureDimension1D: 16384,
|
|
103
|
+
maxTextureDimension2D: 16384,
|
|
104
|
+
maxTextureDimension3D: 2048,
|
|
105
|
+
maxTextureArrayLayers: 2048,
|
|
106
|
+
maxBindGroups: 4,
|
|
107
|
+
maxBindGroupsPlusVertexBuffers: 24,
|
|
108
|
+
maxBindingsPerBindGroup: 1000,
|
|
109
|
+
maxDynamicUniformBuffersPerPipelineLayout: 8,
|
|
110
|
+
maxDynamicStorageBuffersPerPipelineLayout: 4,
|
|
111
|
+
maxSampledTexturesPerShaderStage: 16,
|
|
112
|
+
maxSamplersPerShaderStage: 16,
|
|
113
|
+
maxStorageBuffersPerShaderStage: 8,
|
|
114
|
+
maxStorageTexturesPerShaderStage: 4,
|
|
115
|
+
maxUniformBuffersPerShaderStage: 12,
|
|
116
|
+
maxUniformBufferBindingSize: 65536,
|
|
117
|
+
maxStorageBufferBindingSize: 134217728,
|
|
118
|
+
minUniformBufferOffsetAlignment: 256,
|
|
119
|
+
minStorageBufferOffsetAlignment: 256,
|
|
120
|
+
maxVertexBuffers: 8,
|
|
121
|
+
maxBufferSize: 268435456,
|
|
122
|
+
maxVertexAttributes: 16,
|
|
123
|
+
maxVertexBufferArrayStride: 2048,
|
|
124
|
+
maxInterStageShaderComponents: 60,
|
|
125
|
+
maxInterStageShaderVariables: 16,
|
|
126
|
+
maxColorAttachments: 8,
|
|
127
|
+
maxColorAttachmentBytesPerSample: 32,
|
|
128
|
+
maxComputeWorkgroupStorageSize: 16384,
|
|
129
|
+
maxComputeInvocationsPerWorkgroup: 256,
|
|
130
|
+
maxComputeWorkgroupSizeX: 256,
|
|
131
|
+
maxComputeWorkgroupSizeY: 256,
|
|
132
|
+
maxComputeWorkgroupSizeZ: 64,
|
|
133
|
+
maxComputeWorkgroupsPerDimension: 65535,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (adapterProp === 'requestDevice') {
|
|
138
|
+
return async function(descriptor) {
|
|
139
|
+
const device = await adapterTarget.requestDevice.call(adapterTarget, descriptor);
|
|
140
|
+
if (!device) return null;
|
|
141
|
+
|
|
142
|
+
// Wrap the device to intercept timing queries
|
|
143
|
+
return new Proxy(device, {
|
|
144
|
+
get(deviceTarget, deviceProp) {
|
|
145
|
+
if (deviceProp === 'createQuerySet') {
|
|
146
|
+
return function(descriptor) {
|
|
147
|
+
const querySet = deviceTarget.createQuerySet.call(deviceTarget, descriptor);
|
|
148
|
+
|
|
149
|
+
// If it's a timestamp query, we need to fake the results
|
|
150
|
+
if (descriptor.type === 'timestamp') {
|
|
151
|
+
return new Proxy(querySet, {
|
|
152
|
+
get(queryTarget, queryProp) {
|
|
153
|
+
// Intercept resolve operations to fake timestamps
|
|
154
|
+
return Reflect.get(queryTarget, queryProp);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return querySet;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return Reflect.get(deviceTarget, deviceProp);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return Reflect.get(adapterTarget, adapterProp);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (prop === 'getPreferredCanvasFormat') {
|
|
176
|
+
return function() {
|
|
177
|
+
// Return the most common format
|
|
178
|
+
return 'bgra8unorm';
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return Reflect.get(target, prop);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
190
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
console.log(DEBUG_PREFIX, 'Starting WebGPU spoofing...');
|
|
194
|
+
spoofWebGPU();
|
|
195
|
+
console.log(DEBUG_PREFIX, '✓ WebGPU spoofing applied');
|
|
196
|
+
} catch (e) {
|
|
197
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply WebGPU spoofing:', e);
|
|
198
|
+
throw e;
|
|
199
|
+
}
|
|
200
|
+
})();`;
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=webgpu-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webgpu-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,gBAAgB,GAAG,KAAK,EAAU,EAAE;IAC3E,OAAO;;;;;;;UAOD,gBAAgB,CAAC,CAAC,CAAC;;;;;;;;;SASpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAkLR,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,QAAO,MAsL7C,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebRTC Spoofing
|
|
3
|
+
* Prevents IP leaks and provides fake device information
|
|
4
|
+
*/
|
|
5
|
+
export const createWebRTCSpoofingScript = () => {
|
|
6
|
+
return `
|
|
7
|
+
(() => {
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
// Use crypto.getRandomValues for device IDs - these must be truly random
|
|
11
|
+
// per session to avoid correlation/blocking across sessions.
|
|
12
|
+
// Seeded PRNG is only used for non-identifying jitter (stats).
|
|
13
|
+
const createSeededRNG = (seed) => {
|
|
14
|
+
let s = seed | 0;
|
|
15
|
+
return () => {
|
|
16
|
+
s = s + 0x6D2B79F5 | 0;
|
|
17
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
18
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
19
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const sessionSeed = Date.now() ^ 0xC3A5F917;
|
|
23
|
+
const seededRandom = createSeededRNG(sessionSeed);
|
|
24
|
+
|
|
25
|
+
// Generate crypto-quality random hex device IDs (64 chars)
|
|
26
|
+
const generateDeviceId = () => {
|
|
27
|
+
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
28
|
+
const bytes = new Uint8Array(32);
|
|
29
|
+
crypto.getRandomValues(bytes);
|
|
30
|
+
return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
|
|
31
|
+
}
|
|
32
|
+
// Fallback: combine Date.now, Math.random, and performance.now for entropy
|
|
33
|
+
let id = '';
|
|
34
|
+
for (let i = 0; i < 64; i++) {
|
|
35
|
+
id += Math.floor(Math.random() * 16).toString(16);
|
|
36
|
+
}
|
|
37
|
+
return id;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Pre-generate device IDs once per session for consistency within a session
|
|
41
|
+
const cachedDeviceIds = {};
|
|
42
|
+
const getDeviceId = (key) => {
|
|
43
|
+
if (!cachedDeviceIds[key]) cachedDeviceIds[key] = generateDeviceId();
|
|
44
|
+
return cachedDeviceIds[key];
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Redact local IP addresses from ICE candidate strings
|
|
48
|
+
const redactCandidateIP = (candidateStr) => {
|
|
49
|
+
if (!candidateStr) return candidateStr;
|
|
50
|
+
// Match private/local IPs (10.x, 172.16-31.x, 192.168.x, fd00::/8, fe80::/10)
|
|
51
|
+
return candidateStr
|
|
52
|
+
.replace(/(?:(?:10|127)\.\\d{1,3}|192\\.168|172\\.(?:1[6-9]|2\\d|3[01]))(?:\\.\\d{1,3}){2}/g, '0.0.0.0')
|
|
53
|
+
.replace(/[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){7}/gi, (match) => {
|
|
54
|
+
if (match.startsWith('fd') || match.startsWith('fe80')) return '0.0.0.0';
|
|
55
|
+
return match;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// WebRTC Spoofing for 2025
|
|
60
|
+
const spoofWebRTC = () => {
|
|
61
|
+
// Override RTCPeerConnection
|
|
62
|
+
const OriginalRTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
|
|
63
|
+
|
|
64
|
+
if (OriginalRTCPeerConnection) {
|
|
65
|
+
window.RTCPeerConnection = window.webkitRTCPeerConnection = window.mozRTCPeerConnection = new Proxy(OriginalRTCPeerConnection, {
|
|
66
|
+
construct(target, args) {
|
|
67
|
+
const config = args[0] || {};
|
|
68
|
+
|
|
69
|
+
// Keep STUN servers intact - they are needed for ICE candidate gathering
|
|
70
|
+
const pc = Reflect.construct(target, [config, ...args.slice(1)]);
|
|
71
|
+
|
|
72
|
+
// Intercept onicecandidate to redact local IPs from candidates
|
|
73
|
+
let userOnicecandidateHandler = null;
|
|
74
|
+
Object.defineProperty(pc, 'onicecandidate', {
|
|
75
|
+
get() {
|
|
76
|
+
return userOnicecandidateHandler;
|
|
77
|
+
},
|
|
78
|
+
set(handler) {
|
|
79
|
+
if (typeof handler === 'function') {
|
|
80
|
+
userOnicecandidateHandler = handler;
|
|
81
|
+
const wrappedHandler = (event) => {
|
|
82
|
+
if (event.candidate && event.candidate.candidate) {
|
|
83
|
+
const redacted = redactCandidateIP(event.candidate.candidate);
|
|
84
|
+
if (redacted !== event.candidate.candidate) {
|
|
85
|
+
const newCandidate = new RTCIceCandidate({
|
|
86
|
+
candidate: redacted,
|
|
87
|
+
sdpMid: event.candidate.sdpMid,
|
|
88
|
+
sdpMLineIndex: event.candidate.sdpMLineIndex,
|
|
89
|
+
usernameFragment: event.candidate.usernameFragment,
|
|
90
|
+
});
|
|
91
|
+
const newEvent = new RTCPeerConnectionIceEvent('icecandidate', { candidate: newCandidate });
|
|
92
|
+
handler.call(pc, newEvent);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
handler.call(pc, event);
|
|
97
|
+
};
|
|
98
|
+
pc.addEventListener('icecandidate', wrappedHandler);
|
|
99
|
+
} else {
|
|
100
|
+
userOnicecandidateHandler = null;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
configurable: true,
|
|
104
|
+
enumerable: true,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Override getStats to provide fake statistics
|
|
108
|
+
const originalGetStats = pc.getStats;
|
|
109
|
+
pc.getStats = function() {
|
|
110
|
+
return originalGetStats.apply(this, arguments).then(stats => {
|
|
111
|
+
// Modify stats to hide identifying information
|
|
112
|
+
const modifiedStats = new Map();
|
|
113
|
+
stats.forEach((stat, key) => {
|
|
114
|
+
const modifiedStat = Object.assign({}, stat);
|
|
115
|
+
|
|
116
|
+
// Use seeded PRNG for deterministic jitter
|
|
117
|
+
if ('bytesReceived' in modifiedStat) {
|
|
118
|
+
modifiedStat.bytesReceived = Math.floor(modifiedStat.bytesReceived * (0.9 + seededRandom() * 0.2));
|
|
119
|
+
}
|
|
120
|
+
if ('bytesSent' in modifiedStat) {
|
|
121
|
+
modifiedStat.bytesSent = Math.floor(modifiedStat.bytesSent * (0.9 + seededRandom() * 0.2));
|
|
122
|
+
}
|
|
123
|
+
if ('jitter' in modifiedStat) {
|
|
124
|
+
modifiedStat.jitter = modifiedStat.jitter * (0.9 + seededRandom() * 0.2);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
modifiedStats.set(key, modifiedStat);
|
|
128
|
+
});
|
|
129
|
+
return modifiedStats;
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
return pc;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Override MediaDevices.enumerateDevices
|
|
139
|
+
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
|
140
|
+
const originalEnumerateDevices = navigator.mediaDevices.enumerateDevices;
|
|
141
|
+
|
|
142
|
+
// Pre-build the device list once per session
|
|
143
|
+
// Real browsers have varying numbers of devices (1-5+ depending on hardware)
|
|
144
|
+
// We use the real device list as a base but replace IDs with random ones
|
|
145
|
+
let cachedDeviceList = null;
|
|
146
|
+
|
|
147
|
+
navigator.mediaDevices.enumerateDevices = function() {
|
|
148
|
+
if (cachedDeviceList) return Promise.resolve(cachedDeviceList);
|
|
149
|
+
|
|
150
|
+
return originalEnumerateDevices.apply(this, arguments).then(devices => {
|
|
151
|
+
// Replace device IDs with crypto-random ones, keep real device kinds/count
|
|
152
|
+
// This preserves the natural device count from the actual browser
|
|
153
|
+
// while preventing tracking via device IDs
|
|
154
|
+
const groupIds = {};
|
|
155
|
+
cachedDeviceList = devices.map((device, index) => {
|
|
156
|
+
const groupKey = device.kind.replace(/input|output/, '');
|
|
157
|
+
if (!groupIds[groupKey]) groupIds[groupKey] = getDeviceId('group_' + groupKey);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
deviceId: getDeviceId(device.kind + '_' + index),
|
|
161
|
+
kind: device.kind,
|
|
162
|
+
label: '', // Empty label = no permission granted (realistic)
|
|
163
|
+
groupId: groupIds[groupKey],
|
|
164
|
+
toJSON() {
|
|
165
|
+
return { deviceId: this.deviceId, kind: this.kind, label: this.label, groupId: this.groupId };
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
return cachedDeviceList;
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
176
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
console.log(DEBUG_PREFIX, 'Starting WebRTC spoofing...');
|
|
180
|
+
spoofWebRTC();
|
|
181
|
+
console.log(DEBUG_PREFIX, '✓ WebRTC spoofing applied');
|
|
182
|
+
} catch (e) {
|
|
183
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply WebRTC spoofing:', e);
|
|
184
|
+
throw e;
|
|
185
|
+
}
|
|
186
|
+
})();`;
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=webrtc-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webrtc-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/webrtc-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAW,EAAE;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAoLL,CAAC;AACP,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import CDPCrawler from "./crawler.js";
|
|
2
|
+
import CdpPage from "./page.js";
|
|
2
3
|
export default CDPCrawler;
|
|
3
4
|
export { createCDPRouter } from "./crawler.js";
|
|
5
|
+
export type { CDPRouter, CDPCrawlingContext, CDPCrawlerOptions, CDPLaunchContext, CDPRequestHandler } from "./crawler.js";
|
|
6
|
+
export type { GotoOptions, SelectOptionOptions } from "./page.js";
|
|
7
|
+
export { CdpPage };
|
|
4
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1H,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,CAAC"}
|