whatshotChrome通过断点方式,禁止F12调试的原理是什么?

@Ta 02-18 14:33 1227点击

比如这个网站:http://music.ghpym.com/

通过断点,然后禁止别人F12调试:

我倒不是想用它的接口还是神马的,

仅仅想找到方法,在我自己的代码上添加此类禁止调试。

有谁知道原理吗?百度了几圈,可能我百度的关键词没对。

@老虎会游泳@大神

红米Note7 高配版(黑色)

回复列表(11)
  • @Ta / 02-18 14:38

    找到了,果然百度还是不靠谱,谷歌一下就找到了。

    https://blog.csdn.net/zzgzzg00/article/details/79504827

    https://segmentfault.com/a/1190000012359015
    红米Note7 高配版(黑色)

  • @Ta / 02-18 14:56

    Yander路过。。。


    菩提本无树,明镜亦非台。
    本来无一物,何处惹尘埃!

    ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้۩͇̿v͇̿i͇̿p͇̿۩
    華為P30 (Pro版)-(金色)

  • Hik
    @Ta / 02-18 15:28
    @无道@老虎會游泳,我是不会告诉你按Ctrl+F8会解除断点的,然后刷新就好了
    原来第二链接写过了呀,那打扰了打扰了
    在我看来前端的方式其实就是掩耳盗铃吧
    友链一下:https://cway.top
  • @Ta / 02-18 16:35

    @Hik,只能说能有一些用处!
    红米Note7 高配版(黑色)

  • @Ta / 02-19 10:20

    debugger
    红米Note4超高配版(银色)

  • @Ta / 02-19 18:27

    @Hik, 表示前些天国家电网遇到的禁止调试,ctrl+f8无效
    我们有着共同的敌人——天命;
    你却认命了,还对我说天命不可违‮

  • @Ta / 02-19 18:41

    这个,可以把鼠标移到网址栏,点成输入状态,再按f12就可以调试了

    专业公关发稿 万家媒体任意选

  • @Ta / 02-21 05:06

    @无道@ShadowNeuro,如果点击右上角的“禁用断点”按钮也搞不定的话,只要在“调用栈”里右击暂停的位置,然后点击“黑箱化源代码”,再刷新页面,就可以继续利用F12控制台的其他功能(比如网络嗅探)了。不过被黑箱的代码片段或函数可能会变得不可调试。但其他部分应该依然可以调试。

    火狐除了利用右键菜单,还可以点击左下角的眼睛图标快速黑箱源代码。

    就楼主这个页面来说,Chrome和火狐都可以点击右上角的“禁用断点”按钮搞定(让按钮变蓝再刷新页面就可以),不需要黑箱化源代码。不过,黑箱化源代码应该是这个问题的终极解决方案了,它让相关代码完全不通过调试器,这样这些代码也就不可能感知到调试器的存在。当然,这也反过来限制了我们对相关代码进行调试,达到了作者保护代码逻辑的目的。

  • @Ta / 02-21 05:42

    如果真的要调试这样的“调试器感知”代码,你需要在暂停后修改代码,改变代码逻辑或者相关变量,让代码认为自己没有进入过调试器。实际上,让代码陷入“调试器暂停”这个操作本身就是一把双刃剑。它可能可以给非专业人士使用控制台的其他功能带来麻烦。但是对于专业人士来说,你自己主动暂停了,那控制权就完全交到了我们手上,你代码下一步怎么走还不是我们说了算?

    所以,只要浏览器还在用户的控制之下,只要像火狐、Chromium(不是Chrome,Chrome不是完全开源的)这样完全开放源代码的浏览器还在市场上存在着,Web开发者就不可能战胜想要调试的用户。我大不了修改浏览器源代码把 debugger 关键字删掉嘛如果你搞计时检测,我还可以修改时间函数让你无法感知到调试器暂停所经过的时间(在调试器恢复之后得到的时间减去暂停所用的秒数)。只要能控制浏览器的Javascript引擎,总有方法骗过检测代码。毕竟你是在别人的Javascript引擎里运行着。

    而且大多数情况下,修改计时函数甚至不需要修改Javascript引擎,因为Javascript中的大部分对象方法都可以直接替换。所以这里提供第三个解决问题的方法:
    暂停后,切换到“控制台”选项卡,然后输入如下代码并按回车运行:

    wWADWeTEd1 = new Date('2030-01-01');
    start = function() {};

    然后按下调试器的恢复按钮,你就会发现调试保护没了,你可以随意调试其余代码了。

    原理?先看看这个调试检测代码(已美化):

    (function noDebuger() {
      function testDebuger() {
        var wWADWeTEd1 = new window["\x44\x61\x74\x65"]();
        debugger;
        if (new window["\x44\x61\x74\x65"]() - wWADWeTEd1 > 10) {
          window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x62\x6f\x64\x79"][
            "\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"
          ] =
            "\x3c\x64\x69\x76\x3e\u79c1\u6709\u63a5\u53e3\uff0c\u8bf7\u52ff\u8c03\u7528\uff1a\x68\x74\x74\x70\x73\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x68\x70\x79\x6d\x2e\x63\x6f\x6d\x3c\x2f\x64\x69\x76\x3e";
          return true;
        }
        return false;
      }
      function start() {
        while (testDebuger()) {
          testDebuger();
        }
      }
      if (!testDebuger()) {
        window["\x6f\x6e\x62\x6c\x75\x72"] = function() {
          setTimeout(function() {
            start();
          }, 500);
        };
      } else {
        start();
      }
    })();
    

    \x44\x61\x74\x65Date(解码方法很简单,在控制台输入"\x44\x61\x74\x65",就能看到输出"Date"),所以new window["\x44\x61\x74\x65"]()就是new window["Date"](),也就是new window.Date(),也就是new Date()。对象访问是数组下标访问的语法糖,并且顶层对象window可省略。

    所以,变量wWADWeTEd1中保存了上次调用new Date()时记录的时间。然后if(new window["\x44\x61\x74\x65"]()-wWADWeTEd1>10)用来判断下次计时和上次相差是否超过10毫秒,超过就说明打开了F12开发者选项(因为开发者选项打开的时候,debugger标记会让代码暂停,你点恢复的手速不会快于10毫秒)。

    那么如果wWADWeTEd1记录的时间位于未来呢?这样本次调试器检测就不会触发了。而debugger暂停刚好给了我们一个修改变量值的机会(暂停后,控制台会位于暂停处的上下文中,可以访问暂停处的局部变量)。

    但是调试器检测会一直运行,页面就会不断暂停,这很烦啊。怎么办?继续观察代码,发现 setTimeout(function(){start()},500),这就是用于反复启动调试器检测的定时器。我们不能重载setTimeout函数,否则可能会影响页面的其他功能。那怎么办呢?重载掉start函数不就可以了。这里把它替换为空函数,这样后续检测时就什么也不会发生了。

    注意上述代码只适用于这一个页面。其他页面需要根据检测逻辑进行对应的修改,但是基本思路就是这样。

    不过对于不需要调试代码的用户来说,禁用断点和黑箱化源代码显然更容易操作。所以推荐优先使用。

  • @Ta / 02-21 05:53

    @无道,哦对了,如果你想找反调试源代码,那F12打开后暂停的位置就是啊。把那段代码粘贴到你js里就可以。

    至于原理的话,我楼上已经解释过了。至于效果嘛,只能阻止没百度到我楼上方案的小白。

    “黑箱化源代码”应该没有任何办法检测,如有高手能检测到,欢迎给出DEMO。此外我也想不出能够逃过暂停时变量篡改的计时函数,加密、混淆或者保存多个变量副本只是让分析变麻烦而已,只要控制台功能一开始就可用,就没有什么能逃出用户的手掌心。

  • @Ta / 02-21 07:31

    @老虎会游泳,分析的很到位,老虎果然是高手也
    红米Note7 高配版(黑色)

添加新回复
回复需要登录

[聊天-此处没有老虎] 呆哥: 明盘域名出售页:XXS.ME