浏览器反调试绕过无限debugger及代码执行器检测

背景

现在做数据爬虫的朋友常有的方法就是利用浏览器的调试能力分析别人JS代码逻辑。如果遇到复杂的代码可能会第三方代码执行功能。例如使用puppeteer的evalute方法执行代码获取结果。

而我们做反爬遇到这种情况就是进行调试干扰,例如加入定时器,重复调用debugger,那么调试模式下就影响调试。

在这里插入图片描述

而对于类似通过evalute方法执行代码进行抓取的爬虫通过异常调用栈即可检测。例如执行代码中故意插入一段代码,并产生错误,那么通过调用栈可以检测到函数名,这样就可以进行识别。

           let checkFunc = function () {
               let detected = false;
               let stack;
               try {
                   (void 0).c;
               } catch (error) {
                   stack = (error || {}).stack;
                   detected = (stack && typeof stack === "string" && (stack.indexOf("eval") > -1));
               }
               return detected;
           };

解决办法

我很久前也写过一些文章,介绍了处理思路,“拦截及预处理”,任何场景下这些前端的具体问题都会想到解决办法。第一个debugger问题。虽然很好的干扰调试者,但也暴露的自身的调用栈。通过定时器产生周期调用,最终通过concat拼接构成字符串,最后通过构造器来完成执行。

function e(t) {
    if ("string" == typeof t)
        return function(t) {}
        .constructor("while (true) {}").apply("counter");
    1 !== ("" + t / t).length || t % 20 == 0 ? function() {
        return !0
    }
    .constructor("".concat(y).concat(x).concat(b)).call("action") : function() {
        return !1
    }
    .constructor("".concat(y).concat(x).concat(b)).apply("stateObject"),
    e(++t)
}

那我们知道了这个问题,按照拦截及预处理的思路,只要在concat过程中干扰debugger生成,换成无关紧要的方法即可。我们将下面的代码在浏览器控制台中执行。随后看到debugger干扰调试就不会再生效。

String.prototype.concat = new Proxy(String.prototype.concat,{
    apply:function(target,ctx,param) {
        let value = target.call(ctx,...param);
        if(value.indexOf("debugg") > -1) { 
          value = 'console';
        }
        return value;
    }
});

接着就可以舒服的看代码了。这也不是唯一的办法,替换文件,响应替换都可以。这里仅是一个思路,对于不同人看到还会想到不同的思路。

此外我们会发现页面刷新后代码就会失效。只需要找一个在页面加载前执行代码的浏览器插件即可。

debugger这个问题清楚了,那么对于evalute执行代码被检测的处理也就知道了如何应对了。思路有很多,当然也是可以修改框架代码解决。

String.prototype.indexOf = (function(){
               let oIndexOf = String.prototype.indexOf;
               return function(value,from) {
                   if(value === 'eval') {
                       debugger;
                       return -1;
                   } else {
                       return oIndexOf.call(this,value,from);
                   }
               }
           })();

总结

拦截的方法也仅仅是对语言认知加深即可提升。当然自己思考过了有思路,也只是查手册的问题。

我们遇到的很多这些问题google后,会发现很早很早以前已经有人提出,这些办法不一定解决一个具体的问题,但是确是很好的思路,因此看到别人的思路,自己多思考就能想到扩展点。而不是记录一大推实例,一但现象不同了,就懵了。

<think>好的,我现在需要处理用户关于瑞数6绕过无限debugger方法的请求。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。引用[1]提到瑞数使用了eval函数隐藏代码,难以定位debugger的位置,并且代码总在变化,绕过需要时间。用户现在特别询问瑞数6的绕过方法,所以需要针对这个版本的具体情况进行分析。 接下来,我需要考虑瑞数6可能使用的反调试机制。根据引用[3],瑞数可能通过eval函数动态执行代码,隐藏debugger的位置。传统的重写构造函数或断点绕过可能不够,因为瑞数的代码混淆和动态变化会让这些方法失效。引用[4]提到在Chrome开发者工具中设置“Never pause here”,但瑞数6可能频繁更换断点位置,使得手动设置不现实。 用户提供的引用[5]中的链接可能包含更详细的技术实现,但根据现有信息,我需要综合各引用来构建解决方案。可能的思路包括动态Hook关键函数、拦截eval执行、修改调试环境检测逻辑。例如,使用中间人攻击或浏览器插件来修改JS代码,或者在运行时动态替换关键函数,如setInterval或Function构造函数,以防止debugger触发。 另外,引用[2]提到绕过无限Debugger的方法,比如重写构造函数或使用Never pause here,但瑞数6可能需要更高级的方法,如自动化脚本处理动态生成的debugger语句,或利用浏览器内核定制,如引用[1]提到的定制Chromium来绕过检测。 还需要考虑瑞数6的代码混淆和自校验机制,可能需要AST级别的代码重构或动态Hook技术。引用[3]提到重写函数使debugger失效,但瑞数可能检测函数是否被篡改,所以需要更隐蔽的Hook方式,比如使用Proxy对象或修改原型链。 最后,用户可能需要具体的代码示例,比如使用Chrome插件或Puppeteer自动化来绕过debugger。例如,在Puppeteer中设置Chrome启动参数禁用调试,或者在页面加载前注入脚本覆盖关键函数。 总结,瑞数6的绕过需要结合动态Hook、代码拦截和环境伪装,同时处理代码混淆和动态变化带来的挑战。需要分步骤详细说明技术实现,并确保引用相关段落作为支持。</think>### 瑞数6绕过无限Debugger方法的技术实现 瑞数6的反调试机制通过动态混淆、`eval`函数执行及环境检测实现无限Debugger干扰逆向分析。以下是核心绕过思路及技术实现步骤: --- #### **1. 动态Hook关键函数** 瑞数6通过`eval`或`Function`构造函数动态生成含Debugger的代码[^1][^3]。可通过拦截`eval`和`Function`的执行,过滤或替换`debugger`关键字: ```javascript // Hook eval函数 const originalEval = window.eval; window.eval = function(code) { code = code.replace(/debugger/g, ''); return originalEval(code); }; // Hook Function构造函数 const originalFunction = window.Function; window.Function = function(...args) { const body = args.pop(); if (typeof body === 'string' && body.includes('debugger')) { args.push(body.replace(/debugger/g, '')); } return originalFunction(...args); }; ``` --- #### **2. 断点绕过调试环境伪装** 瑞数6会检测调试工具(如Chrome DevTools)的存在[^4]。需通过以下方法伪装环境: - **禁用断点触发** 在Chrome开发者工具中,右键点击行号选择**Never pause here**,或通过`--auto-open-devtools-for-tabs`启动参数禁用调试检测[^4][^5]。 - **修改环境属性** 覆盖`navigator.webdriver`、`window.chrome`等属性: ```javascript Object.defineProperty(navigator, 'webdriver', { get: () => false }); delete window.chrome; ``` --- #### **3. AST重构与代码动态修复** 针对瑞数6的代码混淆和自校验机制,需进行AST(抽象语法树)级别的代码解析与重构: - **使用工具解析动态代码** 利用`Babel`或`Esprima`解析`eval`执行的代码,定位并删除`debugger`语句。 - **动态注入Hook脚本** 在页面加载前注入代理脚本,覆盖`setInterval`、`setTimeout`等可能触发Debugger的函数: ```javascript const originalSetInterval = window.setInterval; window.setInterval = function(fn, delay) { if (fn.toString().includes('debugger')) return; return originalSetInterval(fn, delay); }; ``` --- #### **4. 浏览器内核定制(高级)** 对于深度防护场景(如动态更换Debugger位置),可定制Chromium内核: - **修改V8引擎行为** 通过修改V8源码中的`Debugger::Break`函数,跳过Debugger指令执行[^1]。 - **禁用调试协议** 编译浏览器时关闭`--enable-debugging`标志,阻断开发者工具与页面的通信。 --- #### **5. 自动化工具集成** 使用`Puppeteer`或`Selenium`自动化控制浏览器,结合上述方法: ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false, args: ['--disable-web-security', '--no-sandbox'] }); const page = await browser.newPage(); await page.evaluateOnNewDocument(() => { // 注入Hook脚本 window.eval = code => { ... }; }); await page.goto('目标网站'); })(); ``` ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值