比如这个网站:http://music.ghpym.com/
通过断点,然后禁止别人F12调试:
我倒不是想用它的接口还是神马的,
仅仅想找到方法,在我自己的代码上添加此类禁止调试。
有谁知道原理吗?百度了几圈,可能我百度的关键词没对。
红米Note7 高配版(黑色)
Yander路过。。。
菩提本无树,明镜亦非台。
本来无一物,何处惹尘埃!
ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ฏ้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้۩͇̿v͇̿i͇̿p͇̿۩
華為P30 (Pro版)-(金色)
debugger
红米Note4超高配版(银色)
这个,可以把鼠标移到网址栏,点成输入状态,再按f12就可以调试了
@无道,@乄杺,如果点击右上角的“禁用断点”按钮也搞不定的话,只要在“调用栈”里右击暂停的位置,然后点击“黑箱化源代码”,再刷新页面,就可以继续利用F12控制台的其他功能(比如网络嗅探)了。不过被黑箱的代码片段或函数可能会变得不可调试。但其他部分应该依然可以调试。
火狐除了利用右键菜单,还可以点击左下角的眼睛图标快速黑箱源代码。
就楼主这个页面来说,Chrome和火狐都可以点击右上角的“禁用断点”按钮搞定(让按钮变蓝再刷新页面就可以),不需要黑箱化源代码。不过,黑箱化源代码应该是这个问题的终极解决方案了,它让相关代码完全不通过调试器,这样这些代码也就不可能感知到调试器的存在。当然,这也反过来限制了我们对相关代码进行调试,达到了作者保护代码逻辑的目的。
如果真的要调试这样的“调试器感知”代码,你需要在暂停后修改代码,改变代码逻辑或者相关变量,让代码认为自己没有进入过调试器。实际上,让代码陷入“调试器暂停”这个操作本身就是一把双刃剑。它可能可以给非专业人士使用控制台的其他功能带来麻烦。但是对于专业人士来说,你自己主动暂停了,那控制权就完全交到了我们手上,你代码下一步怎么走还不是我们说了算?
所以,只要浏览器还在用户的控制之下,只要像火狐、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\x65
是Date
(解码方法很简单,在控制台输入"\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
函数不就可以了。这里把它替换为空函数,这样后续检测时就什么也不会发生了。
注意上述代码只适用于这一个页面。其他页面需要根据检测逻辑进行对应的修改,但是基本思路就是这样。
不过对于不需要调试代码的用户来说,禁用断点和黑箱化源代码显然更容易操作。所以推荐优先使用。
找到了,果然百度还是不靠谱,谷歌一下就找到了。
https://blog.csdn.net/zzgzzg00/article/details/79504827
https://segmentfault.com/a/1190000012359015
红米Note7 高配版(黑色)