jumpy-lion 0.1.0 → 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 +319 -28
- 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 -18
- 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 +161 -7
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +1034 -23
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,aAAc,MAAM,oBAAoB,cAAc,KAAG,MA+lBpG,CAAC"}
|
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Consistency Script
|
|
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
|
|
12
|
+
*/
|
|
13
|
+
export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
14
|
+
// Platform-specific configurations for 1:1 consistency
|
|
15
|
+
const platformConfigs = {
|
|
16
|
+
'Win32': {
|
|
17
|
+
devicePixelRatio: 1.0,
|
|
18
|
+
screenDepth: 24,
|
|
19
|
+
colorDepth: 24,
|
|
20
|
+
hardwareConcurrency: 8,
|
|
21
|
+
maxTouchPoints: 0,
|
|
22
|
+
platform: 'Win32',
|
|
23
|
+
oscpu: 'Windows NT 10.0; Win64; x64',
|
|
24
|
+
vendor: '',
|
|
25
|
+
vendorSub: '',
|
|
26
|
+
productSub: '20030107',
|
|
27
|
+
cookieEnabled: true,
|
|
28
|
+
onLine: true,
|
|
29
|
+
language: 'en-US',
|
|
30
|
+
languages: ['en-US', 'en'],
|
|
31
|
+
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
|
|
32
|
+
appVersion: '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
|
|
33
|
+
appName: 'Netscape',
|
|
34
|
+
appCodeName: 'Mozilla',
|
|
35
|
+
product: 'Gecko',
|
|
36
|
+
// Chrome 120+ only reports PDF-related plugins (Native Client removed in 2019)
|
|
37
|
+
plugins: [
|
|
38
|
+
{ name: 'PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
39
|
+
{ name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
40
|
+
{ name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
41
|
+
{ name: 'Microsoft Edge PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
42
|
+
{ name: 'WebKit built-in PDF', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },
|
|
43
|
+
],
|
|
44
|
+
mimeTypes: [
|
|
45
|
+
{ type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
|
|
46
|
+
{ type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
|
|
47
|
+
],
|
|
48
|
+
// Windows-specific connection properties
|
|
49
|
+
connection: {
|
|
50
|
+
downlink: 10,
|
|
51
|
+
effectiveType: '4g',
|
|
52
|
+
onchange: null,
|
|
53
|
+
rtt: 50,
|
|
54
|
+
saveData: false,
|
|
55
|
+
type: 'ethernet',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
'MacIntel': {
|
|
59
|
+
devicePixelRatio: 2.0,
|
|
60
|
+
screenDepth: 30,
|
|
61
|
+
colorDepth: 30,
|
|
62
|
+
hardwareConcurrency: 8,
|
|
63
|
+
maxTouchPoints: 0,
|
|
64
|
+
platform: 'MacIntel',
|
|
65
|
+
oscpu: undefined,
|
|
66
|
+
vendor: 'Google Inc.',
|
|
67
|
+
vendorSub: '',
|
|
68
|
+
productSub: '20030107',
|
|
69
|
+
cookieEnabled: true,
|
|
70
|
+
onLine: true,
|
|
71
|
+
language: 'en-US',
|
|
72
|
+
languages: ['en-US', 'en'],
|
|
73
|
+
plugins: [
|
|
74
|
+
{ name: 'PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
75
|
+
{ name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
76
|
+
{ name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
77
|
+
{ name: 'WebKit built-in PDF', filename: 'internal-pdf-viewer' },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
'Linux x86_64': {
|
|
81
|
+
devicePixelRatio: 1.0,
|
|
82
|
+
screenDepth: 24,
|
|
83
|
+
colorDepth: 24,
|
|
84
|
+
hardwareConcurrency: 8,
|
|
85
|
+
maxTouchPoints: 0,
|
|
86
|
+
platform: 'Linux x86_64',
|
|
87
|
+
oscpu: 'Linux x86_64',
|
|
88
|
+
vendor: 'Google Inc.',
|
|
89
|
+
vendorSub: '',
|
|
90
|
+
productSub: '20030107',
|
|
91
|
+
cookieEnabled: true,
|
|
92
|
+
onLine: true,
|
|
93
|
+
language: 'en-US',
|
|
94
|
+
languages: ['en-US', 'en'],
|
|
95
|
+
plugins: [
|
|
96
|
+
{ name: 'PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
97
|
+
{ name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
98
|
+
{ name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer' },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
const defaultConfig = platformConfigs[platform] || platformConfigs['Linux x86_64'];
|
|
103
|
+
// Merge fingerprint data with defaults if provided
|
|
104
|
+
const config = fingerprintData ? {
|
|
105
|
+
...defaultConfig,
|
|
106
|
+
...fingerprintData,
|
|
107
|
+
// Ensure platform consistency
|
|
108
|
+
platform: fingerprintData.platform || platform,
|
|
109
|
+
} : defaultConfig;
|
|
110
|
+
return `
|
|
111
|
+
(() => {
|
|
112
|
+
'use strict';
|
|
113
|
+
|
|
114
|
+
// Platform Consistency for ${platform}
|
|
115
|
+
const config = ${JSON.stringify(config)};
|
|
116
|
+
|
|
117
|
+
// Helper to safely define property with guards
|
|
118
|
+
const safeDefineProperty = (obj, prop, getter) => {
|
|
119
|
+
try {
|
|
120
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
121
|
+
if (descriptor && descriptor.configurable === false) {
|
|
122
|
+
return false; // Property already defined as non-configurable
|
|
123
|
+
}
|
|
124
|
+
Object.defineProperty(obj, prop, {
|
|
125
|
+
get: getter,
|
|
126
|
+
configurable: true, // Allow other scripts to modify if needed
|
|
127
|
+
enumerable: true
|
|
128
|
+
});
|
|
129
|
+
return true;
|
|
130
|
+
} catch (e) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Override navigator properties for platform consistency (with guards)
|
|
136
|
+
safeDefineProperty(navigator, 'platform', () => config.platform);
|
|
137
|
+
safeDefineProperty(navigator, 'vendor', () => config.vendor);
|
|
138
|
+
safeDefineProperty(navigator, 'vendorSub', () => config.vendorSub);
|
|
139
|
+
safeDefineProperty(navigator, 'productSub', () => config.productSub);
|
|
140
|
+
safeDefineProperty(navigator, 'hardwareConcurrency', () => config.hardwareConcurrency);
|
|
141
|
+
safeDefineProperty(navigator, 'maxTouchPoints', () => config.maxTouchPoints);
|
|
142
|
+
safeDefineProperty(navigator, 'cookieEnabled', () => config.cookieEnabled);
|
|
143
|
+
safeDefineProperty(navigator, 'onLine', () => config.onLine);
|
|
144
|
+
safeDefineProperty(navigator, 'language', () => config.language);
|
|
145
|
+
safeDefineProperty(navigator, 'languages', () => config.languages);
|
|
146
|
+
|
|
147
|
+
// Additional navigator properties for Windows consistency
|
|
148
|
+
if (config.userAgent) {
|
|
149
|
+
safeDefineProperty(navigator, 'userAgent', () => config.userAgent);
|
|
150
|
+
}
|
|
151
|
+
if (config.appVersion) {
|
|
152
|
+
safeDefineProperty(navigator, 'appVersion', () => config.appVersion);
|
|
153
|
+
}
|
|
154
|
+
if (config.appName) {
|
|
155
|
+
safeDefineProperty(navigator, 'appName', () => config.appName);
|
|
156
|
+
}
|
|
157
|
+
if (config.appCodeName) {
|
|
158
|
+
safeDefineProperty(navigator, 'appCodeName', () => config.appCodeName);
|
|
159
|
+
}
|
|
160
|
+
if (config.product) {
|
|
161
|
+
safeDefineProperty(navigator, 'product', () => config.product);
|
|
162
|
+
}
|
|
163
|
+
if (config.oscpu !== undefined) {
|
|
164
|
+
safeDefineProperty(navigator, 'oscpu', () => config.oscpu);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Override navigator.plugins for Windows consistency (with guards)
|
|
168
|
+
if (config.plugins) {
|
|
169
|
+
const pluginsGetter = () => {
|
|
170
|
+
const arr = Object.create(PluginArray.prototype);
|
|
171
|
+
config.plugins.forEach((p, i) => {
|
|
172
|
+
const plugin = Object.create(Plugin.prototype);
|
|
173
|
+
// Use Object.defineProperty for read-only properties
|
|
174
|
+
Object.defineProperty(plugin, 'name', { value: p.name, writable: false, enumerable: true });
|
|
175
|
+
Object.defineProperty(plugin, 'filename', { value: p.filename, writable: false, enumerable: true });
|
|
176
|
+
Object.defineProperty(plugin, 'description', { value: p.description, writable: false, enumerable: true });
|
|
177
|
+
Object.defineProperty(plugin, 'length', { value: 1, writable: false, enumerable: true });
|
|
178
|
+
plugin[0] = config.mimeTypes?.[i] || { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' };
|
|
179
|
+
arr[i] = plugin;
|
|
180
|
+
arr[p.name] = plugin;
|
|
181
|
+
});
|
|
182
|
+
// Use Object.defineProperty for length (PluginArray.prototype.length is read-only)
|
|
183
|
+
Object.defineProperty(arr, 'length', { value: config.plugins.length, writable: false, enumerable: true });
|
|
184
|
+
Object.defineProperty(arr, 'item', { value: (index) => arr[index] || null, writable: false, enumerable: false });
|
|
185
|
+
Object.defineProperty(arr, 'namedItem', { value: (name) => arr[name] || null, writable: false, enumerable: false });
|
|
186
|
+
Object.defineProperty(arr, 'refresh', { value: () => {}, writable: false, enumerable: false });
|
|
187
|
+
return arr;
|
|
188
|
+
};
|
|
189
|
+
safeDefineProperty(navigator, 'plugins', pluginsGetter);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Override navigator.mimeTypes for Windows consistency (with guards)
|
|
193
|
+
if (config.mimeTypes) {
|
|
194
|
+
const mimeTypesGetter = () => {
|
|
195
|
+
const arr = Object.create(MimeTypeArray.prototype);
|
|
196
|
+
config.mimeTypes.forEach((m, i) => {
|
|
197
|
+
const mimeType = Object.create(MimeType.prototype);
|
|
198
|
+
// Use Object.defineProperty for read-only properties
|
|
199
|
+
Object.defineProperty(mimeType, 'type', { value: m.type, writable: false, enumerable: true });
|
|
200
|
+
Object.defineProperty(mimeType, 'suffixes', { value: m.suffixes, writable: false, enumerable: true });
|
|
201
|
+
Object.defineProperty(mimeType, 'description', { value: m.description, writable: false, enumerable: true });
|
|
202
|
+
Object.defineProperty(mimeType, 'enabledPlugin', { value: config.plugins?.[0] || null, writable: false, enumerable: true });
|
|
203
|
+
arr[i] = mimeType;
|
|
204
|
+
arr[m.type] = mimeType;
|
|
205
|
+
});
|
|
206
|
+
// Use Object.defineProperty for length (MimeTypeArray.prototype.length is read-only)
|
|
207
|
+
Object.defineProperty(arr, 'length', { value: config.mimeTypes.length, writable: false, enumerable: true });
|
|
208
|
+
Object.defineProperty(arr, 'item', { value: (index) => arr[index] || null, writable: false, enumerable: false });
|
|
209
|
+
Object.defineProperty(arr, 'namedItem', { value: (name) => arr[name] || null, writable: false, enumerable: false });
|
|
210
|
+
return arr;
|
|
211
|
+
};
|
|
212
|
+
safeDefineProperty(navigator, 'mimeTypes', mimeTypesGetter);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Override navigator.connection for Windows consistency
|
|
216
|
+
// Note: Some connection properties (like downlink, rtt) are non-configurable in Chrome
|
|
217
|
+
if (config.connection && navigator.connection) {
|
|
218
|
+
Object.keys(config.connection).forEach(key => {
|
|
219
|
+
try {
|
|
220
|
+
const descriptor = Object.getOwnPropertyDescriptor(navigator.connection, key);
|
|
221
|
+
if (descriptor && descriptor.configurable === false) {
|
|
222
|
+
// Property is non-configurable, skip it
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
Object.defineProperty(navigator.connection, key, {
|
|
226
|
+
value: config.connection[key],
|
|
227
|
+
writable: false,
|
|
228
|
+
configurable: true
|
|
229
|
+
});
|
|
230
|
+
} catch (e) {
|
|
231
|
+
// Silently ignore non-configurable properties
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Override screen properties (with guards)
|
|
237
|
+
safeDefineProperty(window, 'devicePixelRatio', () => config.devicePixelRatio);
|
|
238
|
+
safeDefineProperty(screen, 'colorDepth', () => config.colorDepth);
|
|
239
|
+
safeDefineProperty(screen, 'pixelDepth', () => config.screenDepth || config.colorDepth);
|
|
240
|
+
|
|
241
|
+
// Ensure WebGL returns platform-appropriate values
|
|
242
|
+
const getParameterProto = WebGLRenderingContext.prototype.getParameter;
|
|
243
|
+
WebGLRenderingContext.prototype.getParameter = function(param) {
|
|
244
|
+
if (param === 0x9245 || param === 0x9246) { // UNMASKED_VENDOR_WEBGL / UNMASKED_RENDERER_WEBGL
|
|
245
|
+
// Return platform-appropriate GPU with corrected ANGLE token count
|
|
246
|
+
if (config.platform === 'Win32') {
|
|
247
|
+
return param === 0x9245
|
|
248
|
+
? 'NVIDIA Corporation'
|
|
249
|
+
: 'ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D 11.0)'; // Fixed: fewer tokens
|
|
250
|
+
} else if (config.platform === 'MacIntel') {
|
|
251
|
+
return param === 0x9245 ? 'Apple Inc.' : 'ANGLE (Apple, Apple M1 Pro, OpenGL 4.1)';
|
|
252
|
+
} else {
|
|
253
|
+
return param === 0x9245 ? 'Intel' : 'ANGLE (Intel, Mesa Intel(R) UHD Graphics 630, OpenGL 4.6)';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return getParameterProto.apply(this, arguments);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
if (typeof WebGL2RenderingContext !== 'undefined') {
|
|
260
|
+
WebGL2RenderingContext.prototype.getParameter = WebGLRenderingContext.prototype.getParameter;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ========== 2024-2025 Enhanced Platform Consistency ==========
|
|
264
|
+
|
|
265
|
+
// Screen Orientation API Consistency
|
|
266
|
+
const spoofScreenOrientation = () => {
|
|
267
|
+
if (screen.orientation) {
|
|
268
|
+
Object.defineProperty(screen.orientation, 'type', {
|
|
269
|
+
get: () => 'landscape-primary',
|
|
270
|
+
configurable: true,
|
|
271
|
+
enumerable: true
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
Object.defineProperty(screen.orientation, 'angle', {
|
|
275
|
+
get: () => 0,
|
|
276
|
+
configurable: true,
|
|
277
|
+
enumerable: true
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
// Screen availLeft/availTop for Windows (taskbar consideration)
|
|
283
|
+
const spoofScreenAvailability = () => {
|
|
284
|
+
const screenConfig = {
|
|
285
|
+
'Win32': {
|
|
286
|
+
availLeft: 0,
|
|
287
|
+
availTop: 0,
|
|
288
|
+
availWidth: screen.width || 1920,
|
|
289
|
+
availHeight: (screen.height || 1080) - 40 // Windows taskbar ~40px
|
|
290
|
+
},
|
|
291
|
+
'MacIntel': {
|
|
292
|
+
availLeft: 0,
|
|
293
|
+
availTop: 25, // macOS menu bar
|
|
294
|
+
availWidth: screen.width || 1920,
|
|
295
|
+
availHeight: (screen.height || 1080) - 25
|
|
296
|
+
},
|
|
297
|
+
'Linux x86_64': {
|
|
298
|
+
availLeft: 0,
|
|
299
|
+
availTop: 0,
|
|
300
|
+
availWidth: screen.width || 1920,
|
|
301
|
+
availHeight: (screen.height || 1080) - 30 // GNOME panel
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const screenVals = screenConfig[config.platform] || screenConfig['Win32'];
|
|
306
|
+
|
|
307
|
+
Object.defineProperty(screen, 'availLeft', {
|
|
308
|
+
get: () => screenVals.availLeft,
|
|
309
|
+
configurable: true,
|
|
310
|
+
enumerable: true
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
Object.defineProperty(screen, 'availTop', {
|
|
314
|
+
get: () => screenVals.availTop,
|
|
315
|
+
configurable: true,
|
|
316
|
+
enumerable: true
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
Object.defineProperty(screen, 'availWidth', {
|
|
320
|
+
get: () => screenVals.availWidth,
|
|
321
|
+
configurable: true,
|
|
322
|
+
enumerable: true
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
Object.defineProperty(screen, 'availHeight', {
|
|
326
|
+
get: () => screenVals.availHeight,
|
|
327
|
+
configurable: true,
|
|
328
|
+
enumerable: true
|
|
329
|
+
});
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// Visual Viewport consistency
|
|
333
|
+
const spoofVisualViewport = () => {
|
|
334
|
+
if (window.visualViewport) {
|
|
335
|
+
const originalViewport = window.visualViewport;
|
|
336
|
+
|
|
337
|
+
// Ensure consistent values
|
|
338
|
+
Object.defineProperty(originalViewport, 'scale', {
|
|
339
|
+
get: () => 1,
|
|
340
|
+
configurable: true
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
Object.defineProperty(originalViewport, 'offsetLeft', {
|
|
344
|
+
get: () => 0,
|
|
345
|
+
configurable: true
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
Object.defineProperty(originalViewport, 'offsetTop', {
|
|
349
|
+
get: () => 0,
|
|
350
|
+
configurable: true
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
Object.defineProperty(originalViewport, 'pageLeft', {
|
|
354
|
+
get: () => window.scrollX || 0,
|
|
355
|
+
configurable: true
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
Object.defineProperty(originalViewport, 'pageTop', {
|
|
359
|
+
get: () => window.scrollY || 0,
|
|
360
|
+
configurable: true
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
// Window outer dimensions (browser chrome size)
|
|
366
|
+
const spoofWindowDimensions = () => {
|
|
367
|
+
const outerConfig = {
|
|
368
|
+
'Win32': {
|
|
369
|
+
outerWidthOffset: 16, // Windows chrome borders
|
|
370
|
+
outerHeightOffset: 92 // Title bar + tabs + bookmarks
|
|
371
|
+
},
|
|
372
|
+
'MacIntel': {
|
|
373
|
+
outerWidthOffset: 0, // macOS has no side borders
|
|
374
|
+
outerHeightOffset: 87 // Title bar + tabs
|
|
375
|
+
},
|
|
376
|
+
'Linux x86_64': {
|
|
377
|
+
outerWidthOffset: 2, // Minimal borders
|
|
378
|
+
outerHeightOffset: 85 // GNOME decorations
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const dimConfig = outerConfig[config.platform] || outerConfig['Win32'];
|
|
383
|
+
|
|
384
|
+
Object.defineProperty(window, 'outerWidth', {
|
|
385
|
+
get: () => window.innerWidth + dimConfig.outerWidthOffset,
|
|
386
|
+
configurable: true,
|
|
387
|
+
enumerable: true
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
Object.defineProperty(window, 'outerHeight', {
|
|
391
|
+
get: () => window.innerHeight + dimConfig.outerHeightOffset,
|
|
392
|
+
configurable: true,
|
|
393
|
+
enumerable: true
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
// Window screen position
|
|
398
|
+
const spoofWindowPosition = () => {
|
|
399
|
+
const posConfig = {
|
|
400
|
+
'Win32': { screenX: 0, screenY: 0 },
|
|
401
|
+
'MacIntel': { screenX: 0, screenY: 25 }, // Below menu bar
|
|
402
|
+
'Linux x86_64': { screenX: 0, screenY: 0 }
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
const pos = posConfig[config.platform] || posConfig['Win32'];
|
|
406
|
+
|
|
407
|
+
Object.defineProperty(window, 'screenX', {
|
|
408
|
+
get: () => pos.screenX,
|
|
409
|
+
configurable: true,
|
|
410
|
+
enumerable: true
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
Object.defineProperty(window, 'screenY', {
|
|
414
|
+
get: () => pos.screenY,
|
|
415
|
+
configurable: true,
|
|
416
|
+
enumerable: true
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
Object.defineProperty(window, 'screenLeft', {
|
|
420
|
+
get: () => pos.screenX,
|
|
421
|
+
configurable: true,
|
|
422
|
+
enumerable: true
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
Object.defineProperty(window, 'screenTop', {
|
|
426
|
+
get: () => pos.screenY,
|
|
427
|
+
configurable: true,
|
|
428
|
+
enumerable: true
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
// Fix screenX/screenY in MouseEvent for headless/CDP dispatch.
|
|
432
|
+
// In headless mode, CDP-dispatched events have screenY == clientY
|
|
433
|
+
// (no browser chrome offset), which is a detection vector.
|
|
434
|
+
// Real browsers have ~85px chrome offset (title + tab + address bars).
|
|
435
|
+
const chromeOffsets = {
|
|
436
|
+
'Win32': { x: 0, y: 85 },
|
|
437
|
+
'MacIntel': { x: 0, y: 75 },
|
|
438
|
+
'Linux x86_64': { x: 0, y: 85 }
|
|
439
|
+
};
|
|
440
|
+
const chromeOffset = chromeOffsets[config.platform] || chromeOffsets['Win32'];
|
|
441
|
+
|
|
442
|
+
const origScreenYDesc = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'screenY');
|
|
443
|
+
const origScreenXDesc = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'screenX');
|
|
444
|
+
|
|
445
|
+
if (origScreenYDesc && origScreenYDesc.get) {
|
|
446
|
+
const origGetScreenY = origScreenYDesc.get;
|
|
447
|
+
Object.defineProperty(MouseEvent.prototype, 'screenY', {
|
|
448
|
+
get() {
|
|
449
|
+
const val = origGetScreenY.call(this);
|
|
450
|
+
// In headless, screenY == clientY (no chrome). Add offset.
|
|
451
|
+
if (val === this.clientY && chromeOffset.y > 0) {
|
|
452
|
+
return val + chromeOffset.y + pos.screenY;
|
|
453
|
+
}
|
|
454
|
+
return val;
|
|
455
|
+
},
|
|
456
|
+
configurable: true,
|
|
457
|
+
enumerable: true
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (origScreenXDesc && origScreenXDesc.get) {
|
|
462
|
+
const origGetScreenX = origScreenXDesc.get;
|
|
463
|
+
Object.defineProperty(MouseEvent.prototype, 'screenX', {
|
|
464
|
+
get() {
|
|
465
|
+
const val = origGetScreenX.call(this);
|
|
466
|
+
if (val === this.clientX && chromeOffset.x > 0) {
|
|
467
|
+
return val + chromeOffset.x + pos.screenX;
|
|
468
|
+
}
|
|
469
|
+
return val;
|
|
470
|
+
},
|
|
471
|
+
configurable: true,
|
|
472
|
+
enumerable: true
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
// matchMedia platform-specific behavior
|
|
478
|
+
const spoofMatchMedia = () => {
|
|
479
|
+
const originalMatchMedia = window.matchMedia;
|
|
480
|
+
|
|
481
|
+
window.matchMedia = function(query) {
|
|
482
|
+
const result = originalMatchMedia.call(this, query);
|
|
483
|
+
|
|
484
|
+
// Platform-specific media query handling
|
|
485
|
+
if (query.includes('prefers-color-scheme')) {
|
|
486
|
+
// Default to light mode (most common)
|
|
487
|
+
const isDark = query.includes('dark');
|
|
488
|
+
return new Proxy(result, {
|
|
489
|
+
get(target, prop) {
|
|
490
|
+
if (prop === 'matches') {
|
|
491
|
+
return !isDark; // Most users use light mode
|
|
492
|
+
}
|
|
493
|
+
return target[prop];
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (query.includes('prefers-reduced-motion')) {
|
|
499
|
+
// Most users don't have reduced motion
|
|
500
|
+
return new Proxy(result, {
|
|
501
|
+
get(target, prop) {
|
|
502
|
+
if (prop === 'matches') {
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
return target[prop];
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
if (query.includes('prefers-contrast')) {
|
|
511
|
+
// Most users use default contrast
|
|
512
|
+
return new Proxy(result, {
|
|
513
|
+
get(target, prop) {
|
|
514
|
+
if (prop === 'matches') {
|
|
515
|
+
return query.includes('no-preference');
|
|
516
|
+
}
|
|
517
|
+
return target[prop];
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (query.includes('pointer')) {
|
|
523
|
+
// Desktop platforms have fine pointer (mouse)
|
|
524
|
+
const hasFinePointer = config.platform !== 'Android' && config.maxTouchPoints === 0;
|
|
525
|
+
return new Proxy(result, {
|
|
526
|
+
get(target, prop) {
|
|
527
|
+
if (prop === 'matches') {
|
|
528
|
+
if (query.includes('fine')) return hasFinePointer;
|
|
529
|
+
if (query.includes('coarse')) return !hasFinePointer;
|
|
530
|
+
if (query.includes('none')) return false;
|
|
531
|
+
}
|
|
532
|
+
return target[prop];
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
if (query.includes('hover')) {
|
|
538
|
+
// Desktop platforms support hover
|
|
539
|
+
return new Proxy(result, {
|
|
540
|
+
get(target, prop) {
|
|
541
|
+
if (prop === 'matches') {
|
|
542
|
+
return query.includes('hover') && !query.includes('none');
|
|
543
|
+
}
|
|
544
|
+
return target[prop];
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
return result;
|
|
550
|
+
};
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
// ScreenDetails API (multi-monitor detection)
|
|
554
|
+
const spoofScreenDetails = () => {
|
|
555
|
+
if ('getScreenDetails' in window) {
|
|
556
|
+
window.getScreenDetails = function() {
|
|
557
|
+
return Promise.resolve({
|
|
558
|
+
screens: [{
|
|
559
|
+
availHeight: screen.availHeight,
|
|
560
|
+
availWidth: screen.availWidth,
|
|
561
|
+
availLeft: 0,
|
|
562
|
+
availTop: 0,
|
|
563
|
+
colorDepth: config.colorDepth || 24,
|
|
564
|
+
devicePixelRatio: config.devicePixelRatio || 1,
|
|
565
|
+
height: screen.height,
|
|
566
|
+
width: screen.width,
|
|
567
|
+
isExtended: false,
|
|
568
|
+
isPrimary: true,
|
|
569
|
+
label: 'Primary Display',
|
|
570
|
+
left: 0,
|
|
571
|
+
orientation: screen.orientation || { angle: 0, type: 'landscape-primary' },
|
|
572
|
+
pixelDepth: config.screenDepth || 24,
|
|
573
|
+
top: 0
|
|
574
|
+
}],
|
|
575
|
+
currentScreen: null,
|
|
576
|
+
onscreenschange: null,
|
|
577
|
+
oncurrentscreenchange: null,
|
|
578
|
+
addEventListener: () => {},
|
|
579
|
+
removeEventListener: () => {}
|
|
580
|
+
});
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// Initialize all enhanced spoofing
|
|
586
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
587
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
588
|
+
|
|
589
|
+
console.log(DEBUG_PREFIX, 'Starting platform consistency overrides for:', config.platform);
|
|
590
|
+
|
|
591
|
+
const applyConsistency = (name, fn) => {
|
|
592
|
+
try {
|
|
593
|
+
fn();
|
|
594
|
+
console.log(DEBUG_PREFIX, \`✓ Applied \${name}\`);
|
|
595
|
+
return true;
|
|
596
|
+
} catch (e) {
|
|
597
|
+
console.error(ERROR_PREFIX, \`✗ Failed to apply \${name}:\`, e);
|
|
598
|
+
throw e; // Rethrow to make errors visible
|
|
599
|
+
}
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
try {
|
|
603
|
+
applyConsistency('Screen Orientation', spoofScreenOrientation);
|
|
604
|
+
applyConsistency('Screen Availability', spoofScreenAvailability);
|
|
605
|
+
applyConsistency('Visual Viewport', spoofVisualViewport);
|
|
606
|
+
applyConsistency('Window Dimensions', spoofWindowDimensions);
|
|
607
|
+
applyConsistency('Window Position', spoofWindowPosition);
|
|
608
|
+
applyConsistency('Match Media', spoofMatchMedia);
|
|
609
|
+
applyConsistency('Screen Details API', spoofScreenDetails);
|
|
610
|
+
|
|
611
|
+
console.log(DEBUG_PREFIX, \`✓ Platform consistency complete for \${config.platform}\`);
|
|
612
|
+
} catch (e) {
|
|
613
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply platform consistency:', e);
|
|
614
|
+
throw e; // Rethrow to make errors visible
|
|
615
|
+
}
|
|
616
|
+
})();`;
|
|
617
|
+
};
|
|
618
|
+
//# sourceMappingURL=platform-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prototype Integrity Module
|
|
3
|
+
*
|
|
4
|
+
* Ensures all property overrides are undetectable by:
|
|
5
|
+
* - Making overridden properties appear native (configurable: false)
|
|
6
|
+
* - Hiding modified property descriptors from Object.getOwnPropertyDescriptor
|
|
7
|
+
* - Protecting prototype chains from Object.getPrototypeOf inspection
|
|
8
|
+
* - Masking shadow properties from enumeration
|
|
9
|
+
*
|
|
10
|
+
* This module MUST be injected FIRST, before any other fingerprint overrides.
|
|
11
|
+
*/
|
|
12
|
+
export declare const createPrototypeIntegrityScript: () => string;
|
|
13
|
+
//# sourceMappingURL=prototype-integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prototype-integrity.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/prototype-integrity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,8BAA8B,QAAO,MAuVjD,CAAC"}
|