反控制台,函数,反调试

js 复制代码
function recordBehavior(_0x57bedd, _0x1d62c8) {
  console["log"]("行为记录:", {
    "action": _0x57bedd,
    "data": _0x1d62c8,
    "timestamp": Date["now"]()
  });
}
function _ÿijjji() {
  try {
    if (console["table"]["toString"]() !== "function table() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (console["table"]["toString"]() !== Function["prototype"]["toString"]["call"](console["table"])) {
      location["href"] = "https://yuanshen.com/";
      document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
      return true;
    };
    if (console["clear"]["toString"]() !== "function clear() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setInterval["toString"]() !== "function setInterval() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setTimeout["toString"]() !== "function setTimeout() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setInterval["toString"]() !== Function["prototype"]["toString"]["call"](setInterval)) {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setTimeout["toString"]() !== Function["prototype"]["toString"]["call"](setTimeout)) {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (Date["now"]["toString"]() !== "function now() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (performance["now"]["toString"]() !== "function now() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            }
    if (console["log"]["toString"]() !== "function log() { [native code] }") {
      location["href"] = "https://yuanshen.com/";
      document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
      return true;
    }
    return false;
  } catch (_0x43ee34) {
    location["href"] = "https://yuanshen.com/";
    document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
    return true;
  }
}
function _ÿbgbad() {
  var _0x1d1aeb = performance["now"]();
  _ÿijjji();
  var _0x29fa91 = Array(1000)["fill"]()["map"](function (_0x31947b, _0x3b4860) {
            return {
              "id": _0x3b4860,
              "name": "test" + _0x3b4860,
              "value": Math["random"]()
            };
          });
  console["table"](_0x29fa91);
  console["clear"]();
  var _0x1a88d8 = performance["now"]();
  var _0x33304b = _0x1a88d8 - _0x1d1aeb;
  console["log"]("执行时间:", _0x33304b);
  if (_0x33304b > 10) {
    recordBehavior("debugger_detected", {
              "executionTime": _0x33304b,
              "timestamp": Date["now"]()
            });
    location["href"] = "https://yuanshen.com/";
    document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
  }
}
_ÿaedfa = setInterval(_ÿbgbad, 1000);

这段代码是一段典型的前端反调试(Anti-debugging)代码保护 脚本。它的核心目的是检测用户是否打开了浏览器开发者工具(F12),如果检测到调试行为,就会强制将页面跳转到其他网站(如代码中的 yuanshen.com)。

以下是该代码的详细分析:


1. 核心检测机制

这段代码通过两个维度来判断环境是否"安全":原生函数完整性校验执行时间差检测

A. 函数原生性校验 (_ÿijjji 函数)

它大量使用了 .toString() 方法来检查浏览器内置函数(如 console.log, setInterval, setTimeout, Date.now 等)是否被篡改。

  • 原理 :在正常的浏览器环境中,输入 console.log.toString() 会返回 "function log() { [native code] }"
  • 目的 :防止开发者通过"钩子"(Hook)技术修改这些函数来绕过检测。如果某个函数被用户自定义的代码覆盖了,它的 toString() 结果就会改变,从而触发保护机制。

B. 性能差异检测 (_ÿbgbad 函数)

这是最精巧的部分。它利用了开发者工具开启时会对页面性能产生负面影响的特性。

  1. 它先记录一个开始时间 performance.now()
  2. 接着运行 console.table() 打印一个包含 1000 条数据的复杂表格,然后迅速用 console.clear() 清除。
  3. 关键点 :如果开发者工具(Console 面板)是关闭 的,这个渲染过程极快;如果开发者工具是开启的,浏览器渲染这个大表格会消耗显著的时间。
  4. 最后计算差值,如果耗时超过 10ms,则判定为正在被调试。

2. 逻辑流程图


3. 函数功能拆解

函数名 核心功能
recordBehavior 日志记录。将检测到的"异常行为"记录到控制台(或发送至后台),包含动作名称和当前时间戳。
_ÿijjji 环境白名单校验 。检查 consoleDateperformance 等对象是否处于原生状态。一旦发现被修改,立即返回 true 并跳转。
_ÿbgbad 主检测循环。执行性能测试。通过模拟高负载的控制台渲染任务,观察系统反馈速度。
setInterval 持续监控。每隔 1000 毫秒(1秒)自动运行一次检测,确保用户在页面停留期间无法中途打开调试器。

4. 触发后果

一旦代码判定你在调试(无论是函数被 Hook,还是渲染超时),它会执行以下操作:

  1. 强制跳转location.href = "https://yuanshen.com/";(将页面重定向)。
  2. 清空内容document.body.innerHTML = "检测到调试环境,页面已被保护。";

5. 总结与评价

  • 有效性 :这种方法在应对初级和中级分析时非常有效,尤其是 console.table 时间差检测,是目前前端反调试的常用手段。
  • 局限性
  • 误判率:在性能极差的旧设备或低端手机上,即使不开启调试器,渲染 1000 条数据也可能超过 10ms,导致普通用户无法访问。
  • 对抗性 :高级开发者可以通过禁用 setInterval、在页面加载前注入屏蔽脚本、或者使用非标准的调试手段(如远程调试协议)来绕过。
相关推荐
草履虫建模2 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
华玥作者4 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
naruto_lnq4 小时前
分布式系统安全通信
开发语言·c++·算法
Mr Xu_4 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠5 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
学嵌入式的小杨同学5 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
sleeppingfrog5 小时前
zebra通过zpl语言实现中文打印(二)
javascript
lang201509285 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚5 小时前
Java入门17——异常
java·开发语言
精彩极了吧5 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合