((function() {
var callbacks = [],
timeLimit = 50,
open = false;
setInterval(loop, 1);
return {
addListener: function(fn) {
callbacks.push(fn);
},
cancleListenr: function(fn) {
callbacks = callbacks.filter(function(v) {
return v !== fn;
});
}
}
function loop() {
var startTime = new Date();
debugger;
if (new Date() - startTime > timeLimit) {
if (!open) {
callbacks.forEach(function(fn) {
fn.call(null);
});
}
open = true;
window.stop();
document.body.innerHTML = "";
} else {
open = false;
}
}
})()).addListener(function() {
window.location.reload();
});
简单来说,当你打开开发者工具时,这段代码会进入 debugger;
状态,从而让浏览器暂停。此外,如果检测到从进入 debugger;
到执行后面代码的时间超过了一个设定的时间阈值,它会认为开发者工具是打开的,并执行某些反应,如重载页面或清空页面内容。
这段代码的工作原理如下:
- 定义一个立即执行的匿名函数,其中有一个不断循环的
setInterval
。 - 在循环中,它首先获取当前时间
startTime
。 - 然后执行
debugger;
语句,这会让浏览器暂停,只有当开发者工具打开时才有效。 - 如果从执行
debugger;
到获取新的时间间隔超过了设定的timeLimit
,它就会假设开发者工具是打开的,并执行在callbacks
数组中的所有回调函数。 - 在给出的例子中,它添加了一个回调函数,该函数会重载页面。
所以,当你打开开发者工具并且代码进入 debugger;
状态时,如果你没有在 50 毫秒内恢复代码执行,页面就会重载。
这种方法确实可能会给开发者带来一些困扰,特别是当他们想要检查或修改页面内容时。但同时,它也可以在某种程度上保护网站的代码不被轻易查看或篡改。
要绕过这种防护机制,您可以考虑以下方法:
-
禁用JavaScript:这是最简单和最直接的方法。但这样可能会导致网页的某些功能无法正常工作。
-
从源代码中移除防护代码:
- 打开浏览器,但不打开开发者工具。
- 使用浏览器的“查看源代码”功能查看页面的源代码。
- 找到与上述代码相似的部分并手动删除或注释掉它。
- 将修改后的代码保存到本地,并从本地打开。
-
使用断点:
- 打开开发者工具后,立即在
debugger;
语句前设置一个断点。这样可以在执行到debugger;
之前暂停代码。 - 一旦代码暂停,您可以手动更改或删除相关代码,然后继续执行。
- 打开开发者工具后,立即在
-
修改
timeLimit
:如果您能快速操作,可以试着在代码进入debugger;
之前修改timeLimit
的值,使其非常大,例如设置为一小时。这样即使打开了开发者工具,检测也不会触发。 -
使用浏览器扩展或插件:有些扩展或插件可能允许您更轻松地绕过此类防护机制。
-
修改浏览器的内部行为:如果您对浏览器的开发有深入的了解,可以尝试修改浏览器的源代码或使用特殊版本的浏览器来避免
debugger;
的暂停效果。
但请注意,尝试破解或绕过网站的安全机制可能违反法律或服务条款。在进行任何此类操作之前,请确保您有权这样做并了解可能的法律后果。