检测"检查元素"何时打开

Gal*_*ala 37 javascript

Samy Kamkar的网站http://samy.pl知道控制台何时打开,并在打开时擦除源/控制台.

在此输入图像描述

这是如何运作的?

kev*_*ner 45

这需要一些挖掘.samy.pl在此代码之上有几个级别的间接和混淆.它使用与JohanP发现的GitHub存储库不同的检测代码版本.与GitHub存储库不同,samy.pl中的代码可以在未停靠时检测到devtools.

它通过使用一个短脚本执行此操作,该脚本根据devtools是打开还是关闭而执行不同.

示例脚本

这是一个独立的例子; 在浏览器中打开它,注意输出在打开和关闭devtools时是如何变化的(无论是否停靠):

<!DOCTYPE html>
<html>
    <body>
        <pre id="output"></pre>
        <script type="text/javascript">
            var element = new Image;
            var devtoolsOpen = false;
            element.__defineGetter__("id", function() {
                devtoolsOpen = true; // This only executes when devtools is open.
            });
            setInterval(function() {
                devtoolsOpen = false;
                console.log(element);
                document.getElementById('output').innerHTML += (devtoolsOpen ? "dev tools is open\n" : "dev tools is closed\n");
            }, 1000);
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

setInterval每秒执行一次.console.log始终执行,无论devtools是打开还是关闭:console始终定义对象.但是,该log方法仅在devtools打开时将输出写入控制台.如果关闭devtools,那console.log就是无操作.这是让您检测devtools是否打开的关键:检测日志操作是否为无操作.

在写入element控制台的过程中,它获取元素的id.这称为附带的功能__defineGetter__.因此,console.log(element)只有在devtools打开且console.log不是no-op 时才会运行的调用.该函数中设置了该标志,每秒为我们提供一个devtools状态的更新视图.

samy.pl使用一些额外的技巧来隐藏它:控制台也每秒都被清除,并且这个代码用空格(!)编码进行混淆.

  • @Jake混淆本身就是一个答案!包含此检测的源代码通过将每个字符转换为其ASCII字符代码的二进制表示来编码(例如'A'=='1000001'); 然后将每个0转换为空格,将1转换为制表符.那个空格字符串被转换回二进制,然后是HTML,并用这个JS执行(其中`s`是空格的字符串):`s.replace(/.{7}/g,function(w){document. write(String.fromCharCode(parseInt(w.replace(//g,'0').replace(//g,'1'),2)))})`. (7认同)
  • @Jake我没有看看load.js,但是从samy.pl的服务中找到了这个.设置执行前断点(在Chrome devtools中,通过Sources选项卡> Event Listener Breakpoints> Script> Script First Statement)让我逐步执行代码,这是最有价值的.这包括解码和混淆代码,并让我有机会干扰或阻止其中的一些. (3认同)
  • 这真的很酷,只需要弄清楚如何打败它:)抱歉萨米.要打败它,键入`console.log = function(){}`,浏览器将重新加载,然后快速按下并输入再次运行,您可以看到源.http://imgur.com/a/1dBPn (3认同)
  • 我们是否应该编写Chrome/Chromium错误报告以防止此行为?如果有人知道我有这个开放的话,我有点不喜欢. (2认同)