JavaScript 反控制台调试

一、开发者工具检测(Chrome)

这项技术利用的是div元素中的id属性,当div元素被发送至控制台(例如console.log(div))时,浏览器会自动尝试获取其中的元素id。如果代码在调用了console.log之后又调用了getter方法,说明控制台当前正在运行。

  1. let div = document.createElement(‘div’);
  2. let loop = setInterval(() => {
  3.   console.log(div);
  4.   console.clear();
  5. });
  6. Object.defineProperty(div,“id”, {get: () => {
  7.   clearInterval(loop);
  8.   alert(“开发者工具正在运行”);
  9. }});

 

二、基于时间差异调试检测

当脚本在DevTools等工具环境下执行时,运行速度会非常慢(时间久),所以我们就可以根据运行时间来判断脚本当前是否正在被调试。比如说,我们可以通过测量代码中两个设置点之间的运行时间,然后用这个值作为参考,如果运行时间超过这个值,说明脚本当前在调试器中运行。

  1. set Interval(function(){
  2.  var startTime = performance.now(), check,diff;
  3.  for (check = 0; check < 1000; check++){
  4.   console.log(check);
  5.   console.clear();
  6.  }
  7.  diff = performance.now() – startTime;
  8.  if (diff > 200){
  9.   alert(“正在调试”);
  10.  }
  11. },500);

 

三、阻止调试

通过debugger阻止非法用户调试代码,让其陷入死循环,混淆更佳。

  1. !function test(){
  2.   // 捕获异常,递归次数过多调试工具会抛出异常。  
  3.   try { !
  4.       function cir(i) {
  5.           // 当打开调试工具后,抛出异常,setTimeout执行test无参数,此时i == NaN,(“” + i / i).length == 3  
  6.           // debugger设置断点  
  7.           (1 !== (“” + i / i).length || 0 === i) &&
  8.           function() {}.constructor(“debugger”)(),
  9.           cir(++i);
  10.       } (0)
  11.   } catch(e) {
  12.       setTimeout(test, 500)
  13.   }
  14. }()

本文链接地址: JavaScript 反控制台调试

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注