前端无限debugger和无限reload的反调试与反反调试

773 阅读1分钟

无限reload

反调试原理

控制台打开后,才会执行 console.warn 方法,进而触发reload方法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function forceReload() {
            const context = {
                log: (...args) => {
                    /**
                     * 不显式调用console.xx函数,避免被构建时的remove console 配置移除
                     */
                    const a = console
                    a.warn(...args)
                },
                reload: () => {
                    location.href = '/'
                }
            }
            context.log(
                Object.defineProperties(new Error(), {
                    toString: {
                        value() {
                            const error = new Error()
                            if (error?.stack && error?.stack.includes('toString@')) {
                                context.reload()
                            }
                        }
                    },
                    message: {
                        get() {
                            context.reload()
                        }
                    }
                })
            )
        }
        forceReload()
    </script>
</body>

</html>

反反调试原理

油猴插件设置window.onbeforeunload = () => false,弹出里面点取消即可

无限debugger

反调试

利用setInterval,里面无限执行 debugger

setInterval(()=>{debugger},1000)

反反调试

F12在 sources 里面关掉 deactivate breakpoint 就行

image.png