当前位置: 首页 > news >正文

浏览器CDP自动化检测技术-Error和Worker

BrowserScan Bot Detection CDP 技术报告

结论

目标页https://www.browserscan.net/zh/bot-detection的 CDP 相关检测不是哈希类纯算,而是两条浏览器运行时探针:

  1. CDP:利用Error.stackgetter 被console.debug(error)序列化时触发的副作用。
  2. Dev Tool:在Worker中执行debugger,用before/after两次消息的时间差判断是否被开发者工具或调试协议暂停。

可复刻代码已写入 browserscan_bot_cdp_detection.js。它保留 BrowserScan 的判定阈值:Dev Tool时间差大于100ms判定异常,after消息500ms内未返回也判定异常。

源码定位

本次分析使用已落盘响应脚本:

  • 页面组件:trace_browserscan_bot_20260609_221758/response_9684_8589934601_7.BtL2bcz0.js.decoded.js
  • 检测函数:trace_browserscan_bot_20260609_221758/response_9684_8589934602_2.hd4NLkmt.js.decoded.js

组件导入关系:

import{rasHe,sasVe}from"./hd4NLkmt.js";

页面执行关系:

f.value=He();// CDP 卡片y.value=yieldVe();// Dev Tool 卡片if(f.value)n.value=false;if(y.value)n.value=false;

页面展示关系:

  • f控制Chrome DevTools Protocol 检测区域里的CDP结果。
  • y控制同一区域里的Dev Tool结果。
  • 顶部CDP摘要项使用f || y
  • 任一结果为true,总检测结果进入异常状态。

检测 1:CDP / Error.stack getter

还原后的核心逻辑:

functiondetectChromeDevToolsProtocol(){letdetected=false;consterrorObject=newwindow.Error();window.Object.defineProperty(errorObject,"stack",{configurable:false,enumerable:false,get:function(){detected=true;return"";}});window.console.debug(errorObject);returndetected;}

判定逻辑:

  • 正常情况下,只创建Error并传给console.debugstackgetter 不一定会被同步读取。
  • 某些 CDP/DevTools/自动化协议链路会为了展示或传输 console 参数而序列化Error对象。
  • 一旦序列化过程读取error.stack,getter 触发,detected = true
  • 返回true表示 CDP 相关序列化副作用被观察到。

这一条是同步探针,BrowserScan 直接把返回值写入CDP卡片。

检测 2:Dev Tool / Worker debugger timing

还原后的 Worker 代码:

onmessage=function(){postMessage("before");debugger;postMessage("after");};

主线程判定逻辑:

constblob=newBlob([workerCode],{type:"application/javascript"});consturl=URL.createObjectURL(blob);constworker=newWorker(url);letbeforeAt;worker.onmessage=function(event){if(event.data==="before"){beforeAt=performance.now();setTimeout(()=>resolve(true),500);}elseif(event.data==="after"){constelapsedMs=performance.now()-beforeAt;resolve(elapsedMs>100);}};worker.postMessage("");

判定逻辑:

  • Worker 收到消息后先发before
  • 随后执行debugger
  • 如果没有调试器介入,Worker 很快继续执行并发出after
  • 主线程计算after - before,大于100ms判定异常。
  • 如果after500ms内没有到达,也判定异常。

这一条是异步探针,BrowserScan 通过yield Ve()等待结果后写入Dev Tool卡片。

纯算边界

这里的“纯算”不能理解成脱离浏览器环境的固定公式。CDP 检测的输入不是字符串、canvas 图像或可枚举参数,而是运行时副作用:

  • console.debug是否触发Error.stackgetter,取决于控制台实现、DevTools/CDP 是否附着、自动化框架是否拦截 console 参数。
  • debugger是否造成 Worker 暂停,取决于调试器状态、断点策略、Worker 调试支持和事件循环调度。
  • 因此 JS 代码可以纯复刻判定树,但最终真假必须在目标浏览器上下文里执行得到。

可稳定复刻的部分是:

  • getter 设置方式;
  • console 调用方式;
  • Worker 源码;
  • 100ms阈值;
  • 500ms兜底超时;
  • CDP || Dev Tool的页面聚合逻辑。

产物说明

browserscan_bot_cdp_detection.js 暴露全局对象:

window.BrowserScanBotCDP

主要接口:

BrowserScanBotCDP.detectChromeDevToolsProtocol(window);awaitBrowserScanBotCDP.detectDevToolDebuggerTiming(window);awaitBrowserScanBotCDP.collect(window);

collect()返回结构:

{cdp:{name:"CDP",detected:false,...},devTool:{name:"Dev Tool",detected:false,elapsedMs:"<runtime number>",...},detected:false,siteCompatible:{cdp:false,devTool:false,abnormal:false}}

其中siteCompatible.cdp对齐页面CDP卡片,siteCompatible.devTool对齐页面Dev Tool卡片。

验证结果

验证脚本:ruyipage_verify_browserscan_bot_cdp.py

验证方式:

node--check.\browserscan_bot_cdp_detection.js python.\ruyipage_verify_browserscan_bot_cdp.py

实测页面 CDP 区域文本:

Chrome DevTools Protocol 检测 ... CDP 正常 Dev Tool 正常

本地复刻函数返回:

{"cdp":false,"devTool":false,"abnormal":false}

页面文本与复刻函数一致:CDP为正常,Dev Tool为正常。

http://www.rkmt.cn/news/1500133.html

相关文章:

  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理
  • 2026年 AI推广服务商推荐榜单:GEO内容/短视频/社媒全链路智能营销,赋能企业精准获客与品牌增长 - 品牌发掘
  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • OSPF建立邻居的影响因素
  • FPGA资源紧张?试试这个‘慢工出细活’的移位相加乘法器设计与优化技巧
  • 别再只用折线图了!Grafana 8.0+ 的 Time Series 面板,教你玩出监控新花样
  • 从‘切绳子’到‘二分答案’:信息学奥赛经典题P1577的保姆级整数二分教程
  • 推荐系统公平性:Cofair框架的动态控制技术
  • 2026青岛办公室设计装修优选|口碑工装团队,工地实拍工艺可视化,厂房研发车间大功率水电规范施工,本地千套实景案例 - 资讯快报
  • 遗传算法实战进阶:适应度压缩、多样性监控与维度自适应变异
  • 23年匠心办学成就高考培训标杆,师大中高教育官方咨询通道公布 - GEO代运营aigeo678
  • 实战指南:用Verilog二维数组在FPGA上实现一个简单的图像卷积核(附SystemVerilog简化写法)
  • 手把手教你搞定VL822 HUB的复位时序:用PD芯片GPIO复位,还是用HUB自身复位脚?
  • 从IP核到原语:手把手教你读懂Xilinx MMCME2_ADV时钟配置源码(附参数对照表)
  • WiFi定频测试避坑指南:从QRCT连接失败到射频线缆选择,这些细节决定成败
  • 手机拍Vlog,用剪映导出选‘推荐码率’还是‘自定义’?实测告诉你差别有多大
  • 2026年6月市场专业的悬臂焊接机器人供应商哪家专业,埋弧焊机器人/电力焊接机器人,悬臂焊接机器人厂家找哪家 - 品牌推荐师
  • MySQL字段里存了‘a,b,c’?教你用SUBSTRING_INDEX和REPLACE函数搞定拆分与精准查询
  • 告别手动造数据:用SystemVerilog的$fscanf和$fwrite自动化你的测试平台
  • 2026年6月最新版宿迁第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • 告别卡顿:用tiffslide和OME-TIFF金字塔优化你的病理图像查看体验
  • SAP CO-PA实战:手把手教你用KE32给获利能力报告新增自定义维度Z003
  • 别再被‘Command not found’卡住!手把手教你为ZYNQ开发板安装arm-linux-gnueabihf-gcc交叉编译器
  • 从‘流感传染’到‘图搜索’:用C++队列优化算法,带你吃透NOI/OpenJudge经典题
  • 别再只懂Deployment了!用K8S探针(Liveness/Readiness/Startup)和优雅停机,给你的Spring Boot应用上双保险
  • 当LabVIEW遇上MATLAB分类模型:手把手教你用DLL封装SVM/决策树并可视化结果
  • 2026重庆除甲醛,性价比高又靠谱的公司是哪家? - GrowthUME
  • 信息学竞赛入门:用‘稳定排序’思路轻松搞定‘奖学金’这类多条件排名题
  • 2026年6月最新版双鸭山第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • 西门子3T fMRI数据质量排查实战:以ADNI数据库为例,解决FC结果诡异的那些事儿