一段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数字,只需对
第四段代码分析:
$.$$= $.$ //r+(!""+"")[$._$$] //e+$.__ //t+$._ //u+$.$ //r+$.$$; //n
与之前同理,最终
第五段代码分析:
$.$=($.___)[$.$_][$.$_];
根据之前已经拼接好的字符串可以得出
最后一段代码分析:
$.$($.$($.$$ //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转码都能实现。
终于写完了,不足或错误之处请指出。
今天是情人节(劫)!写了编码了一段送给女票~
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+(!""+"")[$._$_]+$.$_$+$._$_+$._$_+$.$_$$+"\\"+(!""+"")[$._$_]+$.$$$+$.$$$+$.___+$.$_$$+"\\"+(!""+"")[$._$_]+$.$__+$.$$$_+$.$___+$.$$_+",\\"+(!""+"")[$._$_]+$.$$$+$.$$$_+$.$_$_+$.$$_+"\\"+(!""+"")[$._$_]+$.$_$+$.$__+$.__$+$.$$$+"?\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\"+$.$__+$.___+"\\\"\\"+$.$__+$.___+")"+"\"")())();
效果图:
嘿嘿!
- 一段javascript代码分析
- 一段经典的javascript代码分析
- 一段JavaScript代码
- 俄罗斯方块:一段Javascript代码
- 一段javascript代码分解
- 一段自用javascript代码
- 【转载】一段有趣的Javascript代码及分析
- 一段代码深入分析
- javascript的一段神奇代码
- 一段JavaScript的关机代码
- 一段简单的javascript代码
- 一段有意思的javascript代码
- 一段javascript代码,熟悉语法
- 一段javascript告警回放代码
- 谁能帮我分析一段代码?
- 一段经典C代码分析
- 一段流量分析工具代码
- 一段重入锁的代码分析
- OpenCV:机器学习—Statistical Model
- 适配器模式(Adapter)——跟着cc学设计系列
- Android 自定义ListView只显示第一条数据的问题
- 计算机网络复习 主题2 :为什么因特网采用分组交换的方式进行数据交换
- mysql ip查找IP段的方法
- 一段javascript代码分析
- iOS基础回顾(一)
- 交通信号灯控制系统——微机程序设计
- NYOJ 590 相同的和【数学题】
- PHP简单递归遍历所有目录
- C++ map以自定义数据类型做键值
- iOS XMPP Framework 06 - Roster 上
- Javascript的严格模式
- ASP.Net MVC——Razor视图引擎