控制台输出检测|拦截 dom 属性触发反调试

下面这段代码会导致打开控制台的时候跳转到空白页

不打开控制台就不会触发 <script> 标签

<!doctype html>
<html lang="en">
    <script>
        var x = document.createElement("div"); // 创建一个空的div元素
        Object.defineProperty(x, "id", {
            get: function () {
                // 给x的id属性定义一个"读取时触发的函数"
                window.location = "about:blank"; // 触发时跳转空白页
                window.threshold = 0;
            },
        });
        alert("触发反调试,跳转空白页");
        console.info(x); // 输出x到控制台
    </script>
</html>

要理解这种反调试手段,首先需要明确浏览器控制台的一个关键行为:当控制台输出 DOM 元素时,会主动读取元素的核心属性以展示详细信息。

例如,当我们执行 console.log(document.createElement('div')) 并打开控制台时,会看到类似div的输出(若元素有id,则显示 div #xxx

对于上面的代码:

  • 控制台关闭时: console.info(x) 虽然执行,但浏览器无需展示输出内容,因此不会读取x的id属性, get 方法不触发。
  • 控制台打开时:浏览器必须渲染 x 的信息,那就必然会读取 id 属性,触发 get 方法中的反调试逻辑