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":"stealth-script.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA64BL,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Consistency Spoofing
|
|
3
|
+
* Handles storage-related fingerprinting for 2024-2025
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - navigator.storage.estimate() with realistic quota values
|
|
7
|
+
* - StorageManager.persist() behavior spoofing
|
|
8
|
+
* - IndexedDB database name consistency
|
|
9
|
+
* - localStorage/sessionStorage quota reporting
|
|
10
|
+
* - CacheStorage.keys() consistent cache names
|
|
11
|
+
*/
|
|
12
|
+
export declare const createStorageConsistencyScript: () => string;
|
|
13
|
+
//# sourceMappingURL=storage-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/storage-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,8BAA8B,QAAO,MA6UjD,CAAC"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Consistency Spoofing
|
|
3
|
+
* Handles storage-related fingerprinting for 2024-2025
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - navigator.storage.estimate() with realistic quota values
|
|
7
|
+
* - StorageManager.persist() behavior spoofing
|
|
8
|
+
* - IndexedDB database name consistency
|
|
9
|
+
* - localStorage/sessionStorage quota reporting
|
|
10
|
+
* - CacheStorage.keys() consistent cache names
|
|
11
|
+
*/
|
|
12
|
+
export const createStorageConsistencyScript = () => {
|
|
13
|
+
return `
|
|
14
|
+
(() => {
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
// Storage Consistency Spoofing for 2024-2025
|
|
18
|
+
const spoofStorageAPIs = () => {
|
|
19
|
+
const platform = navigator.platform || 'Win32';
|
|
20
|
+
|
|
21
|
+
// Generate consistent seed for stable values
|
|
22
|
+
const generateSeed = () => {
|
|
23
|
+
const ua = navigator.userAgent || '';
|
|
24
|
+
const screen = window.screen;
|
|
25
|
+
return (ua.length * 17 + (screen.width || 0) * 31 + (screen.height || 0) * 13) % 1000000;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const sessionSeed = generateSeed();
|
|
29
|
+
|
|
30
|
+
// Seeded PRNG (mulberry32) for consistent values
|
|
31
|
+
const createSeededRNG = (seed) => {
|
|
32
|
+
let s = seed | 0;
|
|
33
|
+
return () => {
|
|
34
|
+
s = s + 0x6D2B79F5 | 0;
|
|
35
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
36
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
37
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
const _rng = createSeededRNG(sessionSeed);
|
|
41
|
+
const seededRandom = (seed, min = 0, max = 1) => {
|
|
42
|
+
const rng = createSeededRNG(seed);
|
|
43
|
+
return min + rng() * (max - min);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// 1. Override navigator.storage.estimate()
|
|
47
|
+
const spoofStorageEstimate = () => {
|
|
48
|
+
if (navigator.storage && navigator.storage.estimate) {
|
|
49
|
+
const originalEstimate = navigator.storage.estimate;
|
|
50
|
+
|
|
51
|
+
navigator.storage.estimate = function() {
|
|
52
|
+
// Realistic storage values for different platforms
|
|
53
|
+
const storageConfigs = {
|
|
54
|
+
'Win32': {
|
|
55
|
+
quotaBase: 300 * 1024 * 1024 * 1024, // ~300GB typical Windows
|
|
56
|
+
usageBase: 50 * 1024 * 1024, // ~50MB typical usage
|
|
57
|
+
variance: 0.15
|
|
58
|
+
},
|
|
59
|
+
'MacIntel': {
|
|
60
|
+
quotaBase: 250 * 1024 * 1024 * 1024, // ~250GB typical Mac
|
|
61
|
+
usageBase: 45 * 1024 * 1024,
|
|
62
|
+
variance: 0.12
|
|
63
|
+
},
|
|
64
|
+
'Linux x86_64': {
|
|
65
|
+
quotaBase: 200 * 1024 * 1024 * 1024, // ~200GB typical Linux
|
|
66
|
+
usageBase: 40 * 1024 * 1024,
|
|
67
|
+
variance: 0.18
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const config = storageConfigs[platform] || storageConfigs['Win32'];
|
|
72
|
+
|
|
73
|
+
// Calculate consistent but varied values
|
|
74
|
+
const quotaVariance = seededRandom(sessionSeed, 1 - config.variance, 1 + config.variance);
|
|
75
|
+
const usageVariance = seededRandom(sessionSeed + 1, 0.5, 2);
|
|
76
|
+
|
|
77
|
+
const quota = Math.floor(config.quotaBase * quotaVariance);
|
|
78
|
+
const usage = Math.floor(config.usageBase * usageVariance);
|
|
79
|
+
|
|
80
|
+
return Promise.resolve({
|
|
81
|
+
quota: quota,
|
|
82
|
+
usage: usage,
|
|
83
|
+
usageDetails: {
|
|
84
|
+
indexedDB: Math.floor(usage * 0.6),
|
|
85
|
+
caches: Math.floor(usage * 0.3),
|
|
86
|
+
serviceWorkerRegistrations: Math.floor(usage * 0.1)
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// 2. Override StorageManager.persist()
|
|
94
|
+
const spoofStoragePersist = () => {
|
|
95
|
+
if (navigator.storage && navigator.storage.persist) {
|
|
96
|
+
navigator.storage.persist = function() {
|
|
97
|
+
// Most browsers return false unless explicitly granted
|
|
98
|
+
return Promise.resolve(false);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (navigator.storage && navigator.storage.persisted) {
|
|
103
|
+
navigator.storage.persisted = function() {
|
|
104
|
+
return Promise.resolve(false);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// 3. Protect IndexedDB from fingerprinting
|
|
110
|
+
const spoofIndexedDB = () => {
|
|
111
|
+
if (!window.indexedDB) return;
|
|
112
|
+
|
|
113
|
+
const originalOpen = window.indexedDB.open;
|
|
114
|
+
const originalDatabases = window.indexedDB.databases;
|
|
115
|
+
|
|
116
|
+
// Track opened databases for consistency
|
|
117
|
+
const openedDatabases = new Set();
|
|
118
|
+
|
|
119
|
+
window.indexedDB.open = function(name, version) {
|
|
120
|
+
openedDatabases.add(name);
|
|
121
|
+
return originalOpen.call(this, name, version);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// Override databases() to hide fingerprinting attempts
|
|
125
|
+
if (originalDatabases) {
|
|
126
|
+
window.indexedDB.databases = function() {
|
|
127
|
+
// Return only databases that were opened in this session
|
|
128
|
+
return originalDatabases.call(this).then(databases => {
|
|
129
|
+
// Filter to only known databases or return empty for privacy
|
|
130
|
+
return databases.filter(db =>
|
|
131
|
+
openedDatabases.has(db.name) ||
|
|
132
|
+
// Allow common legitimate databases
|
|
133
|
+
db.name.startsWith('firebaseLocalStorage') ||
|
|
134
|
+
db.name === 'localforage'
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// 4. Override localStorage/sessionStorage quota reporting
|
|
142
|
+
const spoofStorageQuota = () => {
|
|
143
|
+
// Create consistent storage size reporting
|
|
144
|
+
const getStorageSize = (storage) => {
|
|
145
|
+
let totalSize = 0;
|
|
146
|
+
try {
|
|
147
|
+
for (let i = 0; i < storage.length; i++) {
|
|
148
|
+
const key = storage.key(i);
|
|
149
|
+
if (key) {
|
|
150
|
+
totalSize += key.length + (storage.getItem(key) || '').length;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} catch (e) {}
|
|
154
|
+
return totalSize;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// Ensure storage appears normal
|
|
158
|
+
const originalLocalStorageLength = Object.getOwnPropertyDescriptor(Storage.prototype, 'length');
|
|
159
|
+
|
|
160
|
+
if (originalLocalStorageLength) {
|
|
161
|
+
Object.defineProperty(Storage.prototype, 'length', {
|
|
162
|
+
get() {
|
|
163
|
+
// Return actual length but ensure it's reasonable
|
|
164
|
+
const actualLength = originalLocalStorageLength.get.call(this);
|
|
165
|
+
return actualLength;
|
|
166
|
+
},
|
|
167
|
+
configurable: true,
|
|
168
|
+
enumerable: true
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// 5. Override CacheStorage.keys()
|
|
174
|
+
const spoofCacheStorage = () => {
|
|
175
|
+
if ('caches' in window) {
|
|
176
|
+
const originalKeys = CacheStorage.prototype.keys;
|
|
177
|
+
const originalOpen = CacheStorage.prototype.open;
|
|
178
|
+
const originalHas = CacheStorage.prototype.has;
|
|
179
|
+
const originalDelete = CacheStorage.prototype.delete;
|
|
180
|
+
|
|
181
|
+
// Track caches opened in this session
|
|
182
|
+
const sessionCaches = new Set();
|
|
183
|
+
|
|
184
|
+
CacheStorage.prototype.open = function(cacheName) {
|
|
185
|
+
sessionCaches.add(cacheName);
|
|
186
|
+
return originalOpen.call(this, cacheName);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
CacheStorage.prototype.keys = function() {
|
|
190
|
+
return originalKeys.call(this).then(keys => {
|
|
191
|
+
// Filter to only return caches that are expected
|
|
192
|
+
return keys.filter(key =>
|
|
193
|
+
sessionCaches.has(key) ||
|
|
194
|
+
// Allow common legitimate cache names
|
|
195
|
+
key.includes('workbox') ||
|
|
196
|
+
key.includes('runtime') ||
|
|
197
|
+
key.includes('precache') ||
|
|
198
|
+
key.includes('sw-') ||
|
|
199
|
+
key.includes('v1') ||
|
|
200
|
+
key.includes('v2')
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
CacheStorage.prototype.has = function(cacheName) {
|
|
206
|
+
// Be honest about caches that exist
|
|
207
|
+
return originalHas.call(this, cacheName);
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// 6. Protect FileSystem API
|
|
213
|
+
const spoofFileSystemAPI = () => {
|
|
214
|
+
// Protect requestFileSystem if available
|
|
215
|
+
if (window.requestFileSystem || window.webkitRequestFileSystem) {
|
|
216
|
+
const originalRequestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
|
|
217
|
+
|
|
218
|
+
window.requestFileSystem = window.webkitRequestFileSystem = function(type, size, successCallback, errorCallback) {
|
|
219
|
+
// Allow the request but with controlled quota
|
|
220
|
+
const maxSize = 50 * 1024 * 1024; // 50MB max
|
|
221
|
+
const limitedSize = Math.min(size, maxSize);
|
|
222
|
+
|
|
223
|
+
return originalRequestFileSystem.call(
|
|
224
|
+
window,
|
|
225
|
+
type,
|
|
226
|
+
limitedSize,
|
|
227
|
+
successCallback,
|
|
228
|
+
errorCallback
|
|
229
|
+
);
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Protect StorageManager quota
|
|
234
|
+
if (navigator.storage && navigator.storage.estimate) {
|
|
235
|
+
// Already handled above
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// 7. Cookie Store API protection
|
|
240
|
+
// NOTE: Removed aggressive cookie filtering that blocked cookies containing
|
|
241
|
+
// 'deviceId' or 'browser_id'. This broke legitimate site functionality
|
|
242
|
+
// (many sites use these cookie names for session tracking).
|
|
243
|
+
// Cookie-based fingerprinting is better handled at the network/proxy layer.
|
|
244
|
+
const spoofCookieStore = () => {
|
|
245
|
+
// No-op: cookie filtering removed to avoid breaking sites
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// 8. Web SQL Database protection (deprecated but still detected)
|
|
249
|
+
const spoofWebSQL = () => {
|
|
250
|
+
if (window.openDatabase) {
|
|
251
|
+
const originalOpenDatabase = window.openDatabase;
|
|
252
|
+
const openedDatabases = new Set();
|
|
253
|
+
|
|
254
|
+
window.openDatabase = function(name, version, displayName, estimatedSize) {
|
|
255
|
+
openedDatabases.add(name);
|
|
256
|
+
|
|
257
|
+
// Limit estimated size to prevent fingerprinting through quota
|
|
258
|
+
const limitedSize = Math.min(estimatedSize || 0, 5 * 1024 * 1024);
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
return originalOpenDatabase.call(
|
|
262
|
+
window,
|
|
263
|
+
name,
|
|
264
|
+
version,
|
|
265
|
+
displayName,
|
|
266
|
+
limitedSize
|
|
267
|
+
);
|
|
268
|
+
} catch (e) {
|
|
269
|
+
// Web SQL is deprecated, return gracefully
|
|
270
|
+
throw e;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// 9. Broadcast Channel API protection
|
|
277
|
+
const spoofBroadcastChannel = () => {
|
|
278
|
+
if (typeof BroadcastChannel !== 'undefined') {
|
|
279
|
+
const OriginalBroadcastChannel = BroadcastChannel;
|
|
280
|
+
const channels = new Map();
|
|
281
|
+
|
|
282
|
+
window.BroadcastChannel = function(name) {
|
|
283
|
+
const channel = new OriginalBroadcastChannel(name);
|
|
284
|
+
|
|
285
|
+
// Track channel usage
|
|
286
|
+
if (!channels.has(name)) {
|
|
287
|
+
channels.set(name, []);
|
|
288
|
+
}
|
|
289
|
+
channels.get(name).push(channel);
|
|
290
|
+
|
|
291
|
+
return channel;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// Note: Don't assign to prototype - it may be frozen in modern Chrome
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// 10. SharedWorker storage protection
|
|
299
|
+
const spoofSharedWorker = () => {
|
|
300
|
+
if (typeof SharedWorker !== 'undefined') {
|
|
301
|
+
const OriginalSharedWorker = SharedWorker;
|
|
302
|
+
const workers = new Set();
|
|
303
|
+
|
|
304
|
+
window.SharedWorker = function(scriptURL, options) {
|
|
305
|
+
const urlString = typeof scriptURL === 'string' ? scriptURL : scriptURL.toString();
|
|
306
|
+
workers.add(urlString);
|
|
307
|
+
|
|
308
|
+
return new OriginalSharedWorker(scriptURL, options);
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// Note: Don't assign to prototype - it may be frozen in modern Chrome
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
// Initialize all storage protections
|
|
316
|
+
try {
|
|
317
|
+
spoofStorageEstimate();
|
|
318
|
+
spoofStoragePersist();
|
|
319
|
+
spoofIndexedDB();
|
|
320
|
+
spoofStorageQuota();
|
|
321
|
+
spoofCacheStorage();
|
|
322
|
+
spoofFileSystemAPI();
|
|
323
|
+
spoofCookieStore();
|
|
324
|
+
spoofWebSQL();
|
|
325
|
+
spoofBroadcastChannel();
|
|
326
|
+
spoofSharedWorker();
|
|
327
|
+
} catch (e) {
|
|
328
|
+
console.error('[STORAGE-CONSISTENCY] Failed to apply storage consistency:', e);
|
|
329
|
+
throw e; // Rethrow to make errors visible
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
334
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
console.log(DEBUG_PREFIX, 'Starting storage consistency...');
|
|
338
|
+
spoofStorageAPIs();
|
|
339
|
+
console.log(DEBUG_PREFIX, '✓ Storage consistency applied');
|
|
340
|
+
} catch (e) {
|
|
341
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply storage consistency:', e);
|
|
342
|
+
throw e;
|
|
343
|
+
}
|
|
344
|
+
})();`;
|
|
345
|
+
};
|
|
346
|
+
//# sourceMappingURL=storage-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/storage-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACvD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2UL,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timing Consistency Module
|
|
3
|
+
* Dedicated timing fingerprint protection for 2024-2025
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Consistent Date.now() and performance.now() relationship
|
|
7
|
+
* - PerformanceEntry timing value protection
|
|
8
|
+
* - performance.measureUserAgentSpecificMemory() handling
|
|
9
|
+
* - event.timeStamp consistency in dispatched events
|
|
10
|
+
* - requestAnimationFrame timing patterns
|
|
11
|
+
*/
|
|
12
|
+
export declare const createTimingConsistencyScript: () => string;
|
|
13
|
+
//# sourceMappingURL=timing-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-consistency.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/timing-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,6BAA6B,QAAO,MA2PhD,CAAC"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timing Consistency Module
|
|
3
|
+
* Dedicated timing fingerprint protection for 2024-2025
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Consistent Date.now() and performance.now() relationship
|
|
7
|
+
* - PerformanceEntry timing value protection
|
|
8
|
+
* - performance.measureUserAgentSpecificMemory() handling
|
|
9
|
+
* - event.timeStamp consistency in dispatched events
|
|
10
|
+
* - requestAnimationFrame timing patterns
|
|
11
|
+
*/
|
|
12
|
+
export const createTimingConsistencyScript = () => {
|
|
13
|
+
return `
|
|
14
|
+
(() => {
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
// Timing Consistency for 2024-2025
|
|
18
|
+
const setupTimingConsistency = () => {
|
|
19
|
+
// Base timestamps for consistency
|
|
20
|
+
const pageLoadTime = Date.now();
|
|
21
|
+
const performanceOrigin = performance.timeOrigin || pageLoadTime;
|
|
22
|
+
|
|
23
|
+
// Store original methods
|
|
24
|
+
const originalDateNow = Date.now;
|
|
25
|
+
const originalPerformanceNow = performance.now.bind(performance);
|
|
26
|
+
|
|
27
|
+
// Generate session seed for consistent variations
|
|
28
|
+
const generateSeed = () => {
|
|
29
|
+
const ua = navigator.userAgent || '';
|
|
30
|
+
return ua.length * 17 + (screen.width || 0) * 31;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const sessionSeed = generateSeed();
|
|
34
|
+
|
|
35
|
+
// Seeded PRNG (mulberry32) for consistent values
|
|
36
|
+
const seededRandom = (seed) => {
|
|
37
|
+
let s = seed | 0;
|
|
38
|
+
s = s + 0x6D2B79F5 | 0;
|
|
39
|
+
let t = Math.imul(s ^ s >>> 15, 1 | s);
|
|
40
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
41
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// 1. Date.now() and performance.now() consistency
|
|
45
|
+
// NOTE: We intentionally do NOT override Date.now() or performance.now() here.
|
|
46
|
+
// Enforcing monotonic increase or adding jitter is itself detectable.
|
|
47
|
+
// The performance-spoofing module handles platform-specific timing characteristics.
|
|
48
|
+
const ensureDatePerformanceConsistency = () => {
|
|
49
|
+
// No-op: timing functions should behave naturally
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// 2. Protect PerformanceEntry timing values
|
|
53
|
+
const protectPerformanceEntries = () => {
|
|
54
|
+
const originalGetEntries = performance.getEntries.bind(performance);
|
|
55
|
+
const originalGetEntriesByName = performance.getEntriesByName.bind(performance);
|
|
56
|
+
const originalGetEntriesByType = performance.getEntriesByType.bind(performance);
|
|
57
|
+
|
|
58
|
+
// Add consistent variations to timing entries
|
|
59
|
+
const adjustEntry = (entry) => {
|
|
60
|
+
if (!entry) return entry;
|
|
61
|
+
|
|
62
|
+
const timingProps = [
|
|
63
|
+
'startTime', 'duration', 'fetchStart', 'domainLookupStart',
|
|
64
|
+
'domainLookupEnd', 'connectStart', 'secureConnectionStart',
|
|
65
|
+
'connectEnd', 'requestStart', 'responseStart', 'responseEnd',
|
|
66
|
+
'workerStart', 'redirectStart', 'redirectEnd', 'processingStart',
|
|
67
|
+
'processingEnd', 'loadEventStart', 'loadEventEnd',
|
|
68
|
+
'unloadEventStart', 'unloadEventEnd'
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
const adjusted = {};
|
|
72
|
+
|
|
73
|
+
for (const key of Object.keys(entry)) {
|
|
74
|
+
if (timingProps.includes(key) && typeof entry[key] === 'number' && entry[key] > 0) {
|
|
75
|
+
// Add consistent micro-variation
|
|
76
|
+
const variation = seededRandom(sessionSeed + entry[key]) * 0.001;
|
|
77
|
+
adjusted[key] = entry[key] + variation;
|
|
78
|
+
} else {
|
|
79
|
+
adjusted[key] = entry[key];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Preserve prototype
|
|
84
|
+
Object.setPrototypeOf(adjusted, Object.getPrototypeOf(entry));
|
|
85
|
+
|
|
86
|
+
return adjusted;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
performance.getEntries = function() {
|
|
90
|
+
return originalGetEntries().map(adjustEntry);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
performance.getEntriesByName = function(name, type) {
|
|
94
|
+
return originalGetEntriesByName(name, type).map(adjustEntry);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
performance.getEntriesByType = function(type) {
|
|
98
|
+
return originalGetEntriesByType(type).map(adjustEntry);
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// 3. Handle performance.measureUserAgentSpecificMemory()
|
|
103
|
+
const protectMemoryMeasurement = () => {
|
|
104
|
+
if (performance.measureUserAgentSpecificMemory) {
|
|
105
|
+
const originalMeasure = performance.measureUserAgentSpecificMemory.bind(performance);
|
|
106
|
+
|
|
107
|
+
performance.measureUserAgentSpecificMemory = function() {
|
|
108
|
+
return originalMeasure().then(result => {
|
|
109
|
+
// Normalize memory values to be less fingerprintable
|
|
110
|
+
const normalizedBytes = Math.round(result.bytes / (1024 * 1024)) * 1024 * 1024;
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
bytes: normalizedBytes + Math.floor(seededRandom(sessionSeed) * 1024 * 100),
|
|
114
|
+
breakdown: (result.breakdown || []).map(item => ({
|
|
115
|
+
...item,
|
|
116
|
+
bytes: Math.round(item.bytes / 1024) * 1024
|
|
117
|
+
}))
|
|
118
|
+
};
|
|
119
|
+
}).catch(() => {
|
|
120
|
+
// Return a reasonable default if measurement fails
|
|
121
|
+
return {
|
|
122
|
+
bytes: 30 * 1024 * 1024 + Math.floor(seededRandom(sessionSeed) * 5 * 1024 * 1024),
|
|
123
|
+
breakdown: []
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// 4. Event timeStamp consistency
|
|
131
|
+
// NOTE: Overriding Event/CustomEvent constructors to force timeStamp breaks
|
|
132
|
+
// trusted event detection (real events have their own timestamps set by the browser).
|
|
133
|
+
// Removed: the original override replaced timeStamp on ALL events which broke timing analysis.
|
|
134
|
+
const ensureEventTimestampConsistency = () => {
|
|
135
|
+
// No-op: event timestamps should come from the browser naturally
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
// 5. requestAnimationFrame timing patterns
|
|
139
|
+
// NOTE: Removed RAF timing modification - adding jitter to rAF timestamps
|
|
140
|
+
// is detectable and breaks animation-dependent code.
|
|
141
|
+
const normalizeRAFTiming = () => {
|
|
142
|
+
// No-op: rAF timestamps should come from the browser naturally
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// 6. setTimeout/setInterval timing normalization
|
|
146
|
+
// NOTE: Removed timer jitter - modifying setTimeout/setInterval delays breaks
|
|
147
|
+
// timing-dependent code (debouncing, polling, animations) and the consistent
|
|
148
|
+
// seeded offset is itself a fingerprint.
|
|
149
|
+
const normalizeTimerTiming = () => {
|
|
150
|
+
// No-op: timers should behave naturally
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// 7. Performance Observer timing protection
|
|
154
|
+
// NOTE: Removed - this duplicates the PerformanceObserver override in
|
|
155
|
+
// performance-spoofing.ts. Double-wrapping creates detectable proxy chains.
|
|
156
|
+
const protectPerformanceObserver = () => {
|
|
157
|
+
// No-op: handled by performance-spoofing module
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// 8. Idle callback timing
|
|
161
|
+
// NOTE: Removed - this duplicates the requestIdleCallback override in
|
|
162
|
+
// performance-spoofing.ts. Double-wrapping is detectable.
|
|
163
|
+
const normalizeIdleCallback = () => {
|
|
164
|
+
// No-op: handled by performance-spoofing module
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// 9. Navigation Timing API protection
|
|
168
|
+
const protectNavigationTiming = () => {
|
|
169
|
+
if (performance.timing) {
|
|
170
|
+
const originalTiming = performance.timing;
|
|
171
|
+
const timingProxy = {};
|
|
172
|
+
|
|
173
|
+
const timingProps = [
|
|
174
|
+
'navigationStart', 'unloadEventStart', 'unloadEventEnd',
|
|
175
|
+
'redirectStart', 'redirectEnd', 'fetchStart',
|
|
176
|
+
'domainLookupStart', 'domainLookupEnd', 'connectStart',
|
|
177
|
+
'connectEnd', 'secureConnectionStart', 'requestStart',
|
|
178
|
+
'responseStart', 'responseEnd', 'domLoading',
|
|
179
|
+
'domInteractive', 'domContentLoadedEventStart',
|
|
180
|
+
'domContentLoadedEventEnd', 'domComplete',
|
|
181
|
+
'loadEventStart', 'loadEventEnd'
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
timingProps.forEach(prop => {
|
|
185
|
+
const originalValue = originalTiming[prop];
|
|
186
|
+
if (typeof originalValue === 'number' && originalValue > 0) {
|
|
187
|
+
Object.defineProperty(timingProxy, prop, {
|
|
188
|
+
get: () => originalValue + seededRandom(sessionSeed + originalValue) * 0.5,
|
|
189
|
+
configurable: true,
|
|
190
|
+
enumerable: true
|
|
191
|
+
});
|
|
192
|
+
} else {
|
|
193
|
+
Object.defineProperty(timingProxy, prop, {
|
|
194
|
+
get: () => originalValue,
|
|
195
|
+
configurable: true,
|
|
196
|
+
enumerable: true
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Add toJSON method
|
|
202
|
+
timingProxy.toJSON = function() {
|
|
203
|
+
const json = {};
|
|
204
|
+
timingProps.forEach(prop => {
|
|
205
|
+
json[prop] = this[prop];
|
|
206
|
+
});
|
|
207
|
+
return json;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
Object.setPrototypeOf(timingProxy, PerformanceTiming.prototype);
|
|
211
|
+
|
|
212
|
+
Object.defineProperty(performance, 'timing', {
|
|
213
|
+
get: () => timingProxy,
|
|
214
|
+
configurable: true
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
// 10. High Resolution Time protection
|
|
220
|
+
const protectHighResolutionTime = () => {
|
|
221
|
+
// Ensure performance.timeOrigin is consistent
|
|
222
|
+
if (performance.timeOrigin) {
|
|
223
|
+
const originalOrigin = performance.timeOrigin;
|
|
224
|
+
const adjustedOrigin = originalOrigin + seededRandom(sessionSeed) * 0.1;
|
|
225
|
+
|
|
226
|
+
Object.defineProperty(performance, 'timeOrigin', {
|
|
227
|
+
get: () => adjustedOrigin,
|
|
228
|
+
configurable: true
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
// Initialize all timing protections
|
|
234
|
+
try {
|
|
235
|
+
ensureDatePerformanceConsistency();
|
|
236
|
+
protectPerformanceEntries();
|
|
237
|
+
protectMemoryMeasurement();
|
|
238
|
+
ensureEventTimestampConsistency();
|
|
239
|
+
normalizeRAFTiming();
|
|
240
|
+
normalizeTimerTiming();
|
|
241
|
+
protectPerformanceObserver();
|
|
242
|
+
normalizeIdleCallback();
|
|
243
|
+
protectNavigationTiming();
|
|
244
|
+
protectHighResolutionTime();
|
|
245
|
+
} catch (e) {
|
|
246
|
+
console.error('[TIMING-CONSISTENCY] Failed to apply timing consistency:', e);
|
|
247
|
+
throw e; // Rethrow to make errors visible
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const DEBUG_PREFIX = '[CDP-FP-DEBUG]';
|
|
252
|
+
const ERROR_PREFIX = '[CDP-FP-ERROR]';
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
console.log(DEBUG_PREFIX, 'Starting timing consistency...');
|
|
256
|
+
setupTimingConsistency();
|
|
257
|
+
console.log(DEBUG_PREFIX, '✓ Timing consistency applied');
|
|
258
|
+
} catch (e) {
|
|
259
|
+
console.error(ERROR_PREFIX, '✗ Failed to apply timing consistency:', e);
|
|
260
|
+
throw e;
|
|
261
|
+
}
|
|
262
|
+
})();`;
|
|
263
|
+
};
|
|
264
|
+
//# sourceMappingURL=timing-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/timing-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAW,EAAE;IACtD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyPL,CAAC;AACP,CAAC,CAAC"}
|