JavaScript奇淫技巧:反调试
【资料图】
本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试、动态分析自己的代码。
代码:
var c = new RegExp ("1");
c.toString = function () {
alert("检测到调试")
}
console.log (c);
原理:
当console.log输出调试信息时,会将非字符串类型数据转成字符串,于是通过接管toString函数,判断是否有这样的行为,而如果没有打开调试窗口,即不会有console.log输出,从而识别是否于处调试状态。
运行效果:
代码:
var startTime = new Date ();
debugger;
var endTime = new Date ();
var isDev = endTime-startTime> 100;
if (isDev){
alert("检测到调试")
}
原理:
在代码不同语句间加入debuger指令,debugger会使调试模式暂停,那么暂停将造成延迟。
通过检测延迟前后果的时间值,从而判断是否发生了延时,如果发生,则表达处于调试状态。
运行效果:
debugger触发暂停:
检测到调试:
反调试手段
检测到调试又该如何呢?
一般情况下,可以用无限循环的debugger,使不停的暂停代码执行,使调试无法进行。
如:
var c = new RegExp ("1");
c.toString = function () {
alert("检测到调试")
setInterval(function(){
debugger
},1000);
}
console.log (c);
运行效果:
debugger方法虽然效果不错,但太过直观,反制效果也过去温柔。
另有一种“内存耗尽”的方式,会更隐藏、更强大,如:
var startTime = new Date ();
debugger;
var endTime = new Date ();
var isDev = endTime-startTime> 100;
var stack = [];
if (isDev){
while(true){
stack.push(this);
console.log(stack.length,this)
}
}
运行效果:
代码运行造成的内存占用会越来越大,很快会使浏览器崩溃,如下图:
上述几种方法,已经达到了反调试的效果,但如果他人查看代码,也可能被找出检测功能并删去。
为了防止反调试功能被剔除,我们可以对JS代码进行混淆加密。
例如本文第一段代码:
var c = new RegExp ("1");
c.toString = function () {
alert("检测到调试")
}
console.log (c);
代码功能很清晰,使用JShaman进行混淆加密:
JShaman是专业且强力的JS代码混淆加密工具
混淆加密后的代码,将成为:
var _0x98ac=["117.","56.","26825.27970.21049.35850.35804."];function _0x(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i
这样的代码,将很难理解其功能,也就可以防止代码被修改。
其它的JS功能代码,同样可以使用JShaman进行混淆加密,最终使用混淆加密后的安全代码。