高级语法:“0 [constructor] [constructor]()()” - 如何评估代码?

时间:2013-09-05 11:42:57

标签: javascript obfuscation

在代码混淆算法中,我看到使用这种语法的一步:

0["constructor"]["constructor"](
    0["constructor"]["constructor"](
        "return \"alert()\""
    )();
)();

我对javascript的了解不再帮助我......

typeof 0                               => number
typeof 0["constructor"]                => function
typeof 0["constructor"]["constructor"] => function  

请您解释 js口译人员如何“处理”此代码? 我无法理解它的工作方式!

并且:结尾“()”是什么意思?我无法理解语法

我尝试使用firebug js console

执行

0["constructor"]["constructor"](
    "return \"alert()\""
)();

控制台输出"alert()",(带双引号)

我认为它相当于一个评估,但事实并非如此。运行这个:

eval( "return \"alert()\"" );

只会导致SyntaxError: return not in function

执行此问题的第一个片段完全等同于简单地执行alert(),因此我理解内部代码认为文本就像一个函数体并执行它,所以内部正在返回"alert()";外部读取最后一个字符串并认为它是一个函数体,因此执行代码,结果就是触发警报。

但是,我再说一遍。 语法是什么意思?最后对“()”有用的是什么?

0["constructor"]["constructor"](
    "some code to be evaluted"
)();

1 个答案:

答案 0 :(得分:3)

此代码正在查找Function constructor,调用它来创建一个新函数,并将参数作为函数体的代码,然后立即调用该函数:

Function("Some code to be evaluated")()

它执行两次,一次使用String文字"return \"alert()\"",然后使用第一个函数中的return值作为第二个函数的主体。

var result = Function("Some code to be evaluated")()
Function(result)()

并且Function来自Number,然后来自0的{​​{1}}来获得Function

Number