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
以外没有其他数字,所以我需要利用一些只有名字中可用字符的方法。
可用的字符可以从现有的关键字和字符串表示中获得,也就是从NaN
, null
, undefined
, Infinity
, true
, false
和"[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
秒的部分等等。