jumpy-lion 0.1.2 → 0.1.4
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.js +1 -1
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +3 -1
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +7 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +92 -12
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +18 -1
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/coalesced-events-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +13 -3
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts +14 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js +160 -0
- package/dist/fingerprinting/fingerprint-overrides/media-codecs-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +16 -1
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +19 -17
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +77 -19
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +27 -18
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +16 -4
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +16 -2
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +20 -9
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -10,11 +10,21 @@ export const createFontSpoofingScript = () => {
|
|
|
10
10
|
|
|
11
11
|
// Font Spoofing for 2025 - Platform-aware font availability with randomization
|
|
12
12
|
const spoofFonts = () => {
|
|
13
|
-
//
|
|
13
|
+
// Stable seed: must NOT use Date.now() because this script re-executes on
|
|
14
|
+
// every reload via addScriptToEvaluateOnNewDocument. A real browser doesn't
|
|
15
|
+
// change its installed fonts between reloads.
|
|
14
16
|
const generateSeed = () => {
|
|
17
|
+
const _s = typeof __stealth !== 'undefined' ? __stealth : {};
|
|
18
|
+
const key = _s.seedKey || '';
|
|
15
19
|
const ua = navigator.userAgent || '';
|
|
16
|
-
const
|
|
17
|
-
|
|
20
|
+
const s = screen;
|
|
21
|
+
let h = 0xCAFE100A | 0;
|
|
22
|
+
for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
|
|
23
|
+
for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
|
|
24
|
+
h = (h << 5) - h + (s.width || 0) | 0;
|
|
25
|
+
h = (h << 5) - h + (s.height || 0) | 0;
|
|
26
|
+
h = (h << 5) - h + (s.colorDepth || 0) | 0;
|
|
27
|
+
return h >>> 0;
|
|
18
28
|
};
|
|
19
29
|
|
|
20
30
|
// Seeded PRNG (mulberry32) for consistent values
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/font-spoofing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACjD,OAAO
|
|
1
|
+
{"version":3,"file":"font-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/font-spoofing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4KV,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -33,4 +33,5 @@ export { createKeyboardHumanizationScript, setupKeyboardHumanization, generateTy
|
|
|
33
33
|
export { createScrollHumanizationScript, setupScrollHumanization, humanScroll, humanScrollToElement, generateScrollPath } from './scroll-humanization.js';
|
|
34
34
|
export { createDataDomeBypassScript } from './datadome-bypass.js';
|
|
35
35
|
export { createCoalescedEventsSpoofingScript } from './coalesced-events-spoofing.js';
|
|
36
|
+
export { createMediaCodecsSpoofingScript } from './media-codecs-spoofing.js';
|
|
36
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -37,4 +37,5 @@ export { createKeyboardHumanizationScript, setupKeyboardHumanization, generateTy
|
|
|
37
37
|
export { createScrollHumanizationScript, setupScrollHumanization, humanScroll, humanScrollToElement, generateScrollPath } from './scroll-humanization.js';
|
|
38
38
|
export { createDataDomeBypassScript } from './datadome-bypass.js';
|
|
39
39
|
export { createCoalescedEventsSpoofingScript } from './coalesced-events-spoofing.js';
|
|
40
|
+
export { createMediaCodecsSpoofingScript } from './media-codecs-spoofing.js';
|
|
40
41
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAoB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAuB,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAA0B,MAAM,YAAY,CAAC;AAEvF,6CAA6C;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAwB;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAoB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAuB,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAA0B,MAAM,YAAY,CAAC;AAEvF,6CAA6C;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAwB;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EACH,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Codecs Spoofing
|
|
3
|
+
*
|
|
4
|
+
* Ensures HTMLMediaElement.canPlayType() and MediaSource.isTypeSupported()
|
|
5
|
+
* return consistent results matching a real Chrome browser with hardware
|
|
6
|
+
* media decoding support.
|
|
7
|
+
*
|
|
8
|
+
* Detection vector: Headless Chrome and some automated Chrome instances
|
|
9
|
+
* lack hardware media decoders, causing canPlayType() to return '' for
|
|
10
|
+
* codecs that real Chrome supports (e.g., H.264, AAC). Anti-bot services
|
|
11
|
+
* like FingerprintJS and CreepJS check this.
|
|
12
|
+
*/
|
|
13
|
+
export declare const createMediaCodecsSpoofingScript: () => string;
|
|
14
|
+
//# sourceMappingURL=media-codecs-spoofing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-codecs-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/media-codecs-spoofing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,+BAA+B,QAAO,MAkJlD,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Codecs Spoofing
|
|
3
|
+
*
|
|
4
|
+
* Ensures HTMLMediaElement.canPlayType() and MediaSource.isTypeSupported()
|
|
5
|
+
* return consistent results matching a real Chrome browser with hardware
|
|
6
|
+
* media decoding support.
|
|
7
|
+
*
|
|
8
|
+
* Detection vector: Headless Chrome and some automated Chrome instances
|
|
9
|
+
* lack hardware media decoders, causing canPlayType() to return '' for
|
|
10
|
+
* codecs that real Chrome supports (e.g., H.264, AAC). Anti-bot services
|
|
11
|
+
* like FingerprintJS and CreepJS check this.
|
|
12
|
+
*/
|
|
13
|
+
export const createMediaCodecsSpoofingScript = () => {
|
|
14
|
+
return `
|
|
15
|
+
(() => {
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
// Map of media types and their expected support level in real Chrome desktop
|
|
19
|
+
// 'probably' = full support, 'maybe' = partial, '' = unsupported
|
|
20
|
+
const codecSupport = {
|
|
21
|
+
// Video codecs
|
|
22
|
+
'video/mp4': 'probably',
|
|
23
|
+
'video/mp4; codecs="avc1.42E01E"': 'probably',
|
|
24
|
+
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"': 'probably',
|
|
25
|
+
'video/mp4; codecs="avc1.4D401E"': 'probably',
|
|
26
|
+
'video/mp4; codecs="avc1.64001E"': 'probably',
|
|
27
|
+
'video/mp4; codecs="avc1.640028"': 'probably',
|
|
28
|
+
'video/mp4; codecs="avc1.4d002a"': 'probably',
|
|
29
|
+
'video/mp4; codecs="mp4a.40.2"': 'probably',
|
|
30
|
+
'video/mp4; codecs="mp4a.40.5"': 'probably',
|
|
31
|
+
'video/mp4; codecs="flac"': 'probably',
|
|
32
|
+
'video/mp4; codecs="hev1.1.6.L93.B0"': 'probably',
|
|
33
|
+
'video/mp4; codecs="hvc1.1.6.L93.B0"': 'probably',
|
|
34
|
+
'video/mp4; codecs="av01.0.04M.08"': 'probably',
|
|
35
|
+
'video/mp4; codecs="vp09.00.10.08"': 'probably',
|
|
36
|
+
'video/webm': 'probably',
|
|
37
|
+
'video/webm; codecs="vp8"': 'probably',
|
|
38
|
+
'video/webm; codecs="vp8, vorbis"': 'probably',
|
|
39
|
+
'video/webm; codecs="vp8, opus"': 'probably',
|
|
40
|
+
'video/webm; codecs="vp9"': 'probably',
|
|
41
|
+
'video/webm; codecs="vp9, opus"': 'probably',
|
|
42
|
+
'video/webm; codecs="vp09.00.10.08"': 'probably',
|
|
43
|
+
'video/webm; codecs="av01.0.04M.08"': 'probably',
|
|
44
|
+
'video/ogg': 'probably',
|
|
45
|
+
'video/ogg; codecs="theora"': 'probably',
|
|
46
|
+
'video/ogg; codecs="theora, vorbis"': 'probably',
|
|
47
|
+
// Audio codecs
|
|
48
|
+
'audio/mp4': 'maybe',
|
|
49
|
+
'audio/mp4; codecs="mp4a.40.2"': 'probably',
|
|
50
|
+
'audio/mp4; codecs="mp4a.40.5"': 'probably',
|
|
51
|
+
'audio/mp4; codecs="flac"': 'probably',
|
|
52
|
+
'audio/mp4; codecs="opus"': 'probably',
|
|
53
|
+
'audio/mpeg': 'probably',
|
|
54
|
+
'audio/ogg': 'probably',
|
|
55
|
+
'audio/ogg; codecs="vorbis"': 'probably',
|
|
56
|
+
'audio/ogg; codecs="opus"': 'probably',
|
|
57
|
+
'audio/ogg; codecs="flac"': 'probably',
|
|
58
|
+
'audio/webm': 'probably',
|
|
59
|
+
'audio/webm; codecs="vorbis"': 'probably',
|
|
60
|
+
'audio/webm; codecs="opus"': 'probably',
|
|
61
|
+
'audio/wav': 'probably',
|
|
62
|
+
'audio/wav; codecs="1"': 'probably',
|
|
63
|
+
'audio/wave': 'probably',
|
|
64
|
+
'audio/x-wav': 'probably',
|
|
65
|
+
'audio/flac': 'probably',
|
|
66
|
+
'audio/aac': 'probably',
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// MediaSource type support (for MSE-based playback)
|
|
70
|
+
const mseTypeSupport = {
|
|
71
|
+
'video/mp4; codecs="avc1.42E01E"': true,
|
|
72
|
+
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"': true,
|
|
73
|
+
'video/mp4; codecs="avc1.4D401E"': true,
|
|
74
|
+
'video/mp4; codecs="avc1.64001E"': true,
|
|
75
|
+
'video/mp4; codecs="avc1.640028"': true,
|
|
76
|
+
'video/mp4; codecs="mp4a.40.2"': true,
|
|
77
|
+
'video/mp4; codecs="mp4a.40.5"': true,
|
|
78
|
+
'video/mp4; codecs="flac"': true,
|
|
79
|
+
'video/mp4; codecs="av01.0.04M.08"': true,
|
|
80
|
+
'video/mp4; codecs="vp09.00.10.08"': true,
|
|
81
|
+
'video/webm; codecs="vp8"': true,
|
|
82
|
+
'video/webm; codecs="vp8, vorbis"': true,
|
|
83
|
+
'video/webm; codecs="vp9"': true,
|
|
84
|
+
'video/webm; codecs="vp9, opus"': true,
|
|
85
|
+
'video/webm; codecs="vp09.00.10.08"': true,
|
|
86
|
+
'audio/mp4; codecs="mp4a.40.2"': true,
|
|
87
|
+
'audio/mp4; codecs="mp4a.40.5"': true,
|
|
88
|
+
'audio/mp4; codecs="flac"': true,
|
|
89
|
+
'audio/mp4; codecs="opus"': true,
|
|
90
|
+
'audio/webm; codecs="vorbis"': true,
|
|
91
|
+
'audio/webm; codecs="opus"': true,
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// Patch canPlayType on HTMLMediaElement prototype
|
|
95
|
+
const origCanPlayType = HTMLMediaElement.prototype.canPlayType;
|
|
96
|
+
HTMLMediaElement.prototype.canPlayType = function(type) {
|
|
97
|
+
// Normalize the type string for lookup
|
|
98
|
+
const normalized = type.replace(/\\s+/g, ' ').trim();
|
|
99
|
+
|
|
100
|
+
// Check our known-good codec support map
|
|
101
|
+
if (normalized in codecSupport) {
|
|
102
|
+
return codecSupport[normalized];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// For unknown types, fall through to native implementation
|
|
106
|
+
return origCanPlayType.call(this, type);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Register for native toString masking
|
|
110
|
+
const _s = typeof __stealth !== 'undefined' ? __stealth : {};
|
|
111
|
+
if (_s.utils) {
|
|
112
|
+
_s.utils.registerNativeFunction(HTMLMediaElement.prototype.canPlayType, 'canPlayType');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Patch MediaSource.isTypeSupported if available
|
|
116
|
+
if (typeof MediaSource !== 'undefined' && MediaSource.isTypeSupported) {
|
|
117
|
+
const origIsTypeSupported = MediaSource.isTypeSupported;
|
|
118
|
+
MediaSource.isTypeSupported = function(type) {
|
|
119
|
+
const normalized = type.replace(/\\s+/g, ' ').trim();
|
|
120
|
+
if (normalized in mseTypeSupport) {
|
|
121
|
+
return mseTypeSupport[normalized];
|
|
122
|
+
}
|
|
123
|
+
return origIsTypeSupported.call(this, type);
|
|
124
|
+
};
|
|
125
|
+
if (_s.utils) {
|
|
126
|
+
_s.utils.registerNativeFunction(MediaSource.isTypeSupported, 'isTypeSupported');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Also patch RTCRtpSender/Receiver.getCapabilities if available
|
|
131
|
+
// These report supported codecs for WebRTC
|
|
132
|
+
if (typeof RTCRtpSender !== 'undefined' && RTCRtpSender.getCapabilities) {
|
|
133
|
+
const origGetCaps = RTCRtpSender.getCapabilities;
|
|
134
|
+
RTCRtpSender.getCapabilities = function(kind) {
|
|
135
|
+
const result = origGetCaps.call(this, kind);
|
|
136
|
+
if (!result) return result;
|
|
137
|
+
|
|
138
|
+
// Ensure H264 is in the video codec list (missing in some headless configs)
|
|
139
|
+
if (kind === 'video' && result.codecs) {
|
|
140
|
+
const hasH264 = result.codecs.some(c =>
|
|
141
|
+
c.mimeType && c.mimeType.toLowerCase().includes('h264')
|
|
142
|
+
);
|
|
143
|
+
if (!hasH264) {
|
|
144
|
+
result.codecs.push({
|
|
145
|
+
clockRate: 90000,
|
|
146
|
+
mimeType: 'video/H264',
|
|
147
|
+
sdpFmtpLine: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
};
|
|
153
|
+
if (_s.utils) {
|
|
154
|
+
_s.utils.registerNativeFunction(RTCRtpSender.getCapabilities, 'getCapabilities');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
})();
|
|
158
|
+
`;
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=media-codecs-spoofing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-codecs-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/media-codecs-spoofing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgJV,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"mouse-humanization.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,8BAA8B,WAAkB,GAAG,KAAG,OAAO,CAAC,IAAI,CAkE9E,CAAC"}
|
|
@@ -22,7 +22,22 @@ export const setupMouseMovementHumanization = async (client) => {
|
|
|
22
22
|
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
// Stable seed: must NOT use Date.now() or Math.random() because this script
|
|
26
|
+
// re-executes on every reload via addScriptToEvaluateOnNewDocument.
|
|
27
|
+
const _stableHash = (salt) => {
|
|
28
|
+
const _s = typeof __stealth !== 'undefined' ? __stealth : {};
|
|
29
|
+
const key = _s.seedKey || '';
|
|
30
|
+
const ua = navigator.userAgent || '';
|
|
31
|
+
const s = screen;
|
|
32
|
+
let h = salt | 0;
|
|
33
|
+
for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
|
|
34
|
+
for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
|
|
35
|
+
h = (h << 5) - h + (s.width || 0) | 0;
|
|
36
|
+
h = (h << 5) - h + (s.height || 0) | 0;
|
|
37
|
+
h = (h << 5) - h + (s.colorDepth || 0) | 0;
|
|
38
|
+
return h >>> 0;
|
|
39
|
+
};
|
|
40
|
+
const sessionSeed = _stableHash(0xCAFE1009);
|
|
26
41
|
const seededRandom = createSeededRNG(sessionSeed);
|
|
27
42
|
|
|
28
43
|
// Bezier curve movement generator
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse-humanization.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;IAC/E,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"mouse-humanization.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/mouse-humanization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EAAE,MAAW,EAAiB,EAAE;IAC/E,2EAA2E;IAC3E,6FAA6F;IAC7F,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8D3D,EAAE,CAAC,CAAC;AACV,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,+BAA+B,QAAO,
|
|
1
|
+
{"version":3,"file":"performance-spoofing.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,+BAA+B,QAAO,MAkQlD,CAAC"}
|
|
@@ -18,7 +18,22 @@ export const createPerformanceSpoofingScript = () => {
|
|
|
18
18
|
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
|
-
|
|
21
|
+
// Stable seed: must NOT use Date.now() because this script re-executes on
|
|
22
|
+
// every reload via addScriptToEvaluateOnNewDocument.
|
|
23
|
+
const _stableHash = (salt) => {
|
|
24
|
+
const _s = typeof __stealth !== 'undefined' ? __stealth : {};
|
|
25
|
+
const key = _s.seedKey || '';
|
|
26
|
+
const ua = navigator.userAgent || '';
|
|
27
|
+
const s = screen;
|
|
28
|
+
let h = salt | 0;
|
|
29
|
+
for (let i = 0; i < key.length; i++) h = (h << 5) - h + key.charCodeAt(i) | 0;
|
|
30
|
+
for (let i = 0; i < ua.length; i++) h = (h << 5) - h + ua.charCodeAt(i) | 0;
|
|
31
|
+
h = (h << 5) - h + (s.width || 0) | 0;
|
|
32
|
+
h = (h << 5) - h + (s.height || 0) | 0;
|
|
33
|
+
h = (h << 5) - h + (s.colorDepth || 0) | 0;
|
|
34
|
+
return h >>> 0;
|
|
35
|
+
};
|
|
36
|
+
const sessionSeed = _stableHash(0xCAFE1005);
|
|
22
37
|
const seededRandom = createSeededRNG(sessionSeed);
|
|
23
38
|
|
|
24
39
|
// Store original methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO
|
|
1
|
+
{"version":3,"file":"performance-spoofing.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/performance-spoofing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAW,EAAE;IACxD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgQV,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1 +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,
|
|
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,MAimBpG,CAAC"}
|
|
@@ -21,7 +21,7 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
|
21
21
|
maxTouchPoints: 0,
|
|
22
22
|
platform: 'Win32',
|
|
23
23
|
oscpu: 'Windows NT 10.0; Win64; x64',
|
|
24
|
-
vendor: '',
|
|
24
|
+
vendor: 'Google Inc.',
|
|
25
25
|
vendorSub: '',
|
|
26
26
|
productSub: '20030107',
|
|
27
27
|
cookieEnabled: true,
|
|
@@ -46,13 +46,14 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
|
46
46
|
{ type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
|
|
47
47
|
],
|
|
48
48
|
// Windows-specific connection properties
|
|
49
|
+
// NOTE: 'type' is NOT available on desktop Chrome (only Android),
|
|
50
|
+
// so we intentionally omit it to match real browser behavior
|
|
49
51
|
connection: {
|
|
50
52
|
downlink: 10,
|
|
51
53
|
effectiveType: '4g',
|
|
52
54
|
onchange: null,
|
|
53
55
|
rtt: 50,
|
|
54
56
|
saveData: false,
|
|
55
|
-
type: 'ethernet',
|
|
56
57
|
},
|
|
57
58
|
},
|
|
58
59
|
'MacIntel': {
|
|
@@ -212,25 +213,26 @@ export const createPlatformConsistencyScript = (platform, fingerprintData) => {
|
|
|
212
213
|
safeDefineProperty(navigator, 'mimeTypes', mimeTypesGetter);
|
|
213
214
|
}
|
|
214
215
|
|
|
215
|
-
// Override navigator.connection
|
|
216
|
-
//
|
|
216
|
+
// Override navigator.connection using a Proxy
|
|
217
|
+
// Connection properties (rtt, downlink, etc.) are non-configurable getters in Chrome,
|
|
218
|
+
// so Object.defineProperty fails. A Proxy on the navigator property intercepts all reads.
|
|
219
|
+
// CRITICAL: rtt === 0 in headless mode is a well-known detection vector.
|
|
217
220
|
if (config.connection && navigator.connection) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
return;
|
|
221
|
+
const realConnection = navigator.connection;
|
|
222
|
+
const connectionOverrides = config.connection;
|
|
223
|
+
const connectionProxy = new Proxy(realConnection, {
|
|
224
|
+
get(target, prop, receiver) {
|
|
225
|
+
if (prop in connectionOverrides) {
|
|
226
|
+
return connectionOverrides[prop];
|
|
224
227
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
} catch (e) {
|
|
231
|
-
// Silently ignore non-configurable properties
|
|
228
|
+
const value = Reflect.get(target, prop, receiver);
|
|
229
|
+
if (typeof value === 'function') {
|
|
230
|
+
return value.bind(target);
|
|
231
|
+
}
|
|
232
|
+
return value;
|
|
232
233
|
}
|
|
233
234
|
});
|
|
235
|
+
safeDefineProperty(navigator, 'connection', () => connectionProxy);
|
|
234
236
|
}
|
|
235
237
|
|
|
236
238
|
// Override screen properties (with guards)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuBH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,QAAgB,EAAE,eAAgC,EAAU,EAAE;IAC1G,uDAAuD;IACvD,MAAM,eAAe,GAAG;QACpB,OAAO,EAAE;YACL,gBAAgB,EAAE,GAAG;YACrB,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,EAAE;YACd,mBAAmB,EAAE,CAAC;YACtB,cAAc,EAAE,CAAC;YACjB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,6BAA6B;YACpC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"platform-consistency.js","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/platform-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stealth-script.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,mBAAmB,QAAO,
|
|
1
|
+
{"version":3,"file":"stealth-script.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/stealth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,mBAAmB,QAAO,MAy8BtC,CAAC"}
|
|
@@ -84,10 +84,11 @@ export const createStealthScript = () => {
|
|
|
84
84
|
|
|
85
85
|
// 3. WebDriver and Automation Flags Removal (2025)
|
|
86
86
|
const removeAutomationFlags = () => {
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
// Override webdriver to false (NOT undefined).
|
|
88
|
+
// In real Chrome 89+, navigator.webdriver exists and is false.
|
|
89
|
+
// Setting to undefined would make 'webdriver' in navigator return false,
|
|
90
|
+
// which is itself a detection vector.
|
|
91
|
+
safeDefineGetter(navigator, 'webdriver', () => false, true);
|
|
91
92
|
|
|
92
93
|
// Remove automation indicators
|
|
93
94
|
const automationProperties = [
|
|
@@ -283,16 +284,22 @@ export const createStealthScript = () => {
|
|
|
283
284
|
};
|
|
284
285
|
|
|
285
286
|
// 8. Connection API Spoofing (2025)
|
|
287
|
+
// Uses Proxy because connection properties are non-configurable getters.
|
|
288
|
+
// rtt === 0 is a well-known headless detection vector.
|
|
286
289
|
const spoofConnectionAPI = () => {
|
|
287
290
|
if ('connection' in navigator || 'mozConnection' in navigator || 'webkitConnection' in navigator) {
|
|
288
|
-
const
|
|
289
|
-
if (
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
291
|
+
const realConnection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
|
|
292
|
+
if (realConnection) {
|
|
293
|
+
const overrides = { rtt: 50, downlink: 10.0, effectiveType: '4g', saveData: false };
|
|
294
|
+
const proxy = new Proxy(realConnection, {
|
|
295
|
+
get(target, prop, receiver) {
|
|
296
|
+
if (prop in overrides) return overrides[prop];
|
|
297
|
+
const val = Reflect.get(target, prop, receiver);
|
|
298
|
+
if (typeof val === 'function') return val.bind(target);
|
|
299
|
+
return val;
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
safeDefineGetter(navigator, 'connection', () => proxy);
|
|
296
303
|
}
|
|
297
304
|
}
|
|
298
305
|
};
|
|
@@ -334,22 +341,73 @@ export const createStealthScript = () => {
|
|
|
334
341
|
requestUpdateCheck: () => Promise.resolve(['no_update', {}]),
|
|
335
342
|
restart: () => {},
|
|
336
343
|
restartAfterDelay: () => {},
|
|
337
|
-
getPlatformInfo: () =>
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
344
|
+
getPlatformInfo: () => {
|
|
345
|
+
// Derive OS from navigator.platform for consistency
|
|
346
|
+
const p = (navigator.platform || '').toLowerCase();
|
|
347
|
+
let os = 'win';
|
|
348
|
+
let arch = 'x86-64';
|
|
349
|
+
if (p.includes('mac')) { os = 'mac'; arch = 'arm64'; }
|
|
350
|
+
else if (p.includes('linux')) { os = 'linux'; }
|
|
351
|
+
return Promise.resolve({ os, arch, nacl_arch: arch });
|
|
352
|
+
},
|
|
342
353
|
getPackageDirectoryEntry: () => Promise.resolve({}),
|
|
343
354
|
lastError: null
|
|
344
355
|
};
|
|
345
356
|
|
|
346
357
|
if (!window.chrome) window.chrome = {};
|
|
347
|
-
safeDefineProperty(window.chrome, 'runtime', {
|
|
348
|
-
value: runtime,
|
|
358
|
+
safeDefineProperty(window.chrome, 'runtime', {
|
|
359
|
+
value: runtime,
|
|
349
360
|
enumerable: true,
|
|
350
361
|
writable: false
|
|
351
362
|
});
|
|
352
363
|
}
|
|
364
|
+
|
|
365
|
+
// Ensure chrome.app exists (present in all real Chrome browsers)
|
|
366
|
+
if (window.chrome && !window.chrome.app) {
|
|
367
|
+
window.chrome.app = {
|
|
368
|
+
isInstalled: false,
|
|
369
|
+
InstallState: { DISABLED: 'disabled', INSTALLED: 'installed', NOT_INSTALLED: 'not_installed' },
|
|
370
|
+
RunningState: { CANNOT_RUN: 'cannot_run', READY_TO_RUN: 'ready_to_run', RUNNING: 'running' },
|
|
371
|
+
getDetails: () => null,
|
|
372
|
+
getIsInstalled: () => false,
|
|
373
|
+
installState: () => 'not_installed',
|
|
374
|
+
runningState: () => 'cannot_run',
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// chrome.csi() - Chrome-specific, returns page load timing info
|
|
379
|
+
if (window.chrome && !window.chrome.csi) {
|
|
380
|
+
window.chrome.csi = function() {
|
|
381
|
+
return {
|
|
382
|
+
onloadT: Date.now() - (Math.random() * 2000 + 500),
|
|
383
|
+
startE: Date.now() - (Math.random() * 3000 + 1000),
|
|
384
|
+
pageT: performance.now(),
|
|
385
|
+
tran: 15, // Normal navigation
|
|
386
|
+
};
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// chrome.loadTimes() - Chrome-specific, returns load timing info
|
|
391
|
+
if (window.chrome && !window.chrome.loadTimes) {
|
|
392
|
+
window.chrome.loadTimes = function() {
|
|
393
|
+
const now = Date.now() / 1000;
|
|
394
|
+
return {
|
|
395
|
+
commitLoadTime: now - Math.random() * 2,
|
|
396
|
+
connectionInfo: 'h2',
|
|
397
|
+
finishDocumentLoadTime: now - Math.random(),
|
|
398
|
+
finishLoadTime: now - Math.random() * 0.5,
|
|
399
|
+
firstPaintAfterLoadTime: 0,
|
|
400
|
+
firstPaintTime: now - Math.random() * 1.5,
|
|
401
|
+
navigationType: 'Other',
|
|
402
|
+
npnNegotiatedProtocol: 'h2',
|
|
403
|
+
requestTime: now - Math.random() * 3,
|
|
404
|
+
startLoadTime: now - Math.random() * 2.5,
|
|
405
|
+
wasAlternateProtocolAvailable: false,
|
|
406
|
+
wasFetchedViaSpdy: true,
|
|
407
|
+
wasNpnNegotiated: true,
|
|
408
|
+
};
|
|
409
|
+
};
|
|
410
|
+
}
|
|
353
411
|
};
|
|
354
412
|
|
|
355
413
|
// 10. Device Memory Spoofing (2024-2025)
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAu8BL,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ua-ch.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/ua-ch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iCAAiC,wCAExB,iBAAiB,KACpC,
|
|
1
|
+
{"version":3,"file":"ua-ch.d.ts","sourceRoot":"","sources":["../../../src/fingerprinting/fingerprint-overrides/ua-ch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,iCAAiC,wCAExB,iBAAiB,KACpC,MAuNF,CAAC"}
|