先贴源码:
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();
把代码粘贴到浏览器地址栏输出为下图,地址栏加javascript:
与alert(“Hello,JavaScript”)同效果。
在javascript中能用美元符$,和下划线_来定义变量,所以在代码中看不到一个字母或数字,那么Hello,JavaScript是怎么生成的呢?现在让我们走进科学!。。。
把代码以分号,可以分成6段
第一段代码分析:
$=~[];
对[]进行取反操作,先把[]转为数字0,~[]=~0=-1。
第二段代码分析:
$={
___:++$, //0
$$$$:(![]+"")[$], //f
__$:++$, //1
$_$_:(![]+"")[$], //a
_$_:++$, //2
$_$$:({}+"")[$], //b
$$_$:($[$]+"")[$], //d
_$$:++$, //3
$$$_:(!""+"")[$], //e
$__:++$, //4
$_$:++$, //5
$$__:({}+"")[$], //c
$$_:++$, //6
$$$:++$, //7
$___:++$, //8
$__$:++$ //9
};
因为$定义为-1,对其进行自增操作,可以取到任何数字。在javascript中转换为布尔型只需在变量前加两个感叹号”!!”,所以![]为false,再进行+”“操作转为字符串”false”,取第一个字符为f。{}转为字符串为”[object Object]”。!”“转为字符串为”true”。分别取到f,a,b,d,e,c。
第三段代码分析:
$.$_=($.$_=$+"")[$.$_$] //c
+($._$=$.$_[$.__$]) //o
+($.$$=($.$+"")[$.__$]) //n
+((!$)+"")[$._$$] //s
+($.__=$.$_[$.$$_]) //t
+($.$=(!""+"")[$.__$]) //r
+($._=(!""+"")[$._$_]) //u
+$.$_[$.$_$] //c
+$.__ //t
+$._$ //o
+$.$; //r
第二段代码已经定义了0-9数字,只需对
对象里取值,添加属性即可,如第一行,把
转成字符串,去第5个(
.
第四段代码分析:
$.$$=
$.$ //r
+(!""+"")[$._$$] //e
+$.__ //t
+$._ //u
+$.$ //r
+$.$$; //n
与之前同理,最终 . $=”return”。
第五段代码分析:
$.$=($.___)[$.$_][$.$_];
根据之前已经拼接好的字符串可以得出
最后一段代码分析:
$.$($.$(
$.$$ //return
+"\"" // "
+$.$_$_ //a
+(![]+"")[$._$_] //l
+$.$$$_ //e
+"\\" // \
+$.__$ //1
+$.$$_ //6
+$._$_ //2
+$.__ //t
+"(\\\"\\" //(\"\
+$.__$ //1
+$.__$ //1
+$.___ //0
+$.$$$_ //e
+(![]+"")[$._$_] //l
+(![]+"")[$._$_] //l
+$._$ //o
+",\\" //,\
+$.$__ //4
+$.___ //0
+"\\" //\
+$.__$ //1
+$.__$ //1
+$._$_ //2
+$.$_$_ //a
+"\\" //\
+$.__$ //1
+$.$$_ //6
+$.$$_ //6
+$.$_$_ //a
+"\\" //\
+$.__$ //1
+$._$_ //2
+$._$$ //3
+$.$$__ //c
+"\\" //\
+$.__$ //1
+$.$$_ //6
+$._$_ //2
+"\\" //\
+$.__$ //1
+$.$_$ //5
+$.__$ //1
+"\\" //\
+$.__$ //1
+$.$$_ //6
+$.___ //0
+$.__ //t
+"\\\"\\" // \"\
+$.$__ //4
+$.___ //0
+")"
+"\"")())
();
最后一段是整个代码的核心,这段代码是怎么调用alert的呢?在这之前先简化一下这段代码
如下:
0["constructor"]["constructor"](
"return \"alert()\""
)();
代码输出结果为”alert()”
其实这段代码,找到函数的构造函数,调用它来创建一个新的函数作为参数来充当函数体,然后就立即调用这个函数。0就是调用函数的第一个参数。
和下面同样的意思:
var a= Function("alert(1)")()
Function(a)()
现在再看看最后一段代码,就是一这种形式调用函数,找不到的字符通过ascii转码,unicode转码都能实现。
终于写完了,不足或错误之处请指出。
今天是情人节(劫)!写了编码了一段送给女票~
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+(!""+"")[$._$_]+$.$_$+$._$_+$._$_+$.$_$$+"\\"+(!""+"")[$._$_]+$.$$$+$.$$$+$.___+$.$_$$+"\\"+(!""+"")[$._$_]+$.$__+$.$$$_+$.$___+$.$$_+",\\"+(!""+"")[$._$_]+$.$$$+$.$$$_+$.$_$_+$.$$_+"\\"+(!""+"")[$._$_]+$.$_$+$.$__+$.__$+$.$$$+"?\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\\"\\"+$.$__+$.___+")"+"\"")())();
效果图:
嘿嘿!