如何在JavaScript中没有字符或数字说“爱”?

时间:2011-02-15 08:57:22

标签: javascript obfuscation

灵感来自Ryan Barnett的BlackHat DC 2011 PPT,特别是下面的代码:

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ [_+~$]+$_[_]+$$](_/_)

昨天是恋人的特殊日子,所以我试着写一些类似的东西。这基本上警告“我爱你”没有任何字符或数字。

e.g。 “我”可以从((_=-~[])/--_+[])[_]

获得

我们要使用“[object Object]”,“true”,“false”,“NaN”,“Infinity”,我无法想办法以这种方式获得“v”。

我试着想到String.fromCharCode(),(Ryan已经为我们提供window参考,所以从理论上讲,我们可以window["String"]["fromCharCode"](118)但是我想念“S”和“C”字符这里。再想想window["eval"](...),我也没有“v”。

尝试解释一下,[]为空,当应用+/-/~操作时,它转换为数字0~[]给出{{1} },1给出1/0。然后它来到Infinitey,它们都将转换为添加的字符串,这将提供1/0 + []"Infinity" ...

Ryan的原始代码更复杂,它使用了更多,包括范围,特殊返回值等(这是另一个故事)

这似乎不是一件好事,但是非常有趣。

在meze的帮助下,我能够为Firefox制作这个:

"Infinity"[_] == "Infinity"[0] == "I"

它基本上是($=($=[$=[]][(__=!$+$)[_=-~-~-~$]+(_$={}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])())[__[_/_]+__ [_+~$]+$_[_]+$$]((_$_=(__$=-~[])/--__$+[])[__$]+_$[_+++_]+__[__$=-~-~[]]+_$[-~[]]+($[_$[$__=_+_]+_$[++$__]+_$[++$__]+_$[++$__]+_$[++$__]+_$[++$__]]+[])[ $__+$__+--_]+__[++_]+_$[$__=_+--_]+_$_[_+++_]+_$[_/_]+$_[__$]); ,非常感谢!如果我昨天得到了帮助,我还没有发布这个:(

JavaScript很漂亮,有些可供参考:

alert("I love you")

有些变量多次重复使用,不会试图留下细节,这不是一个有趣的工作:)我很高兴,我们终于来了!这实际上有很多潜力,因为我们现在有“v”,而且有很多数字,理论上我们可以$_ = "true" __ = "false" _$ = "[object Object]" $$ = "rt" _$_ = "Infinity" _ = 3 = 4 = 3 = 4 = 3 $ = window $__ = 8 = 13 __$ = 0 = 2 很多......事情更容易。我会告诉我的妻子,希望她喜欢_ $ - +()......

示例作为参考: http://jsfiddle.net/Y4wqw/

顺便说一下,我们可以稍微缩短代码,因为我们已经引用eval(),可以用它代替window [“Object”]来获取“本机代码”=> “v”,这是:

sort()

同样,它仅适用于Firefox,可能不会尝试迁移到其他浏览器。我喜欢Firefox。

4 个答案:

答案 0 :(得分:13)

至少在Firefox中,JavaScript本机对象返回function Object() { [native code] },其中包含'v'。如果我们有windowObject,那么我想我们可以这样做:

(window["Object"]+0)[29];

答案 1 :(得分:6)

相同的消息,但拼写不同。

// "I <3 u"
_= +~[]; // 1
__= -[]; // 0
___= +(-~[] -~[] -~[]); // 3
$=''
+(''+(_/__))[__] // i
+' ' // space
+'<'+___ // <3
+' ' // space
+(''+(_<__))[+(-~[] -~[])]; // u
alert($); 

jsfiddle link

答案 2 :(得分:6)

alert("\u2665"); // results in ♥

答案 3 :(得分:4)

试试这段代码:

$=(Å='',[Ç=!(µ=!Å+Å)+{}][Ç[È=++Å-~Å]+Ç[È+È]+µ[Å]+µ[Å-Å]])();
_=$[Ç[È+È+Å]+µ[Å-Å]+Ç[È+È]+Ç[Å]]("¾");
console.info( _[+[]] ); // concole is used just to show result ;)

如果你运行它,在控制台上你会得到“v”:),可以找到更多关于它的信息there

有一种方法可以避免“¾”,但结果将是“V”(对爱这样的词来说实际上没什么不好的):

$=(Å='',[Ç=!(µ=!Å+Å)+{}][Ç[È=++Å-~Å]+Ç[È+È]+µ[Å]+µ[Å-Å]])(); // we get window object
_=$[Ç[È+È+Å]+µ[Å-Å]+Ç[È+È]+Ç[Å]]( $ ); // we use btoa function with argument "[object Window]", 
// and it returns "W29iamVjdCBXaW5kb3dd" - as you see there is V 
$$=-~!''; // 2
$$$=-~$$; // 3
console.info( _[$$*$$$] ); // "V";

btoa使用base-64编码从给定字符串创建编码数据。实际上玩这个功能和改变参数你可以得到不同的字符:)