1

在代码混淆器算法中,我看到了使用以下语法的一个步骤:

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

我的javascript知识不再帮助我......

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

请问,你能解释一下js解释器是做什么来“处理”这段代码的吗?我无法理解它可以以哪种方式工作!

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

我试图玩萤火虫 js 控制台

执行

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

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

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

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

只是导致一个SyntaxError: return not in function.

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

但是,我重复一遍。它的语法是什么意思?最后的“()”有什么用?

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

1 回答 1

3

这段代码正在寻找Function构造函数,调用它以创建一个新函数,并将参数作为函数体的代码,然后立即调用该函数:

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

它这样做了两次,一次使用String文字"return \"alert()\"",然后再次使用第一个函数的return值作为第二个函数的主体。

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

并且,它是从Function的第一个发现,然后是从:Number0FunctionNumber

console.log(0["constructor"] === Number); // true
console.log(Number["constructor"] === Function); // true
于 2013-09-05T11:48:06.903 回答