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

026.爬虫专用浏览器-绕过常见无头检测(二)

一、无头检测简介:

  • 无头检测(Headless Detection)就是检测用户是否在无头浏览器。只要检测到,那百分百是爬虫。
  • 无头检测我们多数使用这个站:https://bot.sannysoft.com/
  • 之前写过一篇文章:插眼传送,绕过了部分检测,但是不全,这里我们继续追加。

二、WebGL Render

  • 无头模式下,不会使用gpu,所以检测webGL render是否有关键字"SwiftShader",如果有那就是无头。

在这里插入图片描述

  • 打开文件 \third_party\blink\renderer\modules\webgl\webgl_rendering_context_base.cc
case WebGLDebugRendererInfo::kUnmaskedRendererWebgl:if (ExtensionEnabled(kWebGLDebugRendererInfoName)) {if (IdentifiabilityStudySettings::Get()->ShouldSampleType(blink::IdentifiableSurface::Type::kWebGLParameter)) {RecordIdentifiableGLParameterDigest(pname, IdentifiabilityBenignStringToken(String(ContextGL()->GetString(GL_RENDERER))));}//return WebGLAny(script_state,//                String(ContextGL()->GetString(GL_RENDERER)));// 追加 ==========================================base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();int seed;if (base_command_line->HasSwitch("fingerprints")) {std::istringstream(base_command_line->GetSwitchValueASCII("fingerprints")) >> seed;}else{auto now = std::chrono::system_clock::now();std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);seed = static_cast<int>(now_time_t);}String tmp = " (NV/" + String(std::to_string(seed)) + ")";String render = (String(ContextGL()->GetString(GL_RENDERER)) + tmp);std::string renderer = render.Utf8();// 将全部SwiftShader替换成NVDIAstd::string searchString = "SwiftShader";std::string replaceString = "NVDIA";size_t start_pos = 0;while ((start_pos = renderer.find(searchString, start_pos)) != std::string::npos) {renderer.replace(start_pos, searchString.length(), replaceString);start_pos += replaceString.length(); }return WebGLAny(script_state, String(renderer));// 结束追加 ==========================================}SynthesizeGLError(GL_INVALID_ENUM, "getParameter","invalid parameter name, WEBGL_debug_renderer_info not enabled");return ScriptValue::CreateNull(script_state->GetIsolate());

这里的逻辑是将SwiftShader关键字全部改成NVDIA了。

三、window.chrome

  • 正常有头的chromium内核浏览器打开F12都是有window.chrome的,但无头浏览器会返回undefined

在这里插入图片描述

  • 打开文件 \content\renderer\render_frame_impl.cc
void RenderFrameImpl::DidClearWindowObject() {TRACE_EVENT_WITH_FLOW0("navigation", "RenderFrameImpl::DidClearWindowObject",TRACE_ID_LOCAL(this),TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI)WebUIExtension::Install(frame_);
  • 替换为:
void RenderFrameImpl::DidClearWindowObject() {TRACE_EVENT_WITH_FLOW0("navigation", "RenderFrameImpl::DidClearWindowObject",TRACE_ID_LOCAL(this),TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);//if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI)//  WebUIExtension::Install(frame_);WebUIExtension::Install(frame_);

这里就是把if条件注释掉。

四、plugins插件

有头浏览器都会装5个默认插件,但无头会变成0个。
这个上篇无头博客改了,但是改的有点乱,会被cloudflare检测到,所以上篇这里作废,我们重改。

  • 打开:\third_party\blink\renderer\modules\plugins\dom_plugin_array.cc
bool DOMPluginArray::IsPdfViewerAvailable() {auto* data = GetPluginData();if (!data)return false;for (const Member<MimeClassInfo>& mime_info : data->Mimes()) {if (mime_info->Type() == "application/pdf")return true;}return false;
}
  • 替换为:
bool DOMPluginArray::IsPdfViewerAvailable() {//auto* data = GetPluginData();//if (!data)//  return false;//for (const Member<MimeClassInfo>& mime_info : data->Mimes()) {//  if (mime_info->Type() == "application/pdf")//    return true;//}//return false;return true;
}

让这个函数一直返回true即可。

五、无头userAgent

  • 上篇博客给userAgent去掉了HeadlessChrome特征,但是发现他一直不变,因为无头的UA和有头的UA是两套逻辑。这里我们给无头UA加些随机数。

  • 打开:\headless\lib\browser\headless_browser_impl.cc

std::string HeadlessBrowser::GetProductNameAndVersion() {return std::string(kHeadlessProductName) + "/" + PRODUCT_VERSION;
}
  • 替换为:
std::string HeadlessBrowser::GetProductNameAndVersion() {//return std::string(kHeadlessProductName) + "/" + PRODUCT_VERSION;base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();int tmp = 0;if (base_command_line->HasSwitch("fingerprints")) {std::istringstream(base_command_line->GetSwitchValueASCII("fingerprints")) >> tmp;}int fooversion = 124;return "Chrome/" + std::to_string(fooversion) + ".0.0.0 BigTom/" + std::to_string(tmp);
}

六、结语:

  • 无头模式主要是为了后续做linux版本做准备,但博主太穷,没钱升级电脑。
  • 所以短时间linux版的是搞不了了。

http://www.mrgr.cn/news/29484.html

相关文章:

  • Hadoop学习--第一章 Hello大数据分布式
  • 解决Oracle DECODE函数字符串截断问题的深度剖析20241113
  • synchronized锁失灵?
  • 【计算机网络】TCP网络程序
  • 编程初学者的第一个 Rust 系统
  • SwiftUI开发教程系列 - 第十二章:本地化与多语言支持
  • 如何查看电脑端的微信聊天记录?今天告诉你!五步掌握微信聊天记录查看与管理技巧!【企业必看】
  • 关于wordPress中的用户登录注册等问题
  • TMS320F28335的GPIO
  • 八、TOGAF(架构治理Architecture Governance)
  • GBase8c主备版500升级步骤
  • 电磁场与电磁波 1.1矢量基础知识
  • 笔记:简介Drawing是什么,都有哪些,如何使用
  • 开放式激光振镜运动控制器在Ubuntu+Qt下CAD图形标刻
  • 极光参展2024年服贸会并荣获“年度出海领航企业”荣誉
  • AI解锁生命密码:AlphaFold绘制病毒“家谱”,揭秘进化奇缘
  • 按关键字搜索商品 API,实现商品数据透明化.
  • 为您的任意模型赋能——RAG
  • MySQL之复合查询与内外连接
  • 个人信息安全“硬核”守护:企业引领方向,个人贡献力量,共筑安全防火墙
  • 执着追求与匠心独运 朵拉朵尚2024欧洲溯源 深入德国巴斯夫
  • CodeMeter 8.20AxProtector 11.50版本更新
  • 【论文阅读】3D Diffuser Actor: Policy Diffusion with 3D Scene Representations
  • 如何学懂C++语言:C++从入门到精通的全面指南(完整C++学习笔记)
  • 足底筋膜炎贴什么膏药
  • RFID技术实现消防物资消防车无感化智能管理设计方案