今天我看到这篇文章 Find out whether Chrome console is open。
@zswang提供了检测Chrome DevTools(控制台)是否已打开的方法。这真让我感到惊讶,然后我开始认为有没有办法绕过这种检测技术?
有两种方法可以检测chrome DevTools是否已打开(详见上文)
使用Object.defineProperty
我可以绕过这个,它可以分配给另一个函数。我试过Object.defineProperty=null
,然后检测函数死了(我知道写一个模拟函数更好,这里只是一个例子)
使用obj.__defineGetter__
(Object.prototype.__defineGetter__
)
Object.prototype.__defineGetter__= null
不会破坏检测,如何走动?
最后,我不得不说我不喜欢受到监控。希望有一种适当的方式来走动。
答案 0 :(得分:2)
有很多方法可以检测到DevTools的使用,以至于很难全部阻止它们。随着DevTools获得新功能,有新的方法来检测其用途。不能相信任何阻止检测的第三方工具都可以阻止100%的检测技术。
关于将检测阻止功能直接集成到Chrome中的想法bug reported to the Chromium team here。
明确禁止任何对DevTools使用的检测的唯一方法是disable javascript。禁用页面的javascript时,您仍然可以在DevTools控制台中执行javascript。我发现打开DevTools后立即禁用javascript就足够了,像这样:
Command+Option+J
(Mac)或Control+Shift+J
(Windows,Linux)Cmd+Shift+P
(Mac)或Ctrl+Shift+P
(Windows,Linux)dis
并点击return
以选择 Disable Javascript (禁用Javascript)选项。ena
并按return
(选择 Enable Javascript 选项)来重新启用javascript 当然,此方法对监视恶意代码没有用,因为在禁用javascript时没有代码在运行。但是至少它可能使您有机会在重新启用JavaScript之前设置breakpoints。
可能可以使用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)
您可以尝试这样的事情:
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;
这似乎阻止警报显示给我。我使用_extend
中的Underscore功能。我不知道我是否只是在玩弄错过任何东西。
对于__defineGetter__
,这已被弃用,因此您希望不要使用此功能。