通过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] 浏览器指纹修改已应用');
})();
限制和注意事项
无法完全修改的信息
- HTTP 指纹:请求头顺序、TLS 指纹等(需在浏览器层面处理)
- 字体渲染:系统字体列表(需系统级修改)
- 硬件指纹:GPU 型号等(受浏览器限制)
- 行为指纹:鼠标移动、键盘输入模式等(需行为模拟)
检测和绕过
- 某些网站会检测指纹修改
- 可通过多种指纹交叉验证
- 过度修改可能被识别为异常
使用建议
- 适度修改:仅修改必要项
- 一致性:保持各项指纹一致
- 测试验证:使用指纹检测工具验证效果
- 合规使用:遵守相关法律法规
指纹检测工具
- FingerprintJS
- BrowserLeaks
- AmIUnique
这些工具可用于验证修改效果。
以上就是通过JS注入修改部分浏览器指纹信息的方法的详细内容,更多关于JS注入修改浏览器指纹信息的资料请关注脚本之家其它相关文章!
