【问题标题】:Avoid the detection of "whether Chrome DevTools(console) is open"避免检测“Chrome DevTools(console)是否打开”
【发布时间】:2021-04-11 20:11:09
【问题描述】:

今天看到这个帖子 Find out whether Chrome console is open.

@zswang 提供了检测 Chrome DevTools(console) 是否打开的方法。真是让我吃惊,然后我开始想,有没有办法绕过这个检测技术?

有两种方法可以检测 chrome DevTools 是否打开(详情见上篇文章)

  1. 使用Object.defineProperty

    我可以绕过这个,可以分配给另一个函数。我试过Object.defineProperty=null,然后检测函数死了(我知道写一个模拟函数更好,这里只是一个例子)

  2. 使用obj.__defineGetter__ (Object.prototype.__defineGetter__)

    Object.prototype.__defineGetter__= null不会破坏检测,怎么走动?


最后,我不得不说我不喜欢被监视。希望有一个合适的走动方式。

【问题讨论】:

  • 你如何在别人的网页上实现以上任一目标?
  • @JaromandaX,用户脚本?
  • @Jaromanda X 我认为 tempmonkey 或一些脚本管理器可以让我的代码在站点所有者的代码之前执行,我不知道细节。实际上,我也提出了这个问题,但我害怕有人会说那应该是另一个问题..所以不包括在这里。
  • 更改 Object.defineProperty 可能(可能会)杀死大多数网站的许多功能

标签: javascript google-chrome google-chrome-devtools console.log


【解决方案1】:

检测 DevTools 使用的方法有很多,很难将它们全部阻止。随着 DevTools 获得新功能,有新的方法来检测它的使用。任何阻止检测的第三方工具都不能被信任来阻止 100% 的检测技术。

bug reported to the Chromium team here 提出了将检测阻止直接集成到 Chrome 中的想法。

禁用 javascript

明确阻止任何检测到使用 DevTools 的唯一方法是disable javascript。当页面的 javascript 被禁用时,您仍然可以在 DevTools 控制台中执行 javascript。我发现在打开 DevTools 后立即禁用 javascript 就足够了,如下所示:

  1. 打开 DevTools Command+Option+J (Mac) 或 Control+Shift+J (Windows, Linux)
  2. 键入热键以打开 command menuCmd+Shift+P (Mac) 或 Ctrl+Shift+P (Windows、Linux)
  3. 输入dis 并点击return 以选择禁用Javascript选项。
  4. …检查网站…
  5. 通过调用命令菜单并输入ena 并点击return 重新启用javascript(选择启用Javascript选项)

当然,这种方法对于监控恶意代码是没有用的,因为禁用 javascript 时没有代码在运行。但至少它可以让你有机会在重新启用 javascript 之前设置breakpoints

Chrome DevTools 协议

可以使用Chrome DevTools Protocol 连接到单独的 Chrome 实例并检查网站,而无需在该实例中打开 DevTools:

开发者工具前端可以附加到远程运行的 Chrome 实例以进行调试。为了让这个场景生效,您应该使用 remote-debugging-port 命令行开关启动您的主机 Chrome 实例:

chrome.exe --remote-debugging-port=9222

然后您可以使用不同的用户配置文件启动单独的客户端 Chrome 实例:

chrome.exe --user-data-dir=<some directory>

现在您可以从客户端导航到给定端口并附加到任何发现的选项卡以进行调试:http://localhost:9222

【讨论】:

    【解决方案2】:

    检测开发工具是否打开的最流行方法是调用 console.log(),这仅在开发工具打开时发生。

    下面是一个例子:

    var image = new Image();
    Object.defineProperty(image, 'id', {
        get: function() {
            $('#<element_to_remove_on_detection>').remove();
            console.clear();
        }
    });
    console.log('%c', image);

    在上述情况下,创建了一个新的图像对象,并为 'id' 覆盖了 getter。当 console.log 被调用时,getter 也会被调用。 所以基本上,只要调用 getter,网站就知道 devtools 已打开,因为在 devtools 打开之前不会调用 console.log()。 这是一种非常聪明的检测方法。尽管如此,在尝试调试此类代码时,只需使用 Resource Override 之类的扩展名并注入

    console.log = null;

    进入页面头部应该阻止网站检测 devtools 是否打开。

    【讨论】:

    • 这个对我不起作用。还是因为我使用的是 Chromium?
    • 但对我来说,即使 devtool 未打开,它也会运行 console.log。我通过设置 10 秒 setInterval 来验证它,并在一两分钟后检查控制台。并看到所有的 console.logs 即使在关闭时也会触发
    • 此外,当我使用这种方法时,我看到 console.log 没有调用 getter,我看到它像:id: (...) 并且在单击 (...) 后我可以调用 getter。我试过console.log(image.id)它对我有用,但问题是即使控制台关闭也会触发它。
    【解决方案3】:

    对我来说,我只是在有问题的脚本顶部添加了一个断点,然后在开发者控制台中运行 Image = null

    我通过谷歌搜索网站如何做到这一点找到了这个解决方案,这给我带来了this stackoverflow post,我可以在控制台中看到正在记录一个新图像,因此将 Image 设置为 null 会导致错误,从而导致检测失败。

    【讨论】:

      【解决方案4】:

      你可以试试这样的:

      var oldDefineProperty = Object.defineProperty;
      
      Object.defineProperty = function() {
          var firstArg = arguments[0];
          arguments[0] = _.extend({
              get id() {
                  return firstArg.id;
              }
          }, arguments[0]);
      
          return oldDefineProperty.apply(this, arguments);
      }
      
      var element = new Image();
      element.id = "something";
      Object.defineProperty(element, 'id', {
          get: function() {
              alert("detected");
          }
      });
      console.log('%cHello', element);
      &lt;script src="http://underscorejs.org/underscore-min.js"&gt;&lt;/script&gt;

      这似乎阻止了向我显示警报。我正在使用来自Underscore_extend 函数。我不知道我是否遗漏了什么,只是随便玩玩。

      至于__defineGetter__,它已被弃用,因此您希望它不会被使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-07
        • 2014-03-05
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        相关资源
        最近更新 更多