Skip to content
围炉聊科技微信公众号二维码关注公众号,获取新文章推送
添加我为微信朋友扫描二维码,添加我为朋友

Agent 的隐身术:CloakBrowser 反检测拆解

如果你让 AI Agent 去网上办事,或者写过任何需要稳定访问网页的脚本,多半遇到过这样的情况:代码跑得好好的,突然弹一个人机验证;数据抓到一半,IP 被封了。站在网站的角度,它只是在回答一个问题:访问我的是人,还是程序? 这个问题的答案,散落在浏览器暴露给网页的无数细节里。navigator.webdriver 是不是 true,Canvas 画出来的图形有没有噪声,TLS 握手和正常 Chrome 是否一致,鼠标移动轨迹是不是太直。任何一环露馅,轻则验证码,重则封 IP。

过去几年,绕过检测的主流思路是在 JS 层打补丁:页面加载前注入一段脚本,把 webdriver 改成 false,给 Canvas 指纹加噪声。但反检测厂商也在升级。

CloakBrowser 是另一种思路:直接改 Chromium 的 C++ 源码,把伪装编译进二进制。它自称"通过所有机器人检测测试",GitHub 上拿到约 30.5K Star(2026 年 8 月官网快照),是这个细分赛道里开源项目的第一名。

一、73 个补丁,补在源码里

CloakBrowser 本质上是一个定制版 Chromium。它的仓库描述写得很直白:不是打补丁的配置,不是 JS 注入,是一个在 C++ 源码层修改了指纹的真实 Chromium 二进制。检测系统把它当成普通浏览器打分,因为它本来就是。

目前 v0.5.8 版本包含 73 个源码级补丁,覆盖的指纹面包括:

指纹面做了什么
基础导航navigator.webdriver=false、plugins.length=5、window.chrome 对象完整、UA 无 HeadlessChrome 字样
Canvas / WebGL渲染噪声注入,指纹每次不同但内部一致;GPU 厂商/渲染器字符串对齐真实硬件;Windows 下真实硬件值直接透传
Audio / 字体AudioContext 指纹对齐真实设备;字体列表匹配平台
网络与计时DNS/连接/SSL 时序归零,Proxy-Connection 头剥离,高精度计时器去关联
WebRTC解析代理出口 IP 并伪造 ICE 候选,防止 IP 泄漏
TLS 指纹ja3n/ja4/Akamai 指纹与真实 Chrome 逐字节一致
CDP 行为隐藏 DevTools Protocol 输入痕迹,键盘鼠标操作人类化

为什么源码级补丁更难被识破? 关键在两点。第一,网页里跑 Function.prototype.toString 检查,这些函数返回的是货真价实的 [native code],因为它们在编译时就是原生代码,没有注入痕迹可查。第二,每次启动时,CloakBrowser 会从随机种子生成一整套内部一致的"设备身份":GPU 型号、屏幕尺寸、Canvas 噪声、字体列表全部联动,像一台真实设备,而不是随机拼凑。

还有一个细节值得单独说。Akamai 的 sensor.js 会尝试加载 60 个已知扩展的 manifest 文件。真实用户总有几个扩展,headless 浏览器一个都没有,60 个请求全部失败,这在统计上不可能。CloakBrowser 自带装好真实扩展的 profile 来应对这个探测。这里要说明一下,这不算 Cloak 的独家优势:Chromium 和 Firefox 的扩展协议体系不同,Firefox 系的 Camoufox 也用自己的路径做同类对抗(moz-extension:// 体系加伪造扩展探测结果),只是实现方式不一样。

二、实测数据:reCAPTCHA v3 可达 0.9 分,公开检测站 30/30

官方 README 公布了一组对比测试,数据源是 2026 年 8 月、Chromium 151 基线的最新构建,成绩看上去相当优秀。这些成绩全部来自公开免费的机器人检测面板(bot.sannysoft.com、BrowserScan 这类),只能说明基础指纹过关,不等于能绕过 Kasada、PerimeterX 这类企业级 WAF。

三、上手

CloakBrowser 最讨喜的地方是迁移成本。它兼容 Playwright 和 Puppeteer 的 API,从 Playwright 迁过来只改一行:

python
# 旧写法
from playwright.sync_api import sync_playwright
pw = sync_playwright().start()
browser = pw.chromium.launch()

# 新写法
from cloakbrowser import launch
browser = launch()

首次运行会自动下载定制 Chromium 二进制(约 200MB,本地缓存),下载过程用 Ed25519 固定签名校验,防止镜像投毒。但是可能因为众所周知的网络问题而下载失败。所以如果下载失败的话建议尝试代理。 几个常用参数:

  • proxy:支持 HTTP 和 SOCKS5,内联凭据
  • geoip=True:从代理出口 IP 自动推断时区、语言,同时自动伪装 WebRTC IP
  • headless=False:有窗口模式
  • humanize=True:鼠标 Bézier 曲线、逐字符键盘输入(带思考停顿)、物理化滚动
  • launch_persistent_context():持久 profile,cookies 跨会话保留,能加载扩展,能播 Widevine DRM 视频

humanize 是我觉得最实用的功能。它不解决验证码,而是让验证码不出现。配合 geoip 和住宅代理,行为层和指纹层同时覆盖,这是多数开源方案做不到的。浏览器启动后可以看到其图标与Chrome相似,只是偏蓝色,功能使用方面几乎一样。

生态方面,browser-use、Crawl4AI、Scrapling、Stagehand、LangChain 这些 AI Agent 框架都有 drop-in 集成,多个项目已经在官方文档里加了 CloakBrowser 示例。还有 cloakbrowser-mcp 可以把浏览器暴露成 MCP 端点,Docker 镜像一行命令就能跑。

上手实测了抖音网站,目前体验下来效果不错:

测试使用的是免费key,限定1个session。在经过多次测试时有的时候会遇到以下两个问题: CloakBrowser Pro: couldn't verify your license (license server unreachable or a connection problem). 以及 CloakBrowser Pro: session limit reached for your plan. Close another running session or upgrade your plan. 可见CloakBrowser对于license的检测非常严格,甚至会影响系统运行的稳定性。

四、其他语言支持

官方没有直接的 Java wrapper,但我们可以通过CDP 远程连接来实现。方案是使用CloakBrowser 的 JS/Python wrapper 来启动一个带 CDP 端口的浏览器,Java 通过 Chrome DevTools Protocol 连接。 启动 CloakBrowser的示例脚本

import { launchPersistentContext } from "cloakbrowser";
import net from "node:net";
import path from "node:path";

const cdpHost = "127.0.0.1";
const cdpPort = Number(process.env.CLOAKBROWSER_CDP_PORT ?? "9222");
const userDataDir = path.resolve(
  process.env.CLOAKBROWSER_USER_DATA_DIR ?? "./cloakbrowser-profile",
);

let context;
try {
  await assertPortAvailable(cdpHost, cdpPort);

  context = await launchPersistentContext({
    userDataDir,
    headless: false,
    humanize: true,
    args: [
      "--remote-debugging-address=127.0.0.1",
      `--remote-debugging-port=${cdpPort}`,
    ],
  });
  const page = await context.newPage();
  await page.goto("about:blank");

  const cdpVersionUrl = `http://${cdpHost}:${cdpPort}/json/version`;
  for (let attempt = 0; attempt < 100; attempt++) {
    try {
      const response = await fetch(cdpVersionUrl);
      if (response.ok) break;
    } catch {
      // Chromium may need a short moment to bind the CDP port.
    }
    if (attempt === 99) {
      throw new Error(`CloakBrowser started but CDP is unavailable: ${cdpVersionUrl}`);
    }
    await new Promise((resolve) => setTimeout(resolve, 100));
  }

  console.log(`CloakBrowser CDP listening on http://${cdpHost}:${cdpPort}`);
  console.log("Press Ctrl+C to stop it.");

  const keepAlive = setInterval(() => {}, 60_000);
  let cdpMonitor;
  let stopping = false;
  let resolveExit;
  const waitForExit = new Promise((resolve) => {
    resolveExit = resolve;
  });
  const stop = () => {
    if (stopping) return;
    stopping = true;
    clearInterval(keepAlive);
    clearInterval(cdpMonitor);
    resolveExit();
  };

  cdpMonitor = setInterval(async () => {
    try {
      const response = await fetch(cdpVersionUrl);
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
    } catch {
      console.error("CloakBrowser Chromium disconnected.");
      stop();
    }
  }, 2_000);
  process.once("SIGINT", stop);
  process.once("SIGTERM", stop);

  await waitForExit;
} finally {
  if (context) {
    try {
      await context.close();
    } catch (error) {
      console.error(`CloakBrowser cleanup failed: ${error.message}`);
    }
  }
}

function assertPortAvailable(host, port) {
  return new Promise((resolve, reject) => {
    const server = net.createServer();
    server.once("error", (error) => {
      if (error.code === "EADDRINUSE") {
        reject(new Error(`CDP 端口 ${host}:${port} 已被占用,请关闭占用进程或设置 CLOAKBROWSER_CDP_PORT`));
        return;
      }
      reject(error);
    });
    server.listen(port, host, () => server.close(resolve));
  });
}

Java 侧可以用 Selenium 4 的 CDP 支持:

ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");

WebDriver driver = new ChromeDriver(options);
driver.get("https://www.douyin.com");

这种方式下,CloakBrowser 负责启动和 humanize,Java 负责业务逻辑,但架构上需要维护一个独立的启动进程。

五、不止浏览器:开源版 Multilogin

CloakBrowser 团队还做了一个叫 Manager 的桌面应用,定位是 Multilogin、GoLogin、AdsPower 的自托管替代,GUI 部分开源(MIT)。每个 profile 是一台"真正独立的电脑":独立指纹、GPU、屏幕、时区、代理、cookies、历史,互不串味。关掉一个 profile,下个月再打开,还是同一个人。

商业指纹浏览器大多按 profile 数量收费,超了要升级套餐;不过 AdsPower、GoLogin 的部分版本也支持"不限休眠 profile、只收并发运行"的计费,并非全部按总数收费。Manager 的 profile 数量不限,只按同时运行的数量计费。官方原话是"一抽屉休眠账号不花一分钱"。每个运行中的 profile 暴露 CDP 端点,可以一边用 Playwright 驱动,一边肉眼看着同一个窗口。

六、免费与付费

CloakBrowser 目前的模式是:GitHub 登录拿免费 key,用最新 Chromium 151 构建,限 1 个并发会话;v146 老构建永久免费(限非商业用途),在 GitHub Releases 直接下载,商业场景仍需 Pro 授权;Pro 版按并发扩到 5、20、200、2000+ 会话,优先拿到新补丁,有人工支持。

对比商业产品:Multilogin 每月 29-99 欧元,Kameleo 每月 59-149 美元,GoLogin 每月 10-49 美元,AdsPower 每月 5.4-9 美元。CloakBrowser 的内核免费、profile 无限,对技术团队来说成本优势是碾压级的。代价是:二进制闭源授权、住宅代理自备;免费 key 没有企业级支持(Pro 付费版有人工支持),也没有合规背书。

许可方面要特别说明:Python/JS 包装层是 MIT,但浏览器二进制是专有 License,禁止再分发,明确禁止撞库、批量注册、未授权访问、违反目标站点服务条款。所以它其实是"开源包装 + 闭源内核"的双许可模式。

七、说点不好听的

社区热度高,不等于没有坑。以下几点,决定上生产前值得想清楚:

  1. 二进制闭源。核心反检测逻辑在专有二进制里,无法审计。有个第三方项目做过有限检测(pim97/cloakbrowser-analyze:静态字符串扫描加少量运行时检查,2.9M 字符串未发现可疑内容),但这远不等于完整安全审计——内存中动态解密、动态加载逻辑,静态扫描是看不到的。信任一个年轻组织的闭源二进制,本身就是风险。比较谨慎的评测建议在 Docker 或虚拟机里隔离运行,生产环境 pin 版本而不是自动更新。
  2. 版本滞后是常态。官方宣称 Chromium 上游大版本更新后 24-48 小时发布新二进制,但社区实际反馈,复杂版本合并时滞后常达数天甚至一周。检测技术每周都在变,老构建的通过率会快速衰减。
  3. 公开面板不等于生产防护。30/30 是公开检测站的成绩,Kasada、PerimeterX 这类用 JS 运行时探针和 JIT 引擎行为检测的高级 WAF,依然可能抓到你。这是一场持续的军备竞赛。
  4. 驱动方式本身也是指纹。只要通过 CDP/Playwright 驱动,浏览器内核再干净,CDP 运行特征依然可能被部分高级防护识别——Cloak 只是把痕迹藏得更深,不是消除。
  5. 部署环境会拖后腿。geoip 依赖代理 IP 地理位置库,库不准时区-IP 会直接对不上,这是致命指纹泄露;Docker 无头容器里 GPU/WebGL 指纹会退化,Widevine DRM 在 Linux 容器也经常失效;单实例内存 200MB+ 只是基线,多开页面后很容易到 500-800MB,批量跑之前先算好资源。
  6. 法律边界。反检测技术是典型的双用途工具。写这篇文章不是教唆绕过任何网站的服务条款,合法的使用场景是:测试自己的网站防护、做合规的数据采集、验证自家产品的反爬策略。撞库、批量注册这类行为,许可证禁止,法律也禁止。

结语

CloakBrowser 的走红说明一件事:在 JS 层打补丁这条路,已经走到头了。反检测厂商学会了对注入函数做源码检查之后,"伪装"这件事必须下沉到浏览器引擎本身。这也解释了为什么它能在几个月内冲到 30K Star——它把商业指纹浏览器(每月几十上百美元)的核心能力开源了出来,让普通开发者也能用上引擎级的反检测。

不过它没有解决军备竞赛,只是把战线往前推了一步。检测方会继续研究新的探针,补丁方会继续编译新的二进制。对普通开发者来说,更值得记住的是那句官方说明:它不解决验证码,只是让验证码不出现。这句话放在整个反检测领域也成立——没有一劳永逸的隐身,只有不断更新的伪装。

最后回到智能体本身。Agent 要替人上网办事,人机验证只是第一道坎,更常见的问题是网站把自动化流量当成攻击流量直接封掉,任务做到一半就断。CloakBrowser 这类工具解决的是"让 Agent 看起来像人"的工程问题,但它没有解决"Agent 凭什么值得被信任"的问题。浏览器指纹、IP 声誉、行为轨迹,都是外部信任的拼图;信任的真正来源,是 Agent 遵守目标站点的规则、控制请求频率、尊重数据边界。技术可以让 Agent 隐身,但让 Agent 长期稳定地办事,靠的还是合规地使用这份隐身能力。这也是智能体基建系列一直在强调的事:能力越强,越要清楚边界在哪。

如果你对示例测试代码感兴趣,请留言索取。如果你觉得文章对你有用,可以关注我获取更多前沿资讯。