Anti-Fingerprinting Shield Plus

Spoofs browser fingerprint data: canvas, WebGL, audio, language, timezone, userAgent, screen size, memory, and more. Session-persistent with one-time domain values per session only. Runs in top frame only for stealth and realism.

目前为 2025-04-30 提交的版本,查看 最新版本

// ==UserScript==
// @name         Anti-Fingerprinting Shield Plus
// @namespace    https://365devnet.eu/userscripts
// @version      4.3
// @description  Spoofs browser fingerprint data: canvas, WebGL, audio, language, timezone, userAgent, screen size, memory, and more. Session-persistent with one-time domain values per session only. Runs in top frame only for stealth and realism.
// @author       Richard B
// @match        *://*/*
// @run-at       document-start
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';

  // ===== Skip if inside iframe =====
  if (window.top !== window.self) return;

  const DEBUG_MODE = true;
  const sessionId = getOrCreateSessionId();

  if (DEBUG_MODE) console.log(`[AFS+] Anti-Fingerprinting Shield v4.3 started. Session: ${sessionId}`);

  // ===== Randomization Pools =====
  const platforms = ['Win32', 'Linux x86_64', 'MacIntel', 'FreeBSD'];
  const languages = ['en-US', 'nl-NL', 'fr-FR', 'de-DE', 'sv-SE'];
  const timezones = ['UTC', 'Europe/Amsterdam', 'America/New_York', 'Asia/Tokyo'];
  const userAgents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
  ];
  const cores = [2, 4, 6, 8];
  const memorySizes = [2, 4, 8];
  const screenWidths = [1920, 1680, 1366];
  const screenHeights = [1080, 1050, 768];

  // ===== Get Spoofed Values (sessionStorage-backed) =====
  const spoofed = {
    platform: getOrSet('platform', platforms),
    language: getOrSet('language', languages),
    languages: () => [spoofed.language, 'en'],
    timezone: getOrSet('timezone', timezones),
    userAgent: getOrSet('userAgent', userAgents),
    cores: parseInt(getOrSet('cores', cores)),
    memory: parseInt(getOrSet('memory', memorySizes)),
    screenWidth: parseInt(getOrSet('screenWidth', screenWidths)),
    screenHeight: parseInt(getOrSet('screenHeight', screenHeights))
  };

  function getOrSet(key, pool) {
    const storageKey = '__afs_' + key;
    let value = sessionStorage.getItem(storageKey);
    if (!value) {
      value = pool[Math.floor(Math.random() * pool.length)];
      sessionStorage.setItem(storageKey, value);
    }
    return value;
  }

  function getOrCreateSessionId() {
    const key = '__afs_session_id';
    let id = sessionStorage.getItem(key);
    if (!id) {
      id = Math.random().toString(36).substring(2, 10);
      sessionStorage.setItem(key, id);
    }
    return id;
  }

  function spoof(obj, prop, valueFn) {
    try {
      Object.defineProperty(obj, prop, {
        get: valueFn,
        configurable: true
      });
    } catch (e) {}
  }

  // ===== Spoofing APIs =====
  spoof(navigator, 'language', () => spoofed.language);
  spoof(navigator, 'languages', () => spoofed.languages());
  spoof(navigator, 'platform', () => spoofed.platform);
  spoof(navigator, 'userAgent', () => spoofed.userAgent);
  spoof(navigator, 'hardwareConcurrency', () => spoofed.cores);
  spoof(navigator, 'deviceMemory', () => spoofed.memory);
  spoof(navigator, 'maxTouchPoints', () => 1);
  spoof(navigator, 'plugins', () => []);
  spoof(navigator, 'mimeTypes', () => ({ length: 0 }));
  spoof(navigator, 'mediaDevices', () => ({
    enumerateDevices: () => Promise.resolve([])
  }));
  spoof(navigator, 'webdriver', () => false);
  spoof(navigator, 'connection', () => ({
    downlink: 10,
    effectiveType: '4g',
    rtt: 50,
    saveData: false
  }));

  if (navigator.permissions && navigator.permissions.query) {
    const originalQuery = navigator.permissions.query;
    navigator.permissions.query = function (params) {
      if (params.name === 'notifications') {
        return Promise.resolve({ state: 'denied' });
      }
      return originalQuery.call(this, params);
    };
  }

  spoof(window.screen, 'width', () => spoofed.screenWidth);
  spoof(window.screen, 'height', () => spoofed.screenHeight);
  spoof(window, 'innerWidth', () => spoofed.screenWidth);
  spoof(window, 'innerHeight', () => spoofed.screenHeight - 40);

  try {
    const original = Intl.DateTimeFormat.prototype.resolvedOptions;
    Intl.DateTimeFormat.prototype.resolvedOptions = function () {
      const options = original.call(this);
      options.timeZone = spoofed.timezone;
      return options;
    };
  } catch (e) {}

  const AudioContext = window.AudioContext || window.webkitAudioContext;
  if (AudioContext && AnalyserNode.prototype.getFloatFrequencyData) {
    const original = AnalyserNode.prototype.getFloatFrequencyData;
    AnalyserNode.prototype.getFloatFrequencyData = function (arr) {
      original.call(this, arr);
      for (let i = 0; i < arr.length; i++) {
        arr[i] += Math.random() * 0.1;
      }
    };
  }

  const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
  CanvasRenderingContext2D.prototype.getImageData = function (x, y, w, h) {
    const data = originalGetImageData.call(this, x, y, w, h);
    for (let i = 0; i < data.data.length; i += 4) {
      data.data[i] += Math.floor(Math.random() * 3);
      data.data[i + 1] += Math.floor(Math.random() * 3);
      data.data[i + 2] += Math.floor(Math.random() * 3);
    }
    return data;
  };

  const originalGL = WebGLRenderingContext.prototype.getParameter;
  WebGLRenderingContext.prototype.getParameter = function (param) {
    const spoofMap = {
      37445: 'FakeVendor Inc.',
      37446: 'Virtual GPU Renderer',
      3379: 4096,
      35661: 8
    };
    return spoofMap[param] || originalGL.call(this, param);
  };

  window.DeviceMotionEvent = undefined;
  window.DeviceOrientationEvent = undefined;
  delete navigator.getBattery;

  window.addEventListener('beforeunload', e => {
    e.stopImmediatePropagation();
    e.preventDefault();
    return undefined;
  }, true);

  // ===== Debug Log =====
  if (DEBUG_MODE) {
    console.group(`[AFS+] Spoofed Fingerprint for Session: ${sessionId}`);
    console.log('User Agent     :', spoofed.userAgent);
    console.log('Platform       :', spoofed.platform);
    console.log('Language       :', spoofed.language);
    console.log('Languages      :', spoofed.languages().join(', '));
    console.log('Timezone       :', spoofed.timezone);
    console.log('CPU Cores      :', spoofed.cores);
    console.log('Device Memory  :', spoofed.memory);
    console.log('Screen Width   :', spoofed.screenWidth);
    console.log('Screen Height  :', spoofed.screenHeight);
    console.groupEnd();
  }
})();