fingerprint-bypass
对 $ARGUMENTS 进行指纹分析与绕过方案设计。
核心理念: 反指纹系统检查 TLS、HTTP/2、TCP/IP、浏览器 API 四层指纹的跨层一致性。单层伪造容易,四层自洽难——这是大多数方案翻车的根因。
四层指纹体系
Layer 1: TCP/IP 层
操作系统在 TCP 握手时暴露的特征,无法通过应用层伪造:
| 特征 | Windows | Linux | macOS |
|---|---|---|---|
| TTL | 128 | 64 | 64 |
| TCP Timestamp | 无 | 有 | 有 |
| Window Size | 65535 | 29200 | 65535 |
| TCP Options 顺序 | MSS,NOP,WScale,NOP,NOP,SACK | MSS,SACK,Timestamp,NOP,WScale | MSS,NOP,WScale,NOP,NOP,Timestamp,SACK,EOL |
关键: TCP 层指纹由操作系统内核决定,应用层无法控制。UA 声称 Windows 但 TTL=64 → 立即矛盾。
Layer 2: TLS 层
TLS ClientHello 中的指纹:
| 指纹类型 | 组成 | 用途 |
|---|---|---|
| JA3 | cipher_suites + extensions + groups + ec_point_formats | 经典 TLS 指纹 |
| JA4 | 协议版本 + SNI + cipher 数量 + extension 数量 + ALPN | 新一代指纹 |
Chrome 特征:
- 含 GREASE 值(0x0a0a, 0x1a1a 等随机值)
- 扩展列表含 ECH (encrypted_client_hello)
- Chrome 116+ 扩展顺序随机化(JA3 不再稳定,JA4 更可靠)
Node.js 特征(暴露点):
- 无 GREASE 值
- cipher suite 列表与浏览器不同
- 缺少
application_settings等 Chrome 专有扩展
Layer 3: HTTP/2 层
HTTP/2 连接建立时的 SETTINGS 帧参数:
| 参数 | Chrome | Firefox | Safari | Node.js(默认) |
|---|---|---|---|---|
| HEADER_TABLE_SIZE | 65536 | 65536 | — | 4096 |
| INITIAL_WINDOW_SIZE | 6291456 | 131072 | — | 65535 |
| MAX_HEADER_LIST_SIZE | 262144 | — | — | — |
| WINDOW_UPDATE | 15663105 | 12517377 | 10420225 | 不发送 |
| 伪头顺序 | m,a,s,p | m,p,a,s | m,s,a,p | m,a,s,p |
关键: WINDOW_UPDATE 值是区分浏览器的最强信号,且几乎没有工具正确伪造。
Layer 4: 浏览器 API 层
JavaScript 可访问的 API 暴露的信息:
| 类别 | 检测项 | 自动化工具常见问题 |
|---|---|---|
| 自动化检测 | navigator.webdriver |
Selenium/Puppeteer 默认 true |
| 浏览器标识 | window.chrome |
headless Chrome 缺少此对象 |
| Canvas | toDataURL() hash |
headless 渲染结果不同 |
| WebGL | WEBGL_debug_renderer_info |
SwiftShader / Mesa 暴露 headless |
| Audio | AudioContext 输出 |
不同硬件 LSB 不同 |
| 权限 | Permissions.query() |
自动化工具返回 denied |
| CDP 检测 | 错误堆栈中的 CDP 痕迹 | Puppeteer 会泄露 CDP 调用栈 |
| 插件 | navigator.plugins |
headless 通常为空 |
分析流程
Step 1: 识别检测系统
常见反指纹服务:
Cloudflare → 检查 cf-ray header、Turnstile 验证
Akamai → 检查 _abck cookie、sensor_data 请求
DataDome → 检查 datadome cookie、interstitial 页面
PerimeterX → 检查 _px cookie
判断方法:
1. 查看 403/429 响应头中的特征
2. 搜索页面 JS 中的特征字符串
3. 分析 cookie 名称和 JS 请求模式
Step 2: 采集当前指纹
如果可以部署 fingerprint-collector,用它做全面自测:
# 部署 fingerprint-collector
git clone https://github.com/zhizhuodemao/fingerprint-collector.git
cd fingerprint-collector && pip install -r requirements.txt
sudo ENABLE_TCP=1 python app.py
# 用你的工具/脚本访问 https://localhost:8443
# 查看 /api/analysis 获取检测报告
无法部署时,可以用公开测试站点:
tls.browserleaks.com— TLS 指纹browserleaks.com/canvas— Canvas 指纹browserleaks.com/webgl— WebGL 指纹
Step 3: 一致性诊断
对照以下矛盾检测表,排查不一致:
| 检查项 | 一致性规则 | 常见矛盾 |
|---|---|---|
| UA ↔ TLS | UA 声称的浏览器与 JA3/JA4 匹配 | Node.js 的 TLS 指纹但 UA 写 Chrome |
| UA ↔ HTTP/2 | SETTINGS 参数与 UA 浏览器一致 | HTTP/2 用默认值,UA 写 Chrome |
| UA ↔ TCP | TTL 与 UA 声称的操作系统一致 | Linux 服务器(TTL=64)但 UA 写 Windows |
| WebGL ↔ UA | GPU renderer 与声称的平台一致 | SwiftShader(headless 标志) |
| 时区 ↔ IP | JS 时区与 IP 地理位置一致 | UTC+8 但 IP 在美国 |
| 语言 ↔ IP | navigator.languages 与 IP 区域一致 | 中文语言但美国 IP |
Step 4: 制定绕过方案
根据诊断结果选择方案:
场景 A: Python 请求被拦截
方案 1(推荐): curl_cffi — 模拟真实浏览器 TLS + HTTP/2 指纹
pip install curl_cffi
from curl_cffi import requests
r = requests.get(url, impersonate="chrome")
方案 2: tls_client — Go 实现的 TLS 指纹库
pip install tls_client
session = tls_client.Session(client_identifier="chrome_120")
方案 3: 自定义 TLS — 使用 PyOpenSSL + h2 精确控制
需要手动设置 cipher suites、extensions、HTTP/2 SETTINGS
场景 B: 自动化浏览器被检测
方案 1: Patchright(推荐) — Playwright 反检测分支
js-reverse-mcp 已内置 Patchright 引擎
方案 2: undetected-chromedriver — Selenium 反检测
pip install undetected-chromedriver
方案 3: Playwright + stealth 插件
npm install playwright-extra puppeteer-extra-plugin-stealth
关键配置:
- 使用持久化 user-data-dir(保持登录态 + cookie)
- 不使用 headless 模式(或使用 new headless)
- 注入 stealth 脚本消除自动化痕迹
场景 C: Node.js 补环境被识别
参考 env-patch skill 的 references/fingerprint-consistency.md
重点:
- navigator.webdriver = false(正确的属性描述符)
- window.chrome 对象完整性
- Canvas/WebGL 返回有意义的值
- AudioContext 行为正确
伪造工具对比
| 工具 | TLS | HTTP/2 | TCP | 浏览器API | 适用场景 |
|---|---|---|---|---|---|
| curl_cffi | ✅ | ✅ | ❌ | ❌ | 纯 API 请求 |
| tls_client | ✅ | ✅ | ❌ | ❌ | 纯 API 请求 |
| Patchright | ✅ | ✅ | ❌ | ✅ | 需要执行 JS |
| undetected-chromedriver | ✅ | ✅ | ❌ | ✅ | Selenium 场景 |
| 真实浏览器 + 代理 | ✅ | ✅ | ✅ | ✅ | 最高拟真度 |
TCP 层: 除非运行在与 UA 声称一致的操作系统上,否则 TCP 层不可伪造。这是"终极检测"——如果目标做 TCP 层检测,必须使用对应 OS 的机器。
反模式
- 不要只改 User-Agent — UA 是最容易检查也最没价值的指纹,改 UA 不改 TLS/HTTP2 等于自曝。
- 不要混用不同浏览器的特征 — Chrome 的 TLS + Firefox 的 HTTP/2 = 世界上不存在的客户端。
- 不要在 Linux 上声称 Windows — TCP TTL 会暴露。
- 不要忽略 HTTP/2 WINDOW_UPDATE — 这是最被忽视但最具区分度的指纹。
- 不要用 requests 库直接请求 — Python requests 的 TLS 指纹是独特的,任何检测系统都能识别。
完成标准
指纹绕过结果:
- 目标站点:$ARGUMENTS
- 检测系统:[Cloudflare | Akamai | DataDome | 其他]
- 矛盾维度:[TLS | HTTP/2 | TCP | 浏览器API | 跨层不一致]
- 绕过方案:[curl_cffi | Patchright | 其他]
- 验证结果:请求返回 200 + 正常业务数据(非验证码/拦截页)
References
| 文件 | 何时读取 |
|---|---|
references/tls-fingerprint.md |
需要深入了解 JA3/JA4 指纹构造和伪造细节 |
references/http2-fingerprint.md |
需要精确匹配 HTTP/2 SETTINGS 和 WINDOW_UPDATE |
references/browser-fingerprint.md |
需要补全浏览器 API 层指纹(Canvas/WebGL/Audio 等) |