避免检测“Chrome DevTools(控制台)是否打开”

时间:2016-08-12 05:56:53

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

今天我看到这篇文章 Find out whether Chrome console is open

@zswang提供了检测Chrome DevTools(控制台)是否已打开的方法。这真让我感到惊讶,然后我开始认为有没有办法绕过这种检测技术?

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

  1. 使用Object.defineProperty

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

  2. 使用obj.__defineGetter__Object.prototype.__defineGetter__

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


  3. 最后,我不得不说我不喜欢受到监控。希望有一种适当的方式来走动。

4 个答案:

答案 0 :(得分:2)

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

关于将检测阻止功能直接集成到Chrome中的想法bug reported to the Chromium team here

禁用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以选择 Disable Javascript (禁用Javascript)选项。
  4. ...检查网站...
  5. 通过调用命令菜单并键入ena并按return(选择 Enable Javascript 选项)来重新启用javascript

当然,此方法对监视恶意代码没有用,因为在禁用javascript时没有代码在运行。但是至少它可能使您有机会在重新启用JavaScript之前设置breakpoints

Chrome DevTools协议

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

  

Developer Tools前端可以连接到远程运行的Chrome实例进行调试。为了使这种情况起作用,您应该使用remote-debugging-port命令行开关启动您的Chrome主机托管实例:

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

然后,您可以使用不同的用户个人资料启动单独的客户端Chrome实例:

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

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

答案 1 :(得分: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 已经打开,因为 console.log() 在 devtools 打开之前不会被调用。 这是一种非常聪明的检测方式。尽管如此,在尝试调试此类代码时,只需使用 Resource Override 之类的扩展并注入

console.log = null;

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

答案 2 :(得分:1)

对我来说,我只是在有问题的脚本顶部添加了一个断点,然后在开发者控制台中运行了<table id="sms-table" class="table table-hover datatable-User"> <thead> <th>Date</th> <th>From</th> <th>Message</th> <th>Status</th> </thead> <tbody> @foreach($allMessages as $item) @if($item->status == "Received") <tr> @php $date = \Carbon\Carbon::createFromTimestamp($item->date ) @endphp <td>{{$date->toDayDateTimeString()}}</td> <td>{{$item->from}}</td> <td>{{$item->body}}</td> <td><span class="badge badge-success">{{$item->status}}</span> </td> </tr> @endif @endforeach </tbody> </table> <div class="mt-5"> <nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> <li class="page-item {{$prev_page == null ? 'disabled' : ''}}" data-page="{{$prev_page == null ? null : $prev_page }}"> <a class="page-link" {{$prev_page == null ? 'disabled' : ''}} href="" tabindex="-1">Previous</a> </li> {{-- <li class="page-item"><a class="page-link" >1</a></li>--}} {{-- <li class="page-item"><a class="page-link">2</a></li>--}} {{-- <li class="page-item"><a class="page-link">3</a></li>--}} <li class="page-item" data-page="{{$next_page == null ? null : $next_page }}"> <a class="page-link" href="#">Next</a> </li> </ul> </nav> </div> <script> $('.page-item').on('click', function () { var page = $(this).data('page') $.ajax({ url: 'maindomain/api/all-inbound?page=' + page, type: 'GET', success: function (data) { $('#sms-data').html(data.data); }, }); }) </script>

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

答案 3 :(得分:0)

您可以尝试这样的事情:

&#13;
&#13;
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);
&#13;
<script src="http://underscorejs.org/underscore-min.js"></script>
&#13;
&#13;
&#13;

这似乎阻止警报显示给我。我使用_extend中的Underscore功能。我不知道我是否只是在玩弄错过任何东西。

对于__defineGetter__,这已被弃用,因此您希望不要使用此功能。