避免检测“Chrome DevTools(console)是否打开”

Mit*_*ril 7 javascript google-chrome google-chrome-devtools console.log

今天我看到这篇文章 找出Chrome控制台是否打开

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

有两种方法可以检测 chrome DevTools 是否打开(详细信息在上面的帖子中)

  1. 使用 Object.defineProperty

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

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

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


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

小智 10

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

下面是一个例子:

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

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

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


Qui*_*ant 5

有很多方法可以检测 DevTools 的使用情况,因此很难将它们全部屏蔽。随着 DevTools 获得新功能,有新方法可以检测其使用情况。不能信任任何阻止检测的第三方工具来阻止 100% 的检测技术。

有一个在这里报告给Chromium小组的bug上集成检测直接阻断了Chrome的想法。

禁用 JavaScript

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

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

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

Chrome 开发者工具协议

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

开发者工具前端可以附加到远程运行的 Chrome 实例进行调试。要使此方案正常运行,您应该使用 remote-debugging-port 命令行开关启动您的主机 Chrome 实例:

chrome.exe --remote-debugging-port=9222
Run Code Online (Sandbox Code Playgroud)

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

chrome.exe --user-data-dir=<some directory>
Run Code Online (Sandbox Code Playgroud)

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


Gid*_*zer 0

你可以尝试这样的事情:

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);
Run Code Online (Sandbox Code Playgroud)
<script src="http://underscorejs.org/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)

这似乎阻止了向我显示警报。我正在使用Underscore_extend的函数。我不知道我是否错过了什么,只是玩玩而已。

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