小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)

背景浅谈

小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是decipher网站对request设置的cipher,比如破解一个DES/AES加密拿到key。这篇文章先不去谈这类已经进入JS分析阶段的问题,而是往前推到我们的第一步——调试,这也是我们后续分析的前提,学习逆向的大侠们如果自己去找不同的网站练习很容易发现其实很多网站恰恰喜欢在这第一步就设置反爬策略,也就是我这篇博客接下来要谈到的类似于无限debugger的小问题。(毕竟网站也不想被逆向“菜狗”一直请求,所以先把一部分“菜狗”拦下来不让你去分析)

大年初一,我先写一部分短时间能想到的,内容可能也会相对粗糙,后期会加以润色,遇到其他的会继续在此更新。

问题及应对策略

1.无限debugger

无限debugger产生原因

防止爬虫人员调试网站、抓包等行为,恶心你,层层下陷的debugger仿佛“沼泽陷阱”

无限debugger原理

使用debugger关键字与setInterval()或者setTimeout()配合使用造成无限创建虚拟机debugger

setInterval()

点不完的定时器

setTimeout()

配合setInterval()组成递归从而造成无限内陷无法自拔直至程序崩溃

无限debugger破解思路

  1. 断点设置一律不在此处断住

  2. 断点设置条件置为false

  3. 被第一个debugger断住后利用请求堆栈向上溯源利用无限debugger原理定位调用入口,破解调用入口

  4. 脚本注入

    // 重写 debugger 函数
    window.eval = (code) => { 
      if (!code.includes("debugger")) eval(code); 
    };
    

2.禁用开发者工具

当你打开一个网站点击F12准备“大干一场”的时候突然发现网站不允许调试,倘若你刚好是一名“菜鸡”,那你不就炸了吗?

网站禁用开发者工具的实现通常依赖于检测用户是否打开了开发者工具,并通过技术手段进行干扰。以下是其底层原理及应对策略的分析:


一、禁用开发者工具的底层原理

  1. 窗口尺寸检测

    • 原理:开发者工具打开后,浏览器窗口的尺寸或布局可能发生变化(如窗口分栏)。网站通过监听 window.resize 事件或对比 window.outerWidth/innerWidth 的差值来判断。
    • 局限性:响应式设计的网站可能误判,且用户可通过取消开发者工具独立窗口规避。
  2. 控制台属性检测

    • 原理:通过检查 console 对象或 debugger 关键字的状态。例如:

      setInterval(() => {
        if (console.firebug || /./.constructor.prototype.toString = () => {}) {
          alert("开发者工具已打开!");
          window.location.href = "about:blank"; // 强制跳转
        }
      }, 1000);
      
    • 局限性:现代浏览器已修复大部分漏洞,且用户可通过禁用控制台日志输出绕过。

  3. 键盘事件监听

    • 原理:监听 F12Ctrl+Shift+ICtrl+Shift+J 等快捷键的按下事件,阻止默认行为:

      document.addEventListener('keydown', (e) => {
        if (e.keyCode === 123 || (e.ctrlKey && e.shiftKey && e.keyCode === 73)) {
          e.preventDefault();
          window.location.href = "about:blank";
        }
      });
      
    • 局限性:无法阻止通过浏览器菜单手动打开开发者工具。


二、应对策略

有一种很简单的绕过方式就是提前将开发者工具的窗口设置为独立窗口

1. 底层原理分析

开发者工具独立窗口的作用
当开发者工具以独立窗口(非停靠模式)打开时,主浏览器窗口的布局和尺寸不会发生变化。这直接影响网站通过 窗口尺寸变化布局偏移 来检测开发者工具的机制。


2. 针对窗口尺寸检测的绕过

原检测逻辑
网站通过监听 resize 事件或比较 window.outerWidthwindow.innerWidth 的差值,判断开发者工具是否打开(停靠模式会改变主窗口尺寸)。

代码映射

// 原代码中的窗口监听
window.addEventListener("resize", e); // 监听窗口变化触发检测
var c = setInterval(e, 500);          // 定时检测

独立窗口的绕过效果

  • 主窗口尺寸不变,resize 事件不会被触发。
  • 定时执行的 e() 函数仍会运行,但若其逻辑依赖窗口尺寸,则无法检测到工具开启。

局限性
e() 函数包含其他检测逻辑(如控制台属性劫持),独立窗口无法绕过这些检测。


3. 有效性
检测类型独立窗口绕过效果需额外应对措施
窗口尺寸/布局变化有效无需额外操作
控制台属性劫持无效禁用 __defineGetter__ 或静默控制台
定时轮询检测部分有效清除定时器 (clearInterval)
Firebug 对象检测有效(Firebug 已淘汰)无需操作

3.干扰控制台


网站干扰控制台的底层实现原理及应对策略

网站干扰控制台的目的是阻止用户通过开发者工具(如控制台)调试、分析或修改页面逻辑。以下是常见的干扰手段及其应对方法:


一、底层实现原理

1. 禁用控制台方法(Console Methods)

原理
通过重写 console.logconsole.error 等方法,使其无法输出内容或抛出错误。

// 示例:禁用 console.log
console.log = function() {}; 
// 或抛出错误
console.log = function() { throw new Error("Console is disabled"); };

效果
用户在控制台执行 console.log 时无输出或直接报错。


2. 控制台打开检测与警告

原理
通过对比窗口尺寸、计算代码执行时间差,或劫持 console 对象,检测控制台是否打开。

// 示例:通过代码执行时间差检测
const start = Date.now();
console.log("检测控制台");
const delay = Date.now() - start;
if (delay > 50) { 
  alert("控制台已打开!");
  window.location.href = "about:blank"; 
}

效果
用户打开控制台时,页面跳转或弹出警告。


3. 控制台输出劫持

原理
劫持 console 方法,修改输出内容或频率。

// 示例:劫持 console.log 输出乱码
const originalLog = console.log;
console.log = function(...args) {
  originalLog.call(console, "干扰输出: " + Math.random().toString(36));
};

效果
用户看到的控制台输出被篡改,无法获取真实信息。


4. 内存耗尽攻击

原理
通过高频输出大量内容或死循环,导致控制台卡死或浏览器崩溃。

// 示例:每秒输出 10 万条日志
setInterval(() => {
  for (let i = 0; i < 1e5; i++) console.log("垃圾数据");
}, 1000);

效果
控制台因处理海量日志而失去响应。


二、应对策略

1. 恢复原生 Console 方法

方法
在控制台中重置 console 对象,或使用浏览器插件提前注入修复脚本。

// 在控制台执行以下代码恢复 console.log
delete console.log; // 仅对部分重写有效
// 或直接从 iframe 中获取原生 console
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console.log = iframe.contentWindow.console.log;

适用场景
针对 console 方法被重写或禁用的情况。


2. 屏蔽控制台检测逻辑

方法
使用浏览器插件(如 某猴)在页面加载前注入代码,覆盖检测逻辑。

// ==UserScript==
// @run-at       document-start
// 禁用控制台检测
Object.defineProperty(window, 'console', {
  value: window.console,
  writable: false,
  configurable: false
});
// 覆盖定时器函数
window.setInterval = function() {}; // 禁用所有定时器

适用场景
针对基于定时器或 console 劫持的检测。


3. 使用无头浏览器或代理拦截

方法
通过无头浏览器(如 Puppeteer)或本地代理(如 Charles)直接修改网页内容。

  • Puppeteer 示例

    const puppeteer = require('puppeteer');
    (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.setRequestInterception(true);
      // 拦截并删除干扰脚本
      page.on('request', (req) => {
        if (req.url().includes('anti-console.js')) req.abort();
        else req.continue();
      });
      await page.goto('https://target-site.com');
    })();
    

    适用场景
    自动化绕过所有前端干扰逻辑。


4. 禁用 JavaScript 执行

方法
通过浏览器设置或插件(如 NoScript)直接禁用页面 JavaScript。

  • 操作路径
    Chrome → 设置 → 隐私与安全 → 网站设置 → JavaScript → 禁用。
    缺点
    可能导致页面功能完全失效。

三、总结:干扰手段与应对对照表

干扰手段底层原理应对策略
禁用 Console 方法重写 console.log 等原生方法恢复 console 或通过 iframe 获取原生方法
控制台打开检测窗口尺寸/代码执行时间差检测覆盖检测逻辑或使用无头浏览器
控制台输出劫持篡改 console 输出内容重置 console 或拦截日志输出
内存耗尽攻击高频输出海量日志禁用控制台日志或过滤高频输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

嵌入式知识点总结 Linux驱动 (五)-linux内核

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.内核镜像格式有几种&#xff1f;分别有什么区别&#xff1f; 2.内核中申请内存有哪几个函数&#xff1f;有什么区别&#xff1f; 3.什么是内核空间&#xff0c;用户空间&…

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…

将ollama迁移到其他盘(eg:F盘)

文章目录 1.迁移ollama的安装目录2.修改环境变量3.验证 背景&#xff1a;在windows操作系统中进行操作 相关阅读 &#xff1a;本地部署deepseek模型步骤 1.迁移ollama的安装目录 因为ollama默认安装在C盘&#xff0c;所以只能安装好之后再进行手动迁移位置。 # 1.迁移Ollama可…

《Trustzone/TEE/安全从入门到精通-标准版》

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代&#xff0c;语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践&#xff0c;详细探讨这一过程中的技术细节、操作步骤以及实践价值。 一、实验背景与目标 …

三、SysTick系统节拍定时器

3.1 SysTick简介 系统节拍定时器SysTick是ARM Cortex-M0内核提供的一个24位递减定时器&#xff0c;当计数值达到0时产生中断&#xff0c;可以为操作系统和其他管理软件提供固定时间的中断。 当系统节拍定时器被被使能时&#xff0c;定时器从重装值递减计数&#xff0c;到0进中断…

算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)

在算法竞赛与日常编程中&#xff0c;前缀和是一种极为实用的预处理技巧&#xff0c;能显著提升处理区间和问题的效率。今天&#xff0c;我们就来深入剖析一维前缀和与二维前缀和这两个经典模板。 一、【模板】一维前缀和 题目描述 给定一个长度为 n n n 的整数数组 a a a&…

学习数据结构(2)空间复杂度+顺序表

1.空间复杂度 &#xff08;1&#xff09;概念 空间复杂度也是一个数学表达式&#xff0c;表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间&#xff0c;因为常规情况每个对象大小差异不会很大&#xff0c;所以空间复杂…

MybatisX插件快速创建项目

一、安装插件 二、创建一个数据表测试 三、IDEA连接Mysql数据库 四、选择MybatiX构造器 五、配置参数 六、项目结构

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Java设计模式:结构型模式→组合模式

Java 组合模式详解 1. 定义 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示“部分-整体”的层次。组合模式使得客户端能够以统一的方式对待单个对象和对象集合的一致性&#xff0c;有助于处理树形结构…

FastReport.NET控件篇之富文本控件

简介 FastReport.NET 提供了 RichText 控件&#xff0c;用于在报表中显示富文本内容。富文本控件支持多种文本格式&#xff08;如字体、颜色、段落、表格、图片等&#xff09;&#xff0c;非常适合需要复杂排版和格式化的场景。 富文本控件(RichText)使用场景不多&#xff0c…

单片机基础模块学习——NE555芯片

一、NE555电路图 NE555也称555定时器,本文主要利用NE555产生方波发生电路。整个电路相当于频率可调的方波发生器。 通过调整电位器的阻值,方波的频率也随之改变。 RB3在开发板的位置如下图 测量方波信号的引脚为SIGHAL,由上面的电路图可知,NE555已经构成完整的方波发生电…

(done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1&#xff1a;Implement copy-on-write fork(hard) (完成) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过程…

三天急速通关JavaWeb基础知识:Day 1 后端基础知识

三天急速通关JavaWeb基础知识&#xff1a;Day 1 后端基础知识 0 文章说明1 Http1.1 介绍1.2 通信过程1.3 报文 Message1.3.1 请求报文 Request Message1.3.2 响应报文 Response Message 2 XML2.1 介绍2.2 利用Java解析XML 3 Tomcat3.1 介绍3.2 Tomcat的安装与配置3.3 Tomcat的项…

SQLServer 不允许保存更改(主键)

在我们进行数据库表格编辑的时候,往往会出现同一个名字,就比如我们的账号一样,我们在注册自己QQ的时候,我们通常注册过的账号,别人就不能注册了,这是为了保证严密性 所以我们需要点击表格>右键>设计 点击某一列>右键>设计主键 当我们Ctrls 保存的时候回弹出下…

【hot100】刷题记录(6)-轮转数组

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…