一、开发者工具检测(Chrome)
这项技术利用的是div元素中的id属性,当div元素被发送至控制台(例如console.log(div))时,浏览器会自动尝试获取其中的元素id。如果代码在调用了console.log之后又调用了getter方法,说明控制台当前正在运行。
- let div = document.createElement(‘div’);
- let loop = setInterval(() => {
- console.log(div);
- console.clear();
- });
- Object.defineProperty(div,“id”, {get: () => {
- clearInterval(loop);
- alert(“开发者工具正在运行”);
- }});
二、基于时间差异调试检测
当脚本在DevTools等工具环境下执行时,运行速度会非常慢(时间久),所以我们就可以根据运行时间来判断脚本当前是否正在被调试。比如说,我们可以通过测量代码中两个设置点之间的运行时间,然后用这个值作为参考,如果运行时间超过这个值,说明脚本当前在调试器中运行。
- set Interval(function(){
- var startTime = performance.now(), check,diff;
- for (check = 0; check < 1000; check++){
- console.log(check);
- console.clear();
- }
- diff = performance.now() – startTime;
- if (diff > 200){
- alert(“正在调试”);
- }
- },500);
三、阻止调试
通过debugger阻止非法用户调试代码,让其陷入死循环,混淆更佳。
- !function test(){
- // 捕获异常,递归次数过多调试工具会抛出异常。
- try { !
- function cir(i) {
- // 当打开调试工具后,抛出异常,setTimeout执行test无参数,此时i == NaN,(“” + i / i).length == 3
- // debugger设置断点
- (1 !== (“” + i / i).length || 0 === i) &&
- function() {}.constructor(“debugger”)(),
- cir(++i);
- } (0)
- } catch(e) {
- setTimeout(test, 500)
- }
- }()
本文链接地址: JavaScript 反控制台调试