网页反调试检测机制代码
时间:02-25
作者:
使用方法:
将下面代码做成JS文件
var check = (function () {
var callbacks = [], timeLimit = 50, open = false;
setInterval(loop, 1);
return {
ad
将下面代码做成JS文件
var check = (function () {
var callbacks = [], timeLimit = 50, open = false;
setInterval(loop, 1);
return {
ad
使用方法:
将下面代码做成JS文件
var check = (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;
} else {
open = false;
}
}
})();
check.addListener(function () {
});
放到你的网页
<script src="/jinf12.js" type="text/javascript"> </script>
这段代码是一个 反调试检测机制,用于探测用户是否打开浏览器开发者工具(如按 F12),并触发回调函数。其核心逻辑是通过 debugger 语句和代码执行时间差来识别调试行为。以下是详细解析和风险提示:
复制2. 关键函数
javascript
复制
复制
复制
复制
复制
复制
将下面代码做成JS文件
var check = (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;
} else {
open = false;
}
}
})();
check.addListener(function () {
});
放到你的网页
<script src="/jinf12.js" type="text/javascript"> </script>
这段代码是一个 反调试检测机制,用于探测用户是否打开浏览器开发者工具(如按 F12),并触发回调函数。其核心逻辑是通过 debugger 语句和代码执行时间差来识别调试行为。以下是详细解析和风险提示:
代码功能解析
1. 自执行函数与状态管理
javascript复制
var check = (function () { var callbacks = [], // 存储监听回调函数 timeLimit = 50, // 时间阈值(单位:毫秒) open = false; // 标记是否触发检测 setInterval(loop, 1); // 每1毫秒执行一次 loop 函数 return { /* 暴露方法 */ }; })();
-
目的:创建闭包,隐藏内部变量,防止外部篡改。
2. 关键函数 loop()
javascript复制
function loop() { var startTime = new Date(); debugger; // 强制触发断点(若开发者工具已打开) if (new Date() - startTime > timeLimit) { if (!open) { callbacks.forEach(fn => fn.call(null)); // 执行所有回调 } open = true; // 标记为已触发 } else { open = false; } }
-
原理:
-
正常情况下,
new Date() - startTime
约为0ms
(代码执行极快)。 -
若开发者工具打开:
debugger
会暂停执行,手动恢复后时间差将超过50ms
→ 触发回调。
-
3. 回调管理方法
javascript复制
return { addListener: function (fn) { callbacks.push(fn); }, // 添加回调 cancleListenr: function (fn) { /* 移除回调 */ } // 存在拼写错误 };
-
问题:
cancleListenr
应为cancelListener
,拼写错误导致移除回调功能失效。
代码用途与风险
1. 典型应用场景
-
反调试:阻止用户使用开发者工具分析网页代码。
-
保护敏感逻辑:检测到调试时,跳转到空白页或终止关键流程。
-
恶意攻击:循环触发
debugger
导致浏览器卡死。
2. 风险与副作用
-
用户体验破坏:若用户意外打开开发者工具,页面功能异常。
-
性能问题:
setInterval(..., 1)
高频率调用loop()
,导致 CPU 占用飙升。 -
检测绕过:熟练用户可通过禁用断点或修改代码绕过检测。
示例:检测到调试时跳转空白页
javascript复制
check.addListener(function () { window.location.href = "about:blank"; // 检测到调试时跳转空白页 });
绕过此检测的方法
-
禁用所有断点(Chrome 开发者工具中点击 Deactivate breakpoints 图标)。
-
修改代码:删除或注释
debugger
语句。 -
屏蔽
javascriptdebugger
:
复制// 在页面加载前注入(需浏览器插件) window._originalDebugger = window.debugger; window.debugger = function() {}; // 替换为无操作函数
代码优化建议
1. 修正拼写错误
javascript复制
// 将 cancleListenr 改为 cancelListener cancelListener: function (fn) { ... }
2. 降低检测频率
javascript复制
setInterval(loop, 100); // 间隔改为 100ms,减少性能消耗
3. 添加移除检测的方法
javascript复制
// 暴露停止检测的方法 return { stop: function() { clearInterval(intervalId); }, // ...原有方法 };
总结
此代码通过 debugger
和计时检测开发者工具的使用,常用于保护前端代码或实施恶意行为。若在合法场景中使用,需权衡用户体验与防护需求;若在他人网站中发现类似代码,可能涉及隐私或安全风险。