当前位置: 首页 > 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.jsqmd.com/news/988384/

相关文章:

  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • OSPF建立邻居的影响因素
  • Presto时间函数保姆级避坑指南:从日期计算到时区转换,一篇搞定
  • 2026常州汽车音响改装哪家靠谱?同城实测测评首选音乐人生 - 音乐人生汽车音响
  • LangGraph多智能体系统工程实践:状态驱动的网页数据采集架构
  • PowerShell操作FTP踩坑全记录:从PSFTP模块的Bug到手动调用.Net类的终极方案
  • FPGA资源紧张?试试这个‘慢工出细活’的移位相加乘法器设计与优化技巧
  • 别再只用折线图了!Grafana 8.0+ 的 Time Series 面板,教你玩出监控新花样
  • 2026年电滑环公司选型指南:驰宏科技如何定义高性能滑环新标准? - 品牌报告
  • Jvm内存以及垃圾回收相关知识
  • 平时妈妈带娃偶尔老人帮忙,哪个成长椅两个人都能轻松调节?|居森皇冠椅多人带娃操作全指南 - 知行集录
  • 别再死记硬背排序算法了!用‘信息学奥赛1245题’带你理解STL的sort、unique和set到底怎么选
  • 告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)
  • 从‘切绳子’到‘二分答案’:信息学奥赛经典题P1577的保姆级整数二分教程
  • 在VSCode里像玩Arduino一样玩STM32:基于STM32CubeMX和Cortex-Debug插件的图形化调试实战
  • 手机芯片里的‘交通警察’:一文搞懂SPMI总线如何管理电源与时钟(附时序图解析)
  • 别再只盯着5G了!从星链到北斗,一文搞懂卫星通信到底是怎么‘上网’的
  • 推荐系统公平性:Cofair框架的动态控制技术
  • 2026年6月最新版松原第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • 2026青岛办公室设计装修优选|口碑工装团队,工地实拍工艺可视化,厂房研发车间大功率水电规范施工,本地千套实景案例 - 资讯快报
  • 遗传算法实战进阶:适应度压缩、多样性监控与维度自适应变异
  • 2026年北京离婚律所口碑榜!维权第三者返还财产/婚内过错取证/损害赔偿 - 资讯快报
  • 别再只用SE模块了!手把手教你用PyTorch实现CBAM注意力,轻松涨点
  • CODESYS多轴运动控制避坑指南:搞懂MC_Power与Cam表配置,别再让从轴乱跑了
  • 蓝桥杯单片机DS1302时钟模块避坑指南:从时序图到BCD码,新手最易犯的5个错误
  • OpenMV玩串口通信后‘变砖’?记一次因固化脚本导致的IDE连接失败与修复实录