如何关闭网站恶意debugger;,仅在自定义断点处触发调试?
如何屏蔽网站恶意的debugger干扰,只保留自定义断点
这种反调试手段确实挺烦人的,尤其是结合计时跟踪的话,调试起来束手束脚。我给你几个实用的解决办法,按操作复杂度从低到高来:
1. 利用浏览器调试器的“永不暂停”功能(快速治标)
如果网站的debugger是固定位置的(不是动态生成的),当调试器第一次停在网站的debugger;语句上时:
- 在Chrome DevTools的Sources面板里,找到右侧Breakpoints区域中对应的这个debugger断点,右键点击它,选择Never pause here
- Firefox的话,在调试器的断点列表里,右键该断点,勾选Disable breakpoint或者类似的“永不暂停”选项
这个方法简单,但如果网站是通过setInterval动态插入debugger(比如每次执行都生成新的debugger语句),这个方法就不太好用了,得用下面的办法。
2. 全局覆盖debugger函数(彻底屏蔽自动断点)
我们可以在网站脚本运行前,覆盖全局的debugger函数,让它变成一个空函数,这样网站调用debugger;就不会触发断点了:
- 打开Chrome DevTools的Console面板
- 点击Console左上角的设置图标,勾选Preserve log和Disable JavaScript,然后刷新页面
- 页面刷新后,再取消勾选Disable JavaScript,立刻在Console里输入这段代码并回车:
debugger = function() {};
- 现在网站所有的
debugger;调用都失效了,你可以正常设置自己的断点调试
注意:有些网站会检测debugger是否被篡改,可能会重新赋值回去。遇到这种情况,你可以用更隐蔽的方式覆盖,比如用Object.defineProperty锁定这个属性:
Object.defineProperty(window, 'debugger', { value: function() {}, writable: false, configurable: false });
3. 破解计时跟踪机制(解决停留终止问题)
网站的计时逻辑一般是这样的:在debugger触发前记录时间,断点恢复后计算停留时长,如果超过阈值就终止功能。我们需要找到这个计时变量并篡改它:
- 当调试器停在网站的debugger语句时,在Console里输入
console.trace(),看看调用栈里的函数,找到负责计时的变量(比如可能叫debugStartTime、checkDebugDelay之类的) - 找到变量后,直接在Console里修改它的值,比如把
debugStartTime改成当前时间戳:debugStartTime = Date.now(); - 如果是封装在闭包里的变量,你可以在计时逻辑的代码处设置条件断点,比如当判断时长的代码执行时,强制让它返回
false,比如把if (delay > 3000)改成if (false)
4. 使用调试器的黑盒脚本功能(过滤网站脚本)
如果你只关心自己要调试的部分,不想被网站的脚本干扰,可以把网站的脚本加入黑盒:
- 在Chrome DevTools的Sources面板里,找到网站的脚本文件,右键点击,选择Blackbox script
- 这样调试器就不会在这些黑盒脚本里触发断点,只会在你没黑盒的脚本(比如自己的代码)里响应自定义断点
这些方法组合起来用,基本能搞定大部分反调试的网站了,你可以根据实际情况选最合适的。
内容的提问来源于stack exchange,提问作者user230910
相关产品推荐
相关产品推荐

