什么是JavaScript的内置字符串?

Jas*_*ske 147 javascript obfuscation

这个问题很难在问题标题中总结出来

UPDATE 我创建了构建一个模糊的字符串基于从这个问题中提取的字母输入您的的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]
Run Code Online (Sandbox Code Playgroud)

很抱歉破坏了惊喜但是当评估它时会返回:

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Run Code Online (Sandbox Code Playgroud)

分解时的工作方式是生成一系列消息并从中拉出字母(使用"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"
Run Code Online (Sandbox Code Playgroud)

生成的其他字符串包括:

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

我有兴趣找到"n"和"["的替代品,并想出了这个:

String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Run Code Online (Sandbox Code Playgroud)

我觉得使用1和0的精神,但违反了原始代码的一个更优雅的方面,即与字符串完全无关的外观.有没有其他人知道如何生成与原始混淆代码保持一致的"v"?

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

Firefox返回"I lone you"因为这行:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
Run Code Online (Sandbox Code Playgroud)

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

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Run Code Online (Sandbox Code Playgroud)

评估如下:

"function test() {
    [native code]
}"
Run Code Online (Sandbox Code Playgroud)

看起来我们可能有"V"!

Chrome返回"我爱你",因为相同的代码会返回:

"function test() { [native code] }"
Run Code Online (Sandbox Code Playgroud)

问题是关闭与"真正的编程问题"可疑连接之前,我想我会添加一个概括的解决方案,建立在@ SUPR的,@科里@ 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])
Run Code Online (Sandbox Code Playgroud)

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

Vis*_*ioN 83

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

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

可用字符可以从现有的关键字和字符串表示,从我们不得不一开始就获得的,即NaN,null,undefined,Infinity,true,false,和"[object Object]".其中一些可以很容易地转换为字符串,例如1/!1+[]"Infinity".

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

/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]]
Run Code Online (Sandbox Code Playgroud)

如前所述,这段代码在Chrome中评估为:

function test() { [native code] }
Run Code Online (Sandbox Code Playgroud)

在Firefox中:

function test() {
    [native code]
}
Run Code Online (Sandbox Code Playgroud)

在IE中:

 function test() {     [native code] }  
Run Code Online (Sandbox Code Playgroud)

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

因此,当你清楚地看到,我的代码渐渐从呈现的字符串,它在Chrome是24字符"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]
Run Code Online (Sandbox Code Playgroud)

但是,为了激发读者的兴趣,我不会为此提供解决方案.老实说,我相信你会很容易理解它是如何工作的......有些人甚至可以用跨浏览器的方式惊喜他们心爱的人;)

PS 又一个混淆器

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

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

  • "构造函数"......哇,这太棒了,你保持完美的矩形与有效的换行符.你很好 (4认同)

Sup*_*upr 26

为什么不native code使用这个问题?这个'v'在Chrome和Firefox中都有:

([]+/-/[(!!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]
Run Code Online (Sandbox Code Playgroud)

编辑以支持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)]
Run Code Online (Sandbox Code Playgroud)

读:

[
    //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)
]
Run Code Online (Sandbox Code Playgroud)


Cᴏʀ*_*ᴏʀʏ 8

这是我能得到的尽可能接近,不幸的是,它通过调用以下内容违反了原始混淆的惯例unescape():

unescape((/%/+[])[1]+(/1/[1]+[])[1%1]+(+!1)+(+!1)+(1e1+(11*(1-~1)<<1)))
Run Code Online (Sandbox Code Playgroud)

拆除:

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

其他想法:

  1. 不知何故 unescape("\x76")
  2. 以某种方式转换118而不调用String.fromCharCode()
  3. 从异常中获取带有"无效"字样的文本

更新:

我开始玩代码高尔夫,并且一直在缩短代码,用更多1的东西替换零件等.