壹影博客.
我在下午4点钟开始想你
Js代码防格式化原理分析
  • 2023-2-14日
  • 1评论
  • 13150围观

Js防格式化原理分析

防代码格式化,又称防代码美化、selfDefending
起初,看见JShaman上有一个专门的Js防格式化的保护措施,好奇同样的代码,为什么格式化之后就运行不了了呢,在网络上查阅先关文章后发现了一些线索,分享出来供大家参考。

实验1:发现问题

直接贴没有格式化的代码

console.log("执行开始!");function t(){return t.toString().search('(((.+)+)+)+$').toString();}
a=t();console.log("执行结束!");

//代码顺利运行

上面代码可以顺利运行,但是我们将它格式化后变成如下

console.log("执行开始!");
function t(){
   return t.toString().search('(((.+)+)+)+$').toString();
}
a=t();
console.log("执行结束!");

//运行卡死!

上面代码运行卡死,只会打印,执行开始。
看上去好像没有什么变化,但是以程序员的视角换行与\n有关,此外还在代码中发现了toString()方法

初步判断,应该是(((.+)+)+)+$匹配的问题,那么我们深入研究一下

实验2:验证猜想

那么我们重新写一段代码来验证 看看是不是匹配的问题

var str_= `function t(){ console.log( t.toString().search('(((.+)+)+)+$').toString() );}`;
console.log(/(((.+)+)+)+$/.test(str_))//查看在没有格式化时正则匹配是否返回true
console.log("打印测试");

在没有格式化前匹配正常,那么我们再来看看格式化后的内容

//格式化后
var str_= `function t(){
     console.log( t.toString().search('(((.+)+)+)+$').toString() );
    }`;
console.log(/(((.+)+)+)+$/.test(str_))//查看在没有格式化时正则匹配是否返回true
console.log("打印测试");

//什么都没有打印出来直接卡死

最终得出结论:

Js中的防格式化是利用了匹配进入无限循环导致部分代码无法执行,在PC端会导致网页卡死,但如果是手机端可能会导致内存溢出闪退app的情况

应用:

明白原理后,函数toString()转字符串是个好东西,在开发中特别注意监听重写操作,额如果函数native化之后是没有办法进行保护的,Js中该操作可以配合Js变量混淆,来加密我们的代码。

延伸:

在其他的代码语言中也可以利用正则匹配以及 函数转字符串的方法来保护我们的代码

发表评论

渝ICP备19011465号 | 渝ICP备19011465号-1