JS常见反调试
格式化检测
可以删代码,改逻辑(取反操作 !)
可以hook:
1.保存原函数` • `RegExp.prototype.test_ = RegExp.prototype.test;` • `2.替换原函数` • `RegExp.prototype.test = function(){` • `3.执行原函数` • `var a = RegExp.prototype.test_.apply(this,arguments)` • `return !a;` • `}` • `4.保护toString` • `RegExp.prototype.test.toString = RegExp.prototype.test_.toString;
如何进入VM(虚拟机)
1.eval() 执行一段文本代码 var a = eval("debugger; function xx(){return 2};xx()")
2.用大Function
过掉Function中的debugger (hook其构造函数)
Function.prototype.constructor_ = Function.prototype.constructor; • Function.prototype.constructor = function(a){ • a = a.replace("debugger",""); (对所有debugger进行全局替换) • return Function.prototype.constructor_(a); } Function.prototype.constructor.toString = Function.prototype.constructor_.toString(做保护)
禁止控制台调试
console.log = function(){} 或者一直调用clear方法,禁止了控制台的输出
可以在运行到之前保存代码
检测调试:
1.基于时间的检测
function aa() { var b = Date.now(); debugger; if(Date.now() - b > 200 ){ console.log("no") } } aa();
可以对Date.now()方法进行hook ,让其变为固定值
2.基于dom(页面)
监听F12事件
监听快捷键
Object.toString() 如果控制台输出的是对象,则保留对象的引用,每次打开开发者工具的时候都会重新调用一下对象的 toString()方法将返回结果打印到控制台(console tab)上。
监听 windows 的纵横比的变化 ( 把窗口单开即可解决 )
数据劫持:打开控制台开始检测id 执行它自己的方法
基于控制台api检测:一点F12就关闭浏览器调用了window.close(),
断点到这里进行本地替换js ,load断点有时候会重置url