技术宅

当前位置:首页 > 网站教程 > 代码学习

代码学习

网页反调试检测机制代码

时间: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 {
        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"; // 检测到调试时跳转空白页
});

绕过此检测的方法

  1. 禁用所有断点(Chrome 开发者工具中点击 Deactivate breakpoints 图标)。

  2. 修改代码:删除或注释 debugger 语句。

  3. 屏蔽 debugger

    javascript
    复制
    // 在页面加载前注入(需浏览器插件)
    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 和计时检测开发者工具的使用,常用于保护前端代码或实施恶意行为。若在合法场景中使用,需权衡用户体验与防护需求;若在他人网站中发现类似代码,可能涉及隐私或安全风险。