[英]Avoid the detection of “whether Chrome DevTools(console) is open”
今天我看到这篇文章找出Chrome控制台是否打开。
@zswang 提供了检测 Chrome DevTools(console) 是否打开的方法。 那真是让我吃惊,然后我开始思考有没有办法绕过这种检测技术?
有两种方法可以检测 chrome DevTools 是否打开(详细信息在上面的帖子中)
使用Object.defineProperty
我可以绕过这个,它可以分配给另一个函数。我试过Object.defineProperty=null
,然后检测函数死了(我知道写一个模拟函数更好,这里只是一个例子)
使用obj.__defineGetter__
( Object.prototype.__defineGetter__
)
Object.prototype.__defineGetter__= null
不会破坏检测,怎么走?
最后不得不说我不喜欢被监控,希望有合适的走走方式。
有很多方法可以检测 DevTools 的使用情况,因此很难将它们全部屏蔽。 随着 DevTools 获得新功能,有新方法可以检测其使用情况。 不能信任任何阻止检测的第三方工具来阻止 100% 的检测技术。
向 Chromium 团队报告了一个关于将检测阻止直接集成到 Chrome 的想法的错误。
明确阻止对 DevTools 使用进行任何检测的唯一方法是禁用 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
键选择禁用 Javascript选项。ena
并按return
(选择“启用 Javascript”选项)来重新启用 javascript当然,这种方法对于监控恶意代码是没有用的,因为禁用javascript时没有代码在运行。 但至少它可以让您有机会在重新启用 javascript 之前设置断点。
可以使用Chrome DevTools 协议连接到单独的 Chrome 实例并检查网站,而无需在该实例中打开 DevTools:
开发者工具前端可以附加到远程运行的 Chrome 实例进行调试。 要使此方案正常运行,您应该使用 remote-debugging-port 命令行开关启动您的主机 Chrome 实例:
chrome.exe --remote-debugging-port=9222
然后,您可以使用不同的用户配置文件启动一个单独的客户端 Chrome 实例:
chrome.exe --user-data-dir=<some directory>
现在,您可以从客户端导航到给定端口并附加到任何发现的选项卡以进行调试: http://localhost:9222
最流行的检测开发工具是否打开的方法涉及调用 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 是否打开。
对我来说,我只是在违规脚本的顶部添加了一个断点,然后在开发人员控制台中运行Image = null
。
我通过谷歌搜索网站如何做到这一点找到了这个解决方案,这给我带来了这个 stackoverflow 帖子,我可以在我的控制台中看到一个新的 Image 正在被记录,因此将 Image 设置为 null 会导致错误,从而导致检测失败。
你可以尝试这样的事情:
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);
<script src="http://underscorejs.org/underscore-min.js"></script>
这似乎阻止了警报显示给我。 我使用的_extend
从功能下划线。 我不知道我是否错过了什么,只是在玩。
至于__defineGetter__
,它已被弃用,因此您希望不要使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.