【爬虫】网站反debugger、内存爆破以及网站限制开发者工具

news2024/12/23 22:28:22

【爬虫】网站反debugger、内存爆破以及网站直接限制开发者工具

声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

常见情形

目前网站反爬手段有很多,比如:网站反debugger、内存爆破、限制开发者工具等

情况一:debugger(右键不在此停止)

  • 问题: 有部分网站做了反debugger处理,当我们打开开发者工具的时候会直接断点停在某个位置。
    在这里插入图片描述
  • 解决办法:右键点击,选择永不在此停止。然后放过断点,即可继续调试。

前提:该debugger构造函数需要没有内容。如果网站开发者自定义的debugger构造函数后面有内容,是在写入数据的话(不断写入空列表、其他字符等),我们跳过断点会导致持续写入,导致内存溢出,页面卡死。

在这里插入图片描述

情况二:内存爆破

绝大多数网站反debugger会更加高深,会使用到内存爆破以及混淆技术。导致我们通过简单的右键不在此停止无法破解。

我们使用右键不在此停止,并且跳过断点后,会导致浏览器卡死。

情况三:右键被管理员禁用

部分网站会直接限制我们使用开发者工具,我们右键或者F12打开均无效,都被禁用。

我们想右键,打开开发者工具时,发现被禁用。

在这里插入图片描述

情况四:监测函数执行时间

在这里插入图片描述
我们通过快捷键强制打开开发者工具,发现页面提示非法调试。

我们进入debug断点分析,点击单步执行,查看页面js逻辑。
在这里插入图片描述

在这里插入图片描述
最终发现页面是通过判断当前window大小以及函数运行时间来确认是否存在非法调试。

解决办法

方法一:控制台-右键不再此停止

如果我们打开开发者工具后,发现自动进入断点。

  1. 首先尝试,鼠标右击永不在此停止
  2. 放过该断点,即可继续调试

方法二:本地注入JS,覆盖之前老的JS

如果方法一无效:放过断点后会导致浏览器页面卡死。即可使用本地注入JS方法,将debugger构造器置空,覆盖之前的JS。

  • 分析浏览器卡死原因:网站开发者自定义的debugger构造器不为空,在持续写入数据。
  • 本地注入JS不能刷新网站,否则会导致我们本地注入的JS失效。
分析原因:浏览器卡死原因

我们单步执行断点,发现进入了VM虚拟环境,并且该JS是进行了混淆的。

在这里插入图片描述

下面这种有特殊字符+数字+字母的,基本就是进行过JS混淆的:
在这里插入图片描述

对于这种混淆过的JS代码,我们需要对其进行还原:

还原方法:复制JS代码,然后在控制台执行即可

//我们需要进行分段还原,否则一次性全部执行,会报not a function
[s(0, -259, -213, 0, "I#ue") + f(1271, 974, 1135, "e!3a") + "r"](r[f(1221, 1495, 1373, "v&9u")](r[g(1467, 0, 0, "&UOm")], r[n(0, "ujyL", -6)]))[s(0, 13, 12, 0, "7Iko")](r[g(1540, 0, 0, "nX(R")]);

在这里插入图片描述
还原后JS代码:‘constructor’ apply stateObject => 可以推测出,该自定义构造函数在初始化时,还做了加载某个对象的操作。及时我们右键点击了不再此停止,放过断点,但是依然会有源源不断的对象进行加载,最后导致浏览器卡死。

解决办法:本地注入JS

我们已经定位到了浏览器卡死是因为自定义的debugger构造器不断注入对象导致,那么我们就可以本地执行代码,替换该JS片段,让debugger构造器返回空,无法实现注入对象。

  1. 新建代码片段
    在这里插入图片描述
// 将debugger构造函数替换置空,防止内存爆破
// 1. after_debugger_handle 接收我们的构造器
// 2. 判断构造器如果构造了一个debugger的东西,我们就将其置空
after_debugger_handle = Function.prototype.constructor;
Function.prototype.constructor = function(a){
    if (a == "debugger") {
        return function(){};
    }
    return after_debugger_handle(a);
};
  1. 点击下方的执行按钮,执行代码片段
    在这里插入图片描述

控制台未报错,表明注入成功,此时我们放过断点,发现浏览器不再卡死,即可继续调试。

注意:

  1. 注入后不能刷新页面,否则页面重新加载会导致之前的注入失效。
    在这里插入图片描述
  2. 注入需要等网页数据全部加载完成后再进行,否则可能会报注入失败,JS函数找不到。

拓展:JS混淆(对网页的JS代码进行处理加密)

概念

网站开发者为了防止我们对网站进行调试或者逆向分析,会对JS代码进行处理、保护。

  • 实际就是对JS代码进行编码、加密处理等。
JS压缩混淆:删除无用空白、缩短变量名

JavaScript 压缩混淆主要通过删除无用的空白字符、注释、缩短变量名等方式减小代码体积。压缩混淆不仅可以减少文件大小,还能在一定程度上增加代码阅读难度。

OB混淆:插入不透明谓词(函数逻辑)

OB 混淆(Opaque Predicate Obfuscation)是一种复杂的混淆技术,通过插入不透明谓词来掩盖代码的真实逻辑,使逆向工程师难以理解代码的实际功能。

原始代码:

if (x > 10) {
    console.log("x is greater than 10");
}

OB混淆后:

function isTrue() {
    return Math.random() > 0.5;  // 不透明谓词
}
if (isTrue() || x > 10) {
    console.log("x is greater than 10");
}

在这个示例中,isTrue 函数的返回值是随机的,不透明谓词使得控制流变得更加难以预测。逆向工程师必须理解 isTrue 函数的实现才能准确分析代码逻辑。

变量混淆:重命名函数方法,改为a、b、c等

变量混淆通过重命名变量和函数名来增加代码的阅读难度,使得代码更难以理解。混淆后的变量名通常是无意义的短字符,如 a、b、c 等。

字符串混淆:对字符串进行编码和转换

字符串混淆通过对字符串进行编码和转换,使得字符串的真实内容难以直接查看。常用的字符串混淆技术包括 Base64 编码和字符替换。

属性加密:对部分字段,如:用户名、年龄等进行加密

属性加密通过对对象属性进行加密,保护对象的内部数据。常用的加密方法包括简单的 XOR 操作和更复杂的加密算法。

控制流平坦化:引入虚拟机+状态机,加大代码逻辑复杂度

控制流平坦化通过重构代码的控制流,使得代码逻辑更加复杂和难以理解。平坦化技术常用于保护程序的执行流程。控制流平坦化通过引入虚拟机和状态机来重构代码的控制流。

案例:原始的条件语句被转换为一个状态机,控制流被重构成一系列状态和转换。这种方法使得代码的控制流更加复杂,增加了理解和分析的难度。

原始代码:

if (x > 10) {
    console.log("x is greater than 10");
} else {
    console.log("x is 10 or less");
}

控制流平坦化处理后代码:

const states = [0, 1];
let state = 0;

function execute() {
    switch (state) {
        case 0:
            if (x > 10) {
                state = 2;
                return;
            } else {
                state = 3;
                return;
            }
        case 1:
            console.log("x is greater than 10");
            state = 4;
            return;
        case 2:
            console.log("x is 10 or less");
            state = 4;
            return;
        case 4:
            // end state
            return;
    }
}

while (state !== 4) {
    execute();
}

案例

可以看到下方对有一串字母以及数字,这种情况一般就是JS混淆,让我们无法知晓他JS源代码是什么样子。

在这里插入图片描述

解决办法:

  • 如果该网站使用的是开源的JS混淆代码,我们可以通过工具进行还原。
  • 如果网站使用的是自定义的混淆逻辑,我们只有手动通过控制台进行处理还原(直接复制混淆代码,然后放入控制台,回车即可进行还原。)
    在这里插入图片描述

参考文章:https://blog.csdn.net/weixin_52392194/article/details/141159872

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

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

相关文章

JWT集成Keycloak

一、直接使用现有域账号、密码获取token方式 1.KeyClack 使用现有配置 Client id : account-console 2.服务配置文件配置 3.API接口配置 4. 获取token 5.调用方式(Swagger)(代码方式直接在请求头加上token) 5.1 配置在Swagger访问 5.2 访问需要认证的接…

JavaWeb——Vue路由(概述、介绍、使用、解决bug)

目录 概述 介绍 使用 解决bug 概述 员工管理的页面已经制作完成。其他页面的制作方式一致。 项目中准备了部门管理的页面组件 DeptView ,这样就有了员工管理和部门管理两个页面组件。 在系统中,要实现点击部门管理菜单展示部门管理组件&#xff0c…

为什么Java不支持多重继承?

不支持多重继承主要是因为会产生“菱形继承”,也称为钻石继承的问题。 那什么是菱形继承呢? 它涉及到一个类继承两个父类,而这两个父类又继承自同一个祖先类。这种结构在没有适当处理的情况下,会导致继承层次中的歧义和冗余。 如…

关于BSV区块链覆盖网络的常见问题解答(下篇)

​​发表时间:2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分,覆盖网络服务提供了一个强大的框架,用于管理特定类型的交易和数据访问…

【目标检测】室内地板砖铺设缺陷检测数据集2000张VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2002 标注数量(xml文件个数):2002 标注数量(txt文件个数):2002 标注…

图论大总结

图论基础 98. 所有可达路径 result [] path [] def dfs(graph,x,n):if x n:result.append(path[:])returnfor i in range(1,n1):if graph[x][i] 1:path.append(i)dfs(graph,i,n)path.pop() def main():n,m map(int,input().split())# 邻接矩阵graph [[0]*(n1) for _ in …

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。…

C#高级编程笔记--字符串和正则表达式

本章的主要内容如下: 创建字符串 格式化表达式 正则表达式​​​​​​​ 1.1 System.String类 System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作。由于这种数据类型非常重要,C#提供了它自己…

【C++堆(优先队列)】2233. K 次增加后的最大乘积|1685

本文涉及知识点 C堆(优先队列) 贪心(决策包容性) LeetCode 2233. K 次增加后的最大乘积 给你一个非负整数数组 nums 和一个整数 k 。每次操作,你可以选择 nums 中 任一 元素并将它 增加 1 。 请你返回 至多 k 次操作后,能得到的 nums的 最…

用Python实现运筹学——Day 15: 线性规划的项目实战

一、学习内容 在本节中,我们将综合应用之前学习的线性规划知识,解决一个复杂的实际问题。通过这个实战项目,进一步理解线性规划在资源分配问题中的应用。 二、实战案例:公司资源分配问题 2.1 问题描述: 某公司生产两…

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…

Spring Boot:打造下一代医院管理系统

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言,Spring Boot框…

electron打包报错-winCodeSign无法下载

electron打包报错-winCodeSign下载问题 问题描述 downloaded urlhttps://registry.npmmirror.com/-/binary/electron-builder-binaries/winCodeSign-2.6.0/winCodeSign-2.6.0.7z duration1.577s⨯ cannot execute causeexit status 2outerrorOutERROR: Cannot create s…

C++ | Leetcode C++题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; class Solution {constexpr static int dx[4] {0, 1, 0, -1};constexpr static int dy[4] {1, 0, -1, 0}; public:int dfs(int x, int y, vector<vector<int>> &grid, int n, int m) {if (x < 0 || x > n || y <…

【Canvas与色彩】十二等分多彩隔断圆环

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>隔断圆环Draft4十二等分多彩</title><style type"text…

华为Nova12活力版nova 11,FIN-AL60/FOA-AL00手机忘记密码到底怎么解锁无法激活设备已锁定平台工具软件固件使用解决方案

手机忘记密码到底怎么解锁修理好.弄好刷机解锁视频看了一些没弄好现在图文分享最祥细的教程方法有帐用户锁不再难了华为Nova12活力版nova 11,FIN-AL60/FOA-AL00设备关联至陌生华为账号并被锁定 忘记密码如何破解恢复出厂设置了怎样才能激活-怎样跳过帐号密码激活手机,解锁方案工…

SQL专项练习第六天

Hive 在处理不同数据需求时的灵活性和强大功能&#xff0c;包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个 Hive 数据处理问题的解决方案&#xff0c;并通过实际案例进行演示。 先在home文件夹下建一个hivedata文件夹&a…

玩客云刷派享云教程

玩客云刷机教程 扫描该二维码注册 打开网站&#xff08;xxxxxxx&#xff09; 输入你的id 然后点击生成就可以拿到该设备的下载链接(UBOOT) 详细文档&#xff1a;https://www.123684.com/s/WGAwjv-SNlv3 &#xff08;有不懂看详细文档&#xff09; 准备⼯作 •⼯具软件&…

【JVM系列】深入理解Java虚拟机(JVM)的核心技术:从加载到初始化的全过程解析(一、Java类加载器)

文章目录 【JVM系列】深入理解Java虚拟机&#xff08;JVM&#xff09;的核心技术&#xff1a;从加载到初始化的全过程解析(一、Java类加载器)1. 类加载器加载的过程2. Class文件读取来源3. 类加载器的分类4. 那些操作会初始化类加载器5. 类加载器的双亲委派机制6. ClassLoader源…

Dolma:包含三万亿Token的语言模型预训练研究开放语料库

前言 原论文&#xff1a;Dolma: an Open Corpus of Three Trillion Tokens for Language Model Pretraining Research 摘要 关于训练当前最佳性能语言模型的预训练语料库的信息很少被讨论——商业模型很少详细说明它们的数据&#xff0c;即使是开源模型也往往在没有训练数据…