@@ -113,40 +113,113 @@ author: BlazeFTL
113113 } catch(e) {}
114114
115115 // Spoof navigator.userAgentData (Chrome-only modern UA hints API)
116- if (navigator.userAgentData !== undefined) {
117- try {
118- Object.defineProperty(navigator, 'userAgentData', {
119- get: () => ({
120- brands: [
121- { brand: 'Google Chrome', version: '137' },
122- { brand: 'Chromium', version: '137' },
123- { brand: 'Not/A)Brand', version: '24' },
124- ],
125- mobile: isMobile,
126- platform: isMobile ? 'Android' : 'Windows',
127- getHighEntropyValues: (hints) => Promise.resolve({
128- brands: [
129- { brand: 'Google Chrome', version: '137' },
130- { brand: 'Chromium', version: '137' },
131- { brand: 'Not/A)Brand', version: '24' },
132- ],
133- mobile: isMobile,
134- platform: isMobile ? 'Android' : 'Windows',
135- platformVersion: isMobile ? '10.0.0' : '15.0.0',
136- architecture: isMobile ? 'arm' : 'x86',
137- bitness: '64',
138- model: isMobile ? '' : '',
139- uaFullVersion: '137.0.0.0',
140- fullVersionList: [
141- { brand: 'Google Chrome', version: '137.0.0.0' },
142- { brand: 'Chromium', version: '137.0.0.0' },
143- { brand: 'Not/A)Brand', version: '24.0.0.0' },
144- ],
145- }),
146- toJSON: () => ({}),
147- }),
148- configurable: true,
149- });
150- } catch(e) {}
116+ const uadBrands = [
117+ { brand: 'Google Chrome', version: '137' },
118+ { brand: 'Chromium', version: '137' },
119+ { brand: 'Not/A)Brand', version: '24' },
120+ ];
121+ const uadBrandsFull = [
122+ { brand: 'Google Chrome', version: '137.0.0.0' },
123+ { brand: 'Chromium', version: '137.0.0.0' },
124+ { brand: 'Not/A)Brand', version: '24.0.0.0' },
125+ ];
126+ const uadObj = {
127+ brands: uadBrands,
128+ mobile: isMobile,
129+ platform: isMobile ? 'Android' : 'Windows',
130+ getHighEntropyValues: (hints) => Promise.resolve({
131+ brands: uadBrands,
132+ mobile: isMobile,
133+ platform: isMobile ? 'Android' : 'Windows',
134+ platformVersion: isMobile ? '10.0.0' : '15.0.0',
135+ architecture: isMobile ? 'arm' : 'x86',
136+ bitness: '64',
137+ model: '',
138+ uaFullVersion: '137.0.0.0',
139+ fullVersionList: uadBrandsFull,
140+ }),
141+ toJSON: () => ({}),
142+ };
143+
144+ try {
145+ Object.defineProperty(navigator, 'userAgentData', {
146+ get: () => uadObj,
147+ configurable: true,
148+ });
149+ } catch(e) {}
150+
151+ // Sec-CH-UA header values
152+ const secUA = '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"';
153+ const secUAMobile = isMobile ? '?1' : '?0';
154+ const secUAPlatform = isMobile ? '"Android"' : '"Windows"';
155+ const secUAFullVer = '"137.0.0.0"';
156+ const secUAPlatformVer = isMobile ? '"10.0.0"' : '"15.0.0"';
157+ const secUAArch = isMobile ? '"arm"' : '"x86"';
158+ const secUABitness = '"64"';
159+ const secUAModel = '""';
160+ const secUAFullVerList = '"Google Chrome";v="137.0.0.0", "Chromium";v="137.0.0.0", "Not/A)Brand";v="24.0.0.0"';
161+
162+ function injectSecHeaders(headers) {
163+ const set = (k, v) => {
164+ try { headers.set(k, v); } catch(e) {}
165+ };
166+ set('sec-ch-ua', secUA);
167+ set('sec-ch-ua-mobile', secUAMobile);
168+ set('sec-ch-ua-platform', secUAPlatform);
169+ set('sec-ch-ua-full-version', secUAFullVer);
170+ set('sec-ch-ua-platform-version', secUAPlatformVer);
171+ set('sec-ch-ua-arch', secUAArch);
172+ set('sec-ch-ua-bitness', secUABitness);
173+ set('sec-ch-ua-model', secUAModel);
174+ set('sec-ch-ua-full-version-list', secUAFullVerList);
175+ set('user-agent', spoofUA);
151176 }
177+
178+ // Proxy fetch to inject Sec-CH-UA headers
179+ const _fetch = window.fetch;
180+ window.fetch = new Proxy(_fetch, {
181+ apply(target, thisArg, args) {
182+ try {
183+ let [input, init] = args;
184+ init = init ? Object.assign({}, init) : {};
185+ const headers = new Headers(init.headers || {});
186+ injectSecHeaders(headers);
187+ init.headers = headers;
188+ args = [input, init];
189+ } catch(e) {}
190+ return Reflect.apply(target, thisArg, args);
191+ }
192+ });
193+
194+ // Proxy XMLHttpRequest.setRequestHeader to inject Sec-CH-UA headers on send
195+ const _open = XMLHttpRequest.prototype.open;
196+ const _send = XMLHttpRequest.prototype.send;
197+ const _setHeader = XMLHttpRequest.prototype.setRequestHeader;
198+
199+ XMLHttpRequest.prototype.open = new Proxy(_open, {
200+ apply(target, thisArg, args) {
201+ thisArg._blazeInjectUA = true;
202+ return Reflect.apply(target, thisArg, args);
203+ }
204+ });
205+
206+ XMLHttpRequest.prototype.send = new Proxy(_send, {
207+ apply(target, thisArg, args) {
208+ if (thisArg._blazeInjectUA) {
209+ const setH = (k, v) => {
210+ try { _setHeader.call(thisArg, k, v); } catch(e) {}
211+ };
212+ setH('sec-ch-ua', secUA);
213+ setH('sec-ch-ua-mobile', secUAMobile);
214+ setH('sec-ch-ua-platform', secUAPlatform);
215+ setH('sec-ch-ua-full-version', secUAFullVer);
216+ setH('sec-ch-ua-platform-version', secUAPlatformVer);
217+ setH('sec-ch-ua-arch', secUAArch);
218+ setH('sec-ch-ua-bitness', secUABitness);
219+ setH('sec-ch-ua-model', secUAModel);
220+ setH('sec-ch-ua-full-version-list', secUAFullVerList);
221+ }
222+ return Reflect.apply(target, thisArg, args);
223+ }
224+ });
152225})();
0 commit comments