怎么解决JavaScript逆向的时候遇到无限debugger的问题

发布时间:2021-08-11 10:17:54 作者:chen
来源:亿速云 阅读:442

怎么解决JavaScript逆向的时候遇到无限debugger的问题

在进行JavaScript逆向工程时,经常会遇到网站为了防止调试而设置的无限debugger陷阱。这种机制会不断触发断点,导致调试器无法正常进行代码分析。本文将详细介绍如何应对这种情况,并提供一些实用的解决方案。

1. 理解无限debugger的原理

无限debugger通常是通过在代码中插入debugger;语句来实现的。当开发者工具打开时,浏览器会执行debugger;语句,从而触发断点。如果这个语句被放在一个循环或定时器中,就会导致断点不断被触发,形成“无限debugger”的效果。

例如:

setInterval(function() {
    debugger;
}, 100);

这段代码会每隔100毫秒触发一次断点,导致调试器无法正常进行。

2. 禁用断点

最简单的方法是直接禁用断点。大多数现代浏览器的开发者工具都提供了禁用断点的功能。

2.1 Chrome 开发者工具

在Chrome开发者工具中,可以通过以下步骤禁用断点:

  1. 打开开发者工具(F12或右键检查)。
  2. 切换到“Sources”选项卡。
  3. 在右侧的“Breakpoints”面板中,点击“Deactivate breakpoints”按钮(图标是一个暂停符号)。

这样,所有的断点都会被禁用,包括debugger;语句。

2.2 Firefox 开发者工具

在Firefox开发者工具中,禁用断点的方法类似:

  1. 打开开发者工具(F12或右键检查)。
  2. 切换到“Debugger”选项卡。
  3. 在右侧的“Breakpoints”面板中,点击“Disable all breakpoints”按钮。

3. 重写debugger函数

如果禁用断点的方法不奏效,或者你希望在不完全禁用断点的情况下绕过无限debugger,可以尝试重写debugger函数。

3.1 使用Function.prototype重写

你可以通过重写Function.prototype来拦截debugger语句的执行:

Function.prototype.constructor = function() {};

这段代码会将Function.prototype.constructor重写为一个空函数,从而阻止debugger语句的执行。

3.2 使用eval重写

另一种方法是使用eval来动态重写debugger函数:

eval("debugger = function() {}");

这段代码会将debugger重写为一个空函数,从而阻止断点的触发。

4. 使用代理拦截debugger语句

如果你需要更精细的控制,可以使用JavaScript的Proxy对象来拦截debugger语句的执行。

4.1 创建代理

首先,创建一个代理对象来拦截debugger语句:

const handler = {
    apply: function(target, thisArg, argumentsList) {
        if (argumentsList[0] === 'debugger') {
            return;
        }
        return target.apply(thisArg, argumentsList);
    }
};

const proxy = new Proxy(Function, handler);

4.2 替换Function构造函数

接下来,将Function构造函数替换为代理对象:

Function = proxy;

这样,所有的debugger语句都会被拦截,而不会触发断点。

5. 使用浏览器扩展

如果你不想手动修改代码,可以使用一些浏览器扩展来绕过无限debugger。

5.1 Chrome 扩展

有一些Chrome扩展可以帮助你绕过无限debugger,例如“Disable JavaScript”或“Debugger Disabler”。这些扩展可以自动禁用debugger语句,从而避免断点的触发。

5.2 Firefox 扩展

在Firefox中,你可以使用“Disable Debugger”扩展来达到同样的效果。这些扩展通常会在后台运行,自动拦截debugger语句。

6. 使用无头浏览器

如果你需要在自动化脚本中绕过无限debugger,可以考虑使用无头浏览器,如Puppeteer或Playwright。

6.1 Puppeteer

Puppeteer是一个Node.js库,提供了对Chrome或Chromium的高级API控制。你可以通过Puppeteer启动一个无头浏览器,并禁用断点:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://example.com');

    await page.evaluate(() => {
        Function.prototype.constructor = function() {};
    });

    // 继续你的操作
})();

6.2 Playwright

Playwright是另一个类似Puppeteer的库,支持多种浏览器。你可以使用Playwright来禁用断点:

const { chromium } = require('playwright');

(async () => {
    const browser = await chromium.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://example.com');

    await page.evaluate(() => {
        Function.prototype.constructor = function() {};
    });

    // 继续你的操作
})();

7. 总结

无限debugger是JavaScript逆向工程中常见的反调试手段,但通过禁用断点、重写debugger函数、使用代理、浏览器扩展或无头浏览器等方法,你可以有效地绕过这些陷阱。选择合适的方法取决于你的具体需求和环境。希望本文提供的解决方案能帮助你在JavaScript逆向工程中更加顺利地进行调试和分析。

推荐阅读:
  1. 使用逆向工程遇到的坑
  2. Android studio如何解决使用Debugger问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript

上一篇:Android如何实现播放视频

下一篇:Android如何选择图片或视频进行循环播放

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》