过无限dubbger(js逆向)


今晚被某网站的无限debugger整的很烦,我之前笔记中记得使用油猴插件进行的debugger也失效了,于是我就想一探究竟,网站的debugger到底是什么原理?

  • 首先,最简单的方法,在 debugger 位置,点击行号,右键 Never pause here,永远不在此处断下即可。但是这种方法就妄想通杀,显然是不大可能的,不然这种防护岂不是弄出来骗自己的。
  • 现在很多网站,这样处理是无法绕过的。例如常规的,可能存在格式化检测,内存爆破,禁用右键,要么就会接着进入到下一个 debugger 中,甚至出现网页卡死的情况等等。

那么什么是debugger,过debugger的方法都有哪些?

vm虚拟机

首先,debugger都会进入一个vm的文件中,那么关于这个vm,是这样的

VM 表示的是 Virtual Machine(虚拟机),这些文件通常表示由浏览器生成和执行的虚拟机脚本环境中的临时脚本。这些脚本并不是项目源代码的一部分,也不是实际存在的物理文件,它们在浏览器的内存中创建并执行。 比如说,当你在调试一个网页时,如果在某些动态生成并执行的 JS 代码上设定了断点,Chrome 调试器会在一个以 VM 开头的文件中显示这些代码,例如 VM1057。这个 VM 文件的存在只是为了调试目的,它并不存在于服务器端,也不会被存储在本地,而是存在于浏览器内存中。一般情况下,这类文件的出现是因为浏览器对 JavaScript 代码的处理方式,如动态编译或者 JavaScript 堆栈跟踪。出现的原因:

动态执行的 JavaScript 代码。比如通过 eval 函数或者 new Function 方法,Chrome 浏览器会创建一个 VM 文件来展示这段临时执行的代码。比如某个网页因为反爬虫,动态生成了 debugger,这些断点并没有直接写在服务器上的原始 JavaScript 文件中,而是在某些 JavaScript 代码的执行过程中被生成,并因此触发 debugger。这些代码也会在执行时被浏览器视为临时的 VM 脚本,并在执行到 debugger 时暂停执行,从而造成所谓的 无限 debugger 循环。
来自执行栈的代码。有时候,当 JavaScript 引擎处理异步操作(例如 Promise、setTimeout 等)中的错误时,错误堆栈可能包含到 VM 脚本的引用,这是因为内部错误回调函数是在虚拟环境中执行的。

基础阻止debugger方法

停用断点

image-20250318151251380

直接把断点禁用,不过我觉得这个没什么卵用

never pause here

image-20250318151451854

右键直接不在此处停止,如果只有一个debugger语句可以这么用

add conditional breakpoint

image-20250318151623369


那么除了一些基本的在浏览器的操作,我们也可以使用一些插件直接hook

定时器debugger

setTimeout

image-20250317214838692

可以看到这里是使用setTimeout定时器重复执行,并且.constructor执行debugger函数生成的无限debugger

,那么这种定时控制的函数我们直接hook掉它的方法或者定时器就可以

hook代码

// ==UserScript==
// @name         天气检测settimeouthook
// @namespace    http://tampermonkey.net/
// @version      2025-03-17
// @description  try to take over the world!
// @author       You
// @match        https://www.aqistudy.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=aqistudy.cn
// @grant        none
// @run-at       document-start
// ==/UserScript==
// 两种 Hook 任选一中
// Hook 构造方法
Function.prototype.constructor_ = Function.prototype.constructor;
Function.prototype.constructor = function (a) {
    if(a == "debugger") {
        return function (){};
    }
    return Function.prototype.constructor_(a);
};

// Hook setTimeout
var setTimeout_ = setTimeout
var setTimeout = function (func, time){
    if (func == txsdefwsw){
        return function () {};
    }
    return setTimeout_(func, time)
}

setInterval

如果是setInterval 定时器和构造方法 constructor


// Hook setInterval
var setInterval_ = setInterval
setInterval = function (func, time){
    if (time == 2000) {
        return function () {};
    }
    return setInterval_(func, time)
}

hook constructor

Function.prototype.constructor_ = Function.prototype.constructor;
Function.prototype.constructor = function (a) {
    // 如果参数为 debugger,就返回空方法
    if(a == "debugger") {
        return function (){};
    }
    // 如果参数不为 debugger,还是返回原方法
    return Function.prototype.constructor_(a);
};

感谢收看,如果还不行的话,建议试一下火狐的debugger;``Pause on debugger statement``Pause on exceptions,可以直接关掉debugger调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shix .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值