已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > 其他编程语言 > 讨论/求助

标题: [精]Chrome通过断点方式,禁止F12调试的原理是什么?

作者: @Ta

时间: 2020-02-18

点击: 8667

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

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

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

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

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

@老虎会游泳@大神

红米Note7 高配版(黑色)


[隐藏样式|查看源码]


『回复列表(11|隐藏机器人聊天)』

1.

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

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

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

(/@Ta/2020-02-18 14:38//)

2.

Yander路过。。。


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

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

(/@Ta/2020-02-18 14:56//)

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

4.

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

(/@Ta/2020-02-18 16:35//)

5.

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

(/@Ta/2020-02-19 10:20//)

6.

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

(/@Ta/2020-02-19 18:27//)

7.

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

不受欢迎广告 已被管理员和谐

(/@Ta/2020-02-19 18:41//)

8.

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

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

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

(/@Ta/2020-02-21 05:06//)

9.

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

所以,只要浏览器还在用户的控制之下,只要像火狐、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/2020-02-21 05:42//)

10.

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

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

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

(/@Ta/2020-02-21 05:53//)

11.

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

(/@Ta/2020-02-21 07:31//)

回复需要登录

9月16日 09:32 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1