function Test(){return"Test";}
var isFormat = function () {
var reg = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
return reg["test"](Test.toString());
};
console.log(isFormat());
这段代码的执行结果是true,这里需要注意,Test函数是没有进行格式化的,简单的说说这个代码的意思吧.
首先申明一个名为Test的函数,用于做格式化检测用
然后申明一个用于判断代码是否格式化的函数,判断的依据是根据正则匹配,这里的"\w+ \(\) {\w+ ['|\"].+['|\"];? }"是匹配的规则,Test.toString()是将这个函数转换成字符串的形式作为匹配的对象,test方法是进行匹配.
最后将判断的结果打印,如果没有格式化的话,就返回true,否则返回false
可能大家对这个正则表达式有点陌生,其实他就是匹配function xxx(){.......}这种形式,如果不是这种形式的话,就返回false
这里我们通过一个正则网站来形象化的理解这个表达式的含义
正则工具https://regexr-cn.com/
打开网站把表达式输入上去,要注意转义的问题
\w+ () {\w+ ['|\"].+['|\"];? }
分别把格式化和不格式化的代码放上去,结果是完全不一样的
没有格式化的代码在文本那一栏的右上角会有提示(1个结果),反之则是0结果
接下来我们讲讲如何绕过这种检测,通过hook 正则的方式绕过检测
hook代码如下
(function(){
const originalTest = RegExp.prototype.test;
RegExp.prototype.test = function(str) {
if (this.source === "\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}") {
return true; // 强制绕过检测
}
return originalTest.call(this, str);
};
})()
简单的提一嘴hook代码,首先保留原始的test方法,对test方法进行重写,判断表达式(this.source)是否为格式化检测的正则,如果是强制返回true,如果不是调用原方法返回