JavaScript:反调试——绕过反调试

JavaScript:反调试——绕过反调试

本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试、动态分析自己的代码。

检测调试,方法一:用console.log检测

代码:

var c = new RegExp ("1");

c.toString = function () {

alert("检测到调试")

}

console.log (c);

原理:

当console.log输出调试信息时,会将非字符串类型数据转成字符串,于是通过接管toString函数,判断是否有这样的行为,而如果没有打开调试窗口,即不会有console.log输出,从而识别是否于处调试状态。

运行效果:

解决方法:静止js调用底层函数

检测调试,方法二、通过代码执行时间检测

代码:

var startTime = new Date ();

debugger;

var endTime = new Date ();

var isDev = endTime-startTime> 100;

if (isDev){

alert("检测到调试")

}

原理:

在代码不同语句间加入debuger指令,debugger会使调试模式暂停,那么暂停将造成延迟。

通过检测延迟前后果的时间值,从而判断是否发生了延时,如果发生,则表达处于调试状态。

运行效果:

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代码加密

上述几种方法,已经达到了反调试的效果,但如果他人查看代码,也可能被找出检测功能并删去。

为了防止反调试功能被剔除,我们可以对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<k.length-1;i++){str2+=String.fromCharCode(k[i]^dy_key);}return str2;}function _0xb346gb(vm_opcode){var _array="3|2|1|4|0".split(_0x(_0x98ac[0])),_index=0;while(!![]){switch(+_array[_index++]){case 0:while(ip<vm_opcode.length){ip++;switch(vm_opcode[ip]){case op.push:{ip++;stack.push(vm_opcode[ip]);sp++;break;}case op.add:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s+h;}(op_1,op_2);stack.push(value);sp++;break;}case op.sub:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s-h;}(op_1,op_2);stack.push(value);sp++;break;}case op.mul:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s*h;}(op_1,op_2);stack.push(value);sp++;break;}case op.div:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s/h;}(op_1,op_2);stack.push(value);sp++;break;}case op.xor:{var op_1=stack[sp-1];var op_2=stack[sp];var value=function(s,h){return s^h;}(op_1,op_2);stack.push(value);sp++;break;}case op.pop:{return stack[sp];}}}continue;case 1:var ip=-1;continue;case 2:var stack=[];continue;case 3:var op={push:32,add:33,sub:34,mul:35,div:36,pop:37,xor:38};continue;case 4:var sp=-1;continue;}break;}}var _0x97b=function(s,h){return s+h;}(_0xb346gb([32,674032,32,674037,38,37]),_0xb346gb([32,651374,32,651368,38,37]));var c=new RegExp(_0x(_0x98ac[1]));_0x97b=function(){return _0xb346gb([32,686171,32,686171,38,37]);}();c['\x74\x6f\x53\x74\x72\x69\x6e\x67']=function(){alert(_0x(_0x98ac[2]));};console['\x6c\x6f\x67'](c);

这样的代码,将很难理解其功能,也就可以防止代码被修改。

其它的JS功能代码,同样可以使用JShaman进行混淆加密,最终使用混淆加密后的安全代码。

解决方法:找到混淆和加密需要的搞清楚,复原即可

反调试手段还有很多种如禁用右键、禁用f12、判断内高度从而得知开发者工具是否开启等等

解决方法:可以把开发者工具设置成单独窗口、

作为笔记使用

引用链接:百度安全验证

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JS混淆压缩工具是一种用于还原经过混淆压缩处理的JavaScript代码的工具。JavaScript代码经过混淆压缩处理后,变量名、函数名和代码结构都被改变,使得代码变得难以阅读和理解。 混淆是指通过逆向工程的方法,还原被混淆处理的代码。这样可以使开发人员更容易理解代码逻辑和修改代码,也有助于安全研究人员分析代码漏洞。 压缩是指将经过压缩处理的代码还原为可读性更好的形式。在代码压缩过程中,会删除空格、缩进、注释等,同时对代码进行重写以减少文件大小。压缩工具可以还原代码结构,使之恢复为可读性更好的形式。 JS混淆压缩工具一般通过解析和重构混淆压缩后的代码来实现。它们可以自动还原变量名、函数名,修复语法错误,还原代码结构,保留注释等。常见的混淆压缩工具有UglifyJS、Terser、Babel等。 但是需要注意的是,即使使用了混淆压缩工具,完全还原出原始代码可能是不太可能的。因为混淆压缩过程中可能还进行了其他特殊处理,如删除无用代码代码优化等。此外,混淆压缩工具只适用于用于学习和分析代码,不应用于非法用途,以保护代码作者的合法权益。 ### 回答2: JS混淆压缩工具是一种用于还原经过混淆和压缩处理的JavaScript代码的工具。由于混淆和压缩会使代码变得难以阅读和理解,而且容易隐藏恶意代码,因此混淆压缩工具对于安全性和代码维护性非常重要。 JS混淆工具的主要功能是将经过混淆处理的代码还原为易读的形式。它可以根据一些特定的识别规则,识别和还原变量名、函数名等混淆后的标识符。通过混淆,我们可以更容易地理解代码的逻辑和结构,提高代码的可维护性和可读性。 JS压缩工具的主要功能是将经过压缩处理的代码还原为格式化的形式。它可以自动添加换行、缩进和空格等,使得代码更易于阅读和编辑。压缩可以帮助开发人员更方便地调试和修改代码,提高开发效率。 目前,有许多JS混淆压缩工具可供使用。一些流行的工具包括:UglifyJS、Terser、JSNice等。这些工具具有各自的特点和功能,可以根据具体需求选择合适的工具使用。 总之,JS混淆压缩工具对于提高代码安全性、可读性和可维护性具有重要作用。通过使用这些工具,开发人员可以更方便地理解、调试和修改代码,从而提高开发效率和代码质量。 ### 回答3: JS混淆和压缩是用于还原经过混淆和压缩的Javascript代码的工具。混淆和压缩是为了减小代码体积和加强代码防护而进行的操作,但也给代码的阅读和理解带来了困难。 JS混淆工具主要通过对混淆后的变量、函数名、属性名进行逆向推算,还原出其原有的可读性较高的标识符。这种工具一般基于静态分析和语义分析的技术,通过模式匹配、代码流分析和控制流分析等方法,逆推原始代码的标识符,从而提高代码的可读性。 JS压缩工具主要是针对通过压缩工具对代码进行了无损压缩的情况,还原出原始的格式和布局。这种工具通过识别特定的压缩技术(如代码变量替换、代码优化、多行合并等),并对其进行向操作,还原出原始的代码结构和格式。 总之,JS混淆和压缩工具的目的是为了提高代码的可读性和可维护性,方便开发人员阅读和理解代码,同时也有助于代码审计和漏洞发现。但需要注意的是,使用这些工具应遵守相关法律法规,不用于非法用途,以保护代码的合法性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值