过瑞数中的高级debugger

发布时间 2023-12-15 11:00:29作者: *感悟人生*
(function() {
    var a = new Date();
    debugger ;return new Date() - a > 100;
}())

这种debugger 如果是用‘一律不在此处暂停’是过不去的。

 

要在浏览器的控制台中执行并阻止 debugger 语句,你可以使用 JavaScript 的 toString() 方法来重写原函数的定义。

这种方法更复杂,因为它需要操纵函数的字符串表示形式,但它可以在不直接修改原始代码的情况下绕过 debugger

这里是一个示例代码,它展示了如何通过重写 Function.prototype.toString 方法来实现这一目的:

(function() {
    // 保存原始的 toString 方法
    var originalToString = Function.prototype.toString;

    // 重写 toString 方法
    Function.prototype.toString = function() {
        var originalCode = originalToString.call(this);
        // 检查并移除 debugger 语句
        var modifiedCode = originalCode.replace(/debugger;/g, '');
        return modifiedCode;
    };

    // 假设这是要绕过的原始函数
    var originalFunction = function() {
        var a = new Date(); 
        debugger; 
        return new Date() - a > 100;
    };

    // 测试重写后的函数
    console.log(originalFunction.toString());
    console.log(originalFunction());
})();

详细中文注释:

  1. var originalToString = Function.prototype.toString;:保存原始的 toString 方法,以便于在重写的方法中调用。

  2. Function.prototype.toString = function() {...}:重写 Function 对象的 toString 方法。任何函数调用 toString 方法时,都会调用这个新的方法。

  3. var originalCode = originalToString.call(this);:通过原始的 toString 方法获取当前函数的源代码。

  4. var modifiedCode = originalCode.replace(/debugger;/g, '');:使用正则表达式移除源代码中的所有 debugger; 语句。

  5. var originalFunction = function() {...}:这是你想要绕过的原始函数。

  6. console.log(originalFunction.toString());console.log(originalFunction());:分别测试重写后的 toString 方法和修改后的函数执行。

当你在浏览器控制台中运行这段代码时,它将重写 Function.prototype.toString 方法,并自动移除任何函数的 debugger; 语句。这样,即使原始函数包含 debugger 语句,它也不会触发调试器暂停。