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 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();
  }
})();