JavaScript的内建字符串是什么?

这个问题很难在题目中总结

更新我创建了一个JSFiddle,它基于从这个问题中提取的字母,从输入中生成一个模糊的字符串:你可以在这里访问它,或者一个要点会更容易吗?

我最近在这个配置文件中遇到了一些模糊的JavaScript,看起来像这样:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

抱歉毁了这个惊喜,但是当它被评估时,它会返回这个:

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10

这种方式在分解时工作的方式是生成一系列消息,并将它们从中拉出来(使用“I”作为示例):

[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"

其他生成的字符串包括:

({}+[])       -> "[object Object]" (where the space comes from)
([]+!!-[])    -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[])  -> "undefined"

我有兴趣找到“n”和“[”的替代品,并提出这个问题:

String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))

我认为这是使用1和0的精神,但是违反了原始代码中更优雅的一个方面,即与字符串无关的外观。 其他人有没有想法如何生成符合原始混淆代码的“v”?

这里有一些额外的信息是在许多有才华的JavaScript程序员深入研究之后发现的

Firefox返回“我独自一人”因为这一行:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+

[1^11<<1]从这里修剪一个特定的字符:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])

其中评估如下:

"function test() {
    [native code]
}"

看起来我们可能会有我们的“V”!

Chrome返回“我爱你”,因为相同的代码返回这个:

"function test() { [native code] }"

在这个问题关闭之前,由于“一个真正的编程问题”关系不明确,我想我会添加一个建立在@Sprpr,@ Cory和@ alpha123上的概括解决方案,看看:

alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])

鉴于代码的复杂性和它产生的消息,它几乎就像JavaScript引擎告诉你有多特别:)


首先,我要感谢杰森和所有贡献者玩这个有趣的片段。 我已经写了这段代码只是为了好玩,为了将它发送给我的妻子在2月14日:)只有Chrome安装在笔记本电脑上我没有选择检查它如何在Firefox和IE中工作。 而且,我并没有真正地期望内置方法的toString()表示可能在其他浏览器中看起来不同。

现在,转向真正的问题,让我们来看看代码。 是的, "v"在这里是真正的“问题”。 除了解析[native code]字符串,我发现没有其他方法可以获取此信函,可以从任何内置方法中获取。 由于我限制自己没有字符串,除了使用1以外没有其他数字,所以我需要利用一些只有名字中可用字符的方法。

可用的字符可以从现有的关键字和字符串表示中获得,也就是从NaNnullundefinedInfinitytruefalse"[object Object]" 。 其中一些可以很容易地转换为字符串,例如1/!1+[]给出"Infinity"

我已经分析了数组[] ,对象{} ,正则表达式/(?:)/ ,数字1.1 ,字符串"1"不同内置方法,并发现了名为test()RegExp对象的一个​​漂亮方法。 它的名字可以从所有可用的字符组合而来,例如"t""e"来自true ,而"s"来自false 。 我已经创建了一个字符串"test"并使用正则表达式/-/正方括号表示法来解决此问题,该行在这一行中正确标识:

/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]]

正如已经讨论的那样,这段代码在Chrome中被评估为:

function test() { [native code] }

在Firefox中为:

function test() {
    [native code]
}

并在IE中作为:

 function test() {     [native code] }  

(后者特别注意function关键字前的空格)

所以,正如你清楚地看到的,我的代码是从显示的字符串中获得第24个字符,在Chrome中是"v" (按计划),但不幸在Firefox和IE中分别是"n""["

为了在所有浏览器中输出相同的结果,我采用了不同于其他答案中所示的方法。 现在修改后的版本如下所示:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+/[[^1]+]/[([]+![])[1<<1<<
1]+(/|/[(1+{})[1+11>>>1]+[[]+{}][+!1][1]+([]+1/[])[1<<1>>1]
+([1<1]+[])[1+11>>>1+1]+[[!!1]+1][+[]][1-1]+([]+!!/!/)[1|1]
+(/1/[1]+[])[!1%1]+(-{}+{})[-1+1e1-1]+(1+[!!1])[1]+([]+1+{}
)[1<<1]+[!!/!!/+[]][+[]][1&1]]+/=/)[1e1+(1<<1|1)+(([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[1^1]==+!1)]+(!![]+{})[1|1<<1]+[1+{}+1][!1+!1][(11>>1)+1
]](([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+
(!!1+[])[1^1]]))[1&.1][11>>>1]+([,][~1]+[])[1-~1]+[[]+{}][!
1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[]
,[]+{}][1<<1>>>1][1||1]+(/[<+>]/[1&1|1]+[1.1])[1/11.1&1.11]

然而,为了吸引读者,我不会为此提供解决方案。 我真的相信你会很容易理解它是如何工作的......有些甚至可以通过跨浏览器的方式让他们心爱的人感到惊讶;)

PS还有另一个混淆器

受Jason创建一个通用混淆工具的想法的启发,我又写了一个。 你可以在JSBin找到它:http://jsbin.com/amecoq/2 。 它可以混淆包含数字[0-9] ,小拉丁字母[az]和空格的任何文本。 字符串长度主要受限于你的RAM(至少我的回答正文被成功混淆了)。 Chrome,Firefox和IE支持该输出。

提示:该工具使用了与上面介绍的不同的混淆方法。


为什么不使用问题的native code位? 这一个在Chrome和Firefox中都给出了'v'

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]>([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]?([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]

编辑以支持IE并在没有三元运算符的情况下执行操作:此工程适用于Chrome,IE和FF。 构建一个数组并使用==来确定浏览器。

[([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]

读:

[
    //ie
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],
    //ch
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],
    //ff
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]
]
[
    //ch?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+
    //ff?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)
]

这与我所能得到的差不多,不幸的是,它通过调用unescape()来违反原始混淆的约定:

unescape((/%/+[])[1]+(/1/[1]+[])[1%1]+(+!1)+(+!1)+(1e1+(11*(1-~1)<<1)))

拆除:

(/%/+[])[1]          => "%"
(/1/[1]+[])[1%1]     => "u"
(+!1)                => "0"
(+!1)                => "0"
(1e1+(11*(1-~1)<<1)) => "76"
===========================
unescape("%u0076")   => "v"

其他想法:

  • 以某种方式得到unescape("x76")
  • 以某种方式转换118而不调用String.fromCharCode()
  • 从异常中获取文字,其中包含单词“无效”
  • 更新:

    我开始打代码高尔夫球,并且缩短了比赛时间,更换了更多1秒的部分等等。

    链接地址: http://www.djcxy.com/p/48057.html

    上一篇: What are JavaScript's builtin strings?

    下一篇: Why +[] or +"" equal to 0 in javascript