一段javascript代码分析

来源:互联网 发布:网络海报设计 编辑:程序博客网 时间:2024/05/21 06:35

先贴源码:

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

把代码粘贴到浏览器地址栏输出为下图,地址栏加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个(.5[5],.$=”constructor”。(代码中已全部注释)

第四段代码分析:

$.$$=                $.$              //r+(!""+"")[$._$$]     //e+$.__              //t+$._               //u+$.$             //r+$.$$;               //n

与之前同理,最终.$=”return”。

第五段代码分析:

$.$=($.___)[$.$_][$.$_];

根据之前已经拼接好的字符串可以得出.=0[constructor][constructor]

最后一段代码分析:

$.$($.$($.$$             //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转码都能实现。

终于写完了,不足或错误之处请指出。
今天是情人节(劫)!写了编码了一段送给女票~

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+(!""+"")[$._$_]+$.$_$+$._$_+$._$_+$.$_$$+"\\"+(!""+"")[$._$_]+$.$$$+$.$$$+$.___+$.$_$$+"\\"+(!""+"")[$._$_]+$.$__+$.$$$_+$.$___+$.$$_+",\\"+(!""+"")[$._$_]+$.$$$+$.$$$_+$.$_$_+$.$$_+"\\"+(!""+"")[$._$_]+$.$_$+$.$__+$.__$+$.$$$+"?\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\\"\\"+$.$__+$.___+")"+"\"")())();

效果图:
这里写图片描述

嘿嘿!

0 0
原创粉丝点击