1. 概述
指纹浏览器(Fingerprint Browser)通过修改浏览器参数来伪装用户的指纹信息,例如 User-Agent、WebRTC、Canvas 指纹等。为了实现这一目标,我们需要使用不同的参数传递方式来控制浏览器行为。
本教程将介绍五种主要的参数传递方式,包括命令行参数、配置文件修改、WebSocket/IPC 传递参数、HTTP 接口以及系统环境变量。
2. 命令行参数
Chromium 允许在启动时通过命令行参数传递配置,以影响浏览器的某些特性。例如:
chromium --fingerprintstr="{\"productSub\":\"20030107\",\"vendor\":\"Google Inc.\",\"cpu\":20,\"deviceMemory\":32}" \
常见命令行参数
参数 | 作用 |
---|---|
userAgent | 伪造 User-Agent |
proxy-server | 设置代理 |
disable-webgl | 关闭 WebGL(防止 Canvas 指纹识别) |
lang | 关闭 WebRTC(防止 IP 泄露) |
webrtc | webrtc |
audio | audio |
3. 配置文件修改(Preferences / Local State)
Chromium 读取本地文件
enable=1
navigator.deviceMemory=6
navigator.vendor=Google Inc.123
concurrency=88
4. WebSocket / IPC 传递参数
如果你的指纹浏览器基于 Electron,可以使用 WebSocket 或 IPC 传递参数。
const { ipcMain } = require('electron');
ipcMain.on('set-user-agent', (event, userAgent) => {
win.webContents.setUserAgent(userAgent);
});
5. HTTP 接口传递参数
指纹浏览器可以通过 HTTP 接口接受参数,并动态修改浏览器行为。例如,可以搭建一个本地服务器来接收请求:
from flask import Flask, request
app = Flask(__name__)
@app.route('/set_user_agent', methods=['POST'])
def set_user_agent():
user_agent = request.json.get('user_agent')
# 这里可以存储到本地配置文件,或者通过 WebSocket 传递给浏览器进程
return {"status": "success", "user_agent": user_agent}
if __name__ == '__main__':
app.run(port=5000)
然后,浏览器可以定期查询这个 API,获取最新的指纹参数。
6. 系统环境变量传递参数
可以使用系统环境变量来传递指纹浏览器的参数,在运行前设置环境变量,例如:
Windows 设置环境变量
$env:CHROMIUM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
start chrome.exe
Linux / Mac 设置环境变量
export CHROMIUM_USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
chromium
浏览器启动后,可以在代码中读取这些环境变量,例如在 Node.js 中:
const userAgent = process.env.CHROMIUM_USER_AGENT || "Default-UA";
console.log("Current User-Agent:", userAgent);
7. 传值结论
方式 | 适用场景 | 适合修改的指纹 |
---|---|---|
命令行参数 | 启动时静态设置 | User-Agent、WebRTC、窗口大小 |
配置文件 | 适用于长期存储 | 语言、最近打开时间 |
WebSocket / IPC | 适用于 Electron 浏览器 | User-Agent、代理 |
HTTP 接口 | 适用于远程管理 | User-Agent、Canvas 指纹 |
系统环境变量 | 适用于动态配置 | User-Agent、代理 |
对于开发 Chromium 指纹浏览器,建议结合 命令行参数 + 配置文件 + WebSocket/IPC + HTTP 接口 + 环境变量,以实现更好的指纹伪造效果!
8. 统一获取参数方法
base::Easybrparam param;
std::string _vendor = param.GetValue("vendor");
if (!_vendor.empty()) {
}