小白爬虫冒险之反“反爬”:无限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 或拦截日志输出
内存耗尽攻击高频输出海量日志禁用控制台日志或过滤高频输出

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …

大数据治理实战:架构、方法与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段&#xff0c;尤其在数据驱动决策和人工智能应用日益普及的背景下&…

【时时三省】(C语言基础)文件的随机读写

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例&#xff1a; 这个输出的就是ade seek&#xff3f;cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK&#xff3f;CUR…

yolov5错误更改与相关参数详解(train.py)

1.错误更改 main中相关参数 if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, default, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s.yaml, helpmodel.yaml path)parser.add_arg…

第4章 基于中点电流的NPC逆变器中点电压平衡策略

1. 工作原理 1.1 NPC型三电平逆变器工作原理 NPC型三相三电平逆变器有A、B、C三个桥臂&#xff0c;其组成结构是相同的&#xff0c;本章以A相为例&#xff0c;对其工作原理进行分析。开关器件SA1和SA3、SA2和SA4为互补器件&#xff0c;通过控制开关器件的导通和关断状态&#…

【C++】内联函数inline、关键字auto与新式for

内联函数 内联函数背景 我们在使用C语言中我们都学过函数&#xff0c;我们知道函数在调用的过程中需要开辟栈帧。如果我们需要频繁的调用一个函数&#xff0c;假设我们调用10次Add()函数&#xff0c;那我们就需要建立10次栈帧。我们都知道在栈帧中要做很多事情&#xff0c;例如…

【深度学习】图像分类数据集

图像分类数据集 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transfo…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…

Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…

编程题-最长的回文子串(中等)

题目&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s &…

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…

HTML-新浪新闻-实现标题-样式1

用css进行样式控制 css引入方式&#xff1a; --行内样式&#xff1a;写在标签的style属性中&#xff08;不推荐&#xff09; --内嵌样式&#xff1a;写在style标签中&#xff08;可以写在页面任何位置&#xff0c;但通常约定写在head标签中&#xff09; --外联样式&#xf…

2024年终总结

回顾 今年过年没回老家&#xff0c;趁着有时间&#xff0c;总结一下24年吧。 我把23年看做是打基础的一年&#xff0c;而24年主要是忙于项目的一年&#xff0c;基本上大部分时间都是忙着交付软件&#xff0c;写的一些文章也大部分都是项目中遇到的问题和解决方案&#xff0c;虽…

[c语言日寄]越界访问:意外的死循环

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统

作者&#xff1a;来自 Elastic James Gallagher 了解如何使用 Roboflow Inference 和 Elasticsearch 构建强大的语义图像搜索引擎。 在本指南中&#xff0c;我们将介绍如何使用 Elasticsearch 中的 KNN 聚类和使用计算机视觉推理服务器 Roboflow Inference 计算的 CLIP 嵌入构建…

maven的打包插件如何使用

默认的情况下&#xff0c;当直接执行maven项目的编译命令时&#xff0c;对于结果来说是不打第三方包的&#xff0c;只有一个单独的代码jar&#xff0c;想要打一个包含其他资源的完整包就需要用到maven编译插件&#xff0c;使用时分以下几种情况 第一种&#xff1a;当只是想单纯…

Golang Gin系列-7:认证和授权

在本章中&#xff0c;我们将探讨Gin框架中身份验证和授权的基本方面。这包括实现基本的和基于令牌的身份验证&#xff0c;使用基于角色的访问控制&#xff0c;应用中间件进行授权&#xff0c;以及使用HTTPS和漏洞防护保护应用程序。 实现身份认证 Basic 认证 Basic 认证是内置…

CTF-web: phar反序列化+数据库伪造 [DASCTF2024最后一战 strange_php]

step 1 如何触发反序列化? 漏洞入口在 welcome.php case delete: // 获取删除留言的路径&#xff0c;优先使用 POST 请求中的路径&#xff0c;否则使用会话中的路径 $message $_POST[message_path] ? $_POST[message_path] : $_SESSION[message_path]; $msg $userMes…

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢&#xff1f;顾名思义&#xff0c;就是我们用户自己定义和设置的类型。 在C语言中&#xff0c;我们的自定义数据类型一共有三种&#xff0c;它们分别是&#xff1a;结构体(struct)&#xff0c;枚举(enum)&#xff0c;联合(union)。接下来&#xff0c;我…