javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS注入修改浏览器指纹信息

通过JS注入修改部分浏览器指纹信息的方法

作者:黑金IT

这篇文章主要介绍了如何通过JavaScript注入修改浏览器部分指纹信息,包括用户代理、屏幕分辨率、时区等,文章还提到了无法完全修改的信息类型,最后,推荐了几个用于验证指纹修改效果的工具,需要的朋友可以参考下

可以通过 JS 注入修改部分浏览器指纹信息。以下是可修改项与示例:

可修改的浏览器指纹信息

1. User-Agent(用户代理)

// 修改 navigator.userAgent
Object.defineProperty(navigator, 'userAgent', {
    get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});

// 修改 navigator.platform
Object.defineProperty(navigator, 'platform', {
    get: () => 'Win32'
});

2. 屏幕分辨率和颜色深度

// 修改屏幕信息
Object.defineProperty(screen, 'width', {
    get: () => 1920
});
Object.defineProperty(screen, 'height', {
    get: () => 1080
});
Object.defineProperty(screen, 'availWidth', {
    get: () => 1920
});
Object.defineProperty(screen, 'availHeight', {
    get: () => 1040
});
Object.defineProperty(screen, 'colorDepth', {
    get: () => 24
});
Object.defineProperty(screen, 'pixelDepth', {
    get: () => 24
});

3. 时区和语言

// 修改时区
const originalGetTimezoneOffset = Date.prototype.getTimezoneOffset;
Date.prototype.getTimezoneOffset = function() {
    return -480; // UTC+8 (北京时间)
};

// 修改语言
Object.defineProperty(navigator, 'language', {
    get: () => 'zh-CN'
});
Object.defineProperty(navigator, 'languages', {
    get: () => ['zh-CN', 'zh', 'en']
});

4. Canvas 指纹

// 修改 Canvas 指纹(通过添加噪声)
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
HTMLCanvasElement.prototype.toDataURL = function(type, quality) {
    const context = this.getContext('2d');
    const imageData = context.getImageData(0, 0, this.width, this.height);
    
    // 添加微小的随机噪声
    for (let i = 0; i < imageData.data.length; i += 4) {
        if (Math.random() < 0.01) { // 1% 的像素添加噪声
            imageData.data[i] += Math.random() * 2 - 1;
        }
    }
    context.putImageData(imageData, 0, 0);
    
    return originalToDataURL.call(this, type, quality);
};

// 修改 Canvas 指纹(通过字体渲染差异)
const originalFillText = CanvasRenderingContext2D.prototype.fillText;
CanvasRenderingContext2D.prototype.fillText = function(text, x, y, maxWidth) {
    // 添加微小的变换
    this.save();
    this.translate(Math.random() * 0.001, Math.random() * 0.001);
    originalFillText.call(this, text, x, y, maxWidth);
    this.restore();
};

5. WebGL 指纹

// 修改 WebGL 渲染器信息
const getParameter = WebGLRenderingContext.prototype.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
    if (parameter === this.VENDOR) {
        return 'Intel Inc.';
    }
    if (parameter === this.RENDERER) {
        return 'Intel Iris OpenGL Engine';
    }
    if (parameter === this.SHADING_LANGUAGE_VERSION) {
        return 'WebGL GLSL ES 1.0';
    }
    return getParameter.call(this, parameter);
};

// 修改 WebGL 扩展
const getExtension = WebGLRenderingContext.prototype.getExtension;
WebGLRenderingContext.prototype.getExtension = function(name) {
    const ext = getExtension.call(this, name);
    // 可以修改扩展的行为
    return ext;
};

6. 字体列表

// 修改字体检测结果
const originalOffsetWidth = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetWidth').get;
Object.defineProperty(HTMLElement.prototype, 'offsetWidth', {
    get: function() {
        // 检测字体时返回固定值
        if (this.style.fontFamily && this.style.fontFamily.includes('test-font')) {
            return 100; // 模拟字体存在
        }
        return originalOffsetWidth.call(this);
    }
});

7. 插件列表

// 修改插件列表
Object.defineProperty(navigator, 'plugins', {
    get: () => {
        const plugins = [];
        // 添加自定义插件
        plugins.push({
            name: 'Chrome PDF Plugin',
            description: 'Portable Document Format',
            filename: 'internal-pdf-viewer'
        });
        return plugins;
    }
});

// 修改 mimeTypes
Object.defineProperty(navigator, 'mimeTypes', {
    get: () => {
        const mimeTypes = [];
        mimeTypes.push({
            type: 'application/pdf',
            suffixes: 'pdf',
            description: 'Portable Document Format'
        });
        return mimeTypes;
    }
});

8. 硬件信息

// 修改硬件并发数
Object.defineProperty(navigator, 'hardwareConcurrency', {
    get: () => 8 // 模拟 8 核 CPU
});

// 修改设备内存
Object.defineProperty(navigator, 'deviceMemory', {
    get: () => 8 // 模拟 8GB 内存
});

9. 电池信息

// 修改电池信息
if (navigator.getBattery) {
    const originalGetBattery = navigator.getBattery;
    navigator.getBattery = function() {
        return Promise.resolve({
            charging: true,
            chargingTime: 0,
            dischargingTime: Infinity,
            level: 1.0
        });
    };
}

10. WebRTC IP 泄漏

// 阻止 WebRTC IP 泄漏
const originalRTCPeerConnection = window.RTCPeerConnection;
window.RTCPeerConnection = function(config, constraints) {
    // 修改配置,阻止本地 IP 泄漏
    const modifiedConfig = {
        ...config,
        iceServers: config?.iceServers || []
    };
    
    const pc = new originalRTCPeerConnection(modifiedConfig, constraints);
    
    // 拦截 createOffer/createAnswer
    const originalCreateOffer = pc.createOffer.bind(pc);
    pc.createOffer = function(options) {
        return originalCreateOffer(options).then(offer => {
            // 移除本地 IP 信息
            offer.sdp = offer.sdp.replace(/a=ice-ufrag:.*/g, '');
            offer.sdp = offer.sdp.replace(/a=ice-pwd:.*/g, '');
            return offer;
        });
    };
    
    return pc;
};

11. AudioContext 指纹

// 修改 AudioContext 指纹
const originalCreateOscillator = AudioContext.prototype.createOscillator;
AudioContext.prototype.createOscillator = function() {
    const oscillator = originalCreateOscillator.call(this);
    
    // 添加噪声到音频处理
    const originalStart = oscillator.start.bind(oscillator);
    oscillator.start = function(when) {
        // 添加微小的延迟变化
        const modifiedWhen = when + (Math.random() * 0.0001);
        return originalStart(modifiedWhen);
    };
    
    return oscillator;
};

12. 完整的指纹修改脚本示例

(function() {
    'use strict';
    
    // ========== 1. User-Agent 和平台 ==========
    Object.defineProperty(navigator, 'userAgent', {
        get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        configurable: true
    });
    
    Object.defineProperty(navigator, 'platform', {
        get: () => 'Win32',
        configurable: true
    });
    
    // ========== 2. 屏幕信息 ==========
    Object.defineProperty(screen, 'width', {
        get: () => 1920,
        configurable: true
    });
    Object.defineProperty(screen, 'height', {
        get: () => 1080,
        configurable: true
    });
    Object.defineProperty(screen, 'colorDepth', {
        get: () => 24,
        configurable: true
    });
    
    // ========== 3. 语言和时区 ==========
    Object.defineProperty(navigator, 'language', {
        get: () => 'zh-CN',
        configurable: true
    });
    Object.defineProperty(navigator, 'languages', {
        get: () => ['zh-CN', 'zh', 'en'],
        configurable: true
    });
    
    // ========== 4. 硬件信息 ==========
    Object.defineProperty(navigator, 'hardwareConcurrency', {
        get: () => 8,
        configurable: true
    });
    
    if ('deviceMemory' in navigator) {
        Object.defineProperty(navigator, 'deviceMemory', {
            get: () => 8,
            configurable: true
        });
    }
    
    // ========== 5. Canvas 指纹混淆 ==========
    const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
    HTMLCanvasElement.prototype.toDataURL = function(type, quality) {
        const context = this.getContext('2d');
        if (context) {
            const imageData = context.getImageData(0, 0, this.width, this.height);
            // 添加微小噪声
            for (let i = 0; i < imageData.data.length; i += 4) {
                if (Math.random() < 0.01) {
                    imageData.data[i] = Math.min(255, Math.max(0, imageData.data[i] + (Math.random() * 2 - 1)));
                }
            }
            context.putImageData(imageData, 0, 0);
        }
        return originalToDataURL.call(this, type, quality);
    };
    
    // ========== 6. WebGL 指纹修改 ==========
    const getParameter = WebGLRenderingContext.prototype.getParameter;
    WebGLRenderingContext.prototype.getParameter = function(parameter) {
        if (parameter === this.VENDOR) {
            return 'Intel Inc.';
        }
        if (parameter === this.RENDERER) {
            return 'Intel Iris OpenGL Engine';
        }
        return getParameter.call(this, parameter);
    };
    
    // ========== 7. 插件列表 ==========
    Object.defineProperty(navigator, 'plugins', {
        get: () => {
            const plugins = [];
            // 添加常见插件
            plugins.push({
                name: 'Chrome PDF Plugin',
                description: 'Portable Document Format',
                filename: 'internal-pdf-viewer',
                length: 1
            });
            return plugins;
        },
        configurable: true
    });
    
    // ========== 8. WebRTC IP 泄漏防护 ==========
    const originalRTCPeerConnection = window.RTCPeerConnection;
    window.RTCPeerConnection = function(config, constraints) {
        const pc = new originalRTCPeerConnection(config, constraints);
        
        const originalCreateOffer = pc.createOffer.bind(pc);
        pc.createOffer = function(options) {
            return originalCreateOffer(options).then(offer => {
                // 清理 SDP 中的敏感信息
                offer.sdp = offer.sdp.replace(/a=ice-ufrag:.*/g, '');
                offer.sdp = offer.sdp.replace(/a=ice-pwd:.*/g, '');
                return offer;
            });
        };
        
        return pc;
    };
    
    // ========== 9. AudioContext 指纹混淆 ==========
    if (window.AudioContext || window.webkitAudioContext) {
        const AudioContextClass = window.AudioContext || window.webkitAudioContext;
        const originalCreateOscillator = AudioContextClass.prototype.createOscillator;
        
        AudioContextClass.prototype.createOscillator = function() {
            const oscillator = originalCreateOscillator.call(this);
            // 添加微小的随机变化
            return oscillator;
        };
    }
    
    console.log('[Fingerprint] 浏览器指纹修改已应用');
})();

限制和注意事项

无法完全修改的信息

  1. HTTP 指纹:请求头顺序、TLS 指纹等(需在浏览器层面处理)
  2. 字体渲染:系统字体列表(需系统级修改)
  3. 硬件指纹:GPU 型号等(受浏览器限制)
  4. 行为指纹:鼠标移动、键盘输入模式等(需行为模拟)

检测和绕过

使用建议

  1. 适度修改:仅修改必要项
  2. 一致性:保持各项指纹一致
  3. 测试验证:使用指纹检测工具验证效果
  4. 合规使用:遵守相关法律法规

指纹检测工具

这些工具可用于验证修改效果。

以上就是通过JS注入修改部分浏览器指纹信息的方法的详细内容,更多关于JS注入修改浏览器指纹信息的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文