如何解决Javascript自卫如何工作,如何在美化后进入无限循环?
有一个网站“ obfuscator.io”,用于混淆Javascript代码。它的功能之一是“自卫”。它将简单的console.log()
行变成这样:
var _0x2a3a06=function(){var _0x409993=!![];return function(_0xe0f537,_0x527a96){var _0x430fdb=_0x409993?function(){if(_0x527a96){var _0x154d06=_0x527a96['apply'](_0xe0f537,arguments);_0x527a96=null;return _0x154d06;}}:function(){};_0x409993=![];return _0x430fdb;};}();var _0x165132=_0x2a3a06(this,function(){var _0x46b23c=function(){var _0x4c0e23=_0x46b23c['constructor']('return\x20/\x22\x20+\x20this\x20+\x20\x22/')()['constructor']('^([^\x20]+(\x20+[^\x20]+)+)+[^\x20]}');return!_0x4c0e23['test'](_0x165132);};return _0x46b23c();});_0x165132();console['log']();
该代码确实可以在Webkit控制台中工作,但是当您使用“ beautifier.io”或“ de4js”之类的应用程序对其进行美化并再次在同一控制台中运行时,该代码将进入无限循环,从而实质上破坏了代码。这是如何运作的?它与美化程序的工作方式或Javascript解释代码的方式有关吗?
解决方法
像以前一样通过美化程序运行代码,然后应用一些基本变量重命名和取消转义,将产生以下代码:
var makeRun = function() {
var firstMakeRun = true;
return function(global,callback) {
var run = firstMakeRun ? function() {
if (callback) {
var result = callback['apply'](global,arguments);
callback = null;
return result;
}
} : function() {};
firstMakeRun = false;
return run;
};
}();
var run = makeRun(this,function() {
var fluff = function() {
var regex = fluff['constructor']('return /" + this + "/')()['constructor']('^([^ ]+( +[^ ]+)+)+[^ ]}');
return !regex['test'](run);
};
return fluff();
});
run();
console['log']()
重要的部分是它针对/^([^ ]+( +[^ ]+)+)+[^ ]}/
函数本身测试正则表达式run
,并执行隐式run.toString()
。
现在无限循环在哪里?没有,但是应用于包含很多空格的字符串的正则表达式确实表现出catastrophic backtracking。尝试运行用制表符而不是空格缩进的代码,它会很好地起作用-只要您的run
函数彼此之间不包含多个空格并且在结束符之前没有空格,则正则表达式将匹配}
。
例如,它可以调用某些函数对象的.toString()方法,因此,如果以某种方式对其进行了重构,则输出将不相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。