JS中语句的另类写法。
收到一封邮件,附件被提示为病毒,出于好奇,下载到本地研究了一番。
邮件的附件是一个ZIP压缩包,解压后,里面仅有一个WSF类型的文件,WSF类型文件默认用windows系统的脚本解析器打开。
部分源码如下:
<job>
<script language = "JScript" >
var aDndEiCXd = ';}\n;f nruter \n \n;)""((..省略若干字符))x\\" = 22_ rav'["split"]('')["reverse"]()["join"]('');
/*@cc_on
eval(aDndEiCXd);
@*/
</script>
</job>
可以看出是一段JS的代码,开始定义了一个貌似字符串变量的aDndEiCXd
。然后用eval
将其转为JS语句执行。
字符串是用单引号圈起的,里面有若干个双引号。
奇怪的是,在字符串内容之后,跟了一串内容:["split"]('')["reverse"]()["join"]('')
这种写法不常见。
于是,自己建个JS,开始测试:
var a='abcdefg'["split"];
console.log(a); //返回一个Function.
原来后面跟了["split"]
后,变量a
已经成为一个Function。字符串String做为一个基本包装类型,也可以如调用一个对象的方法一样,来调用String的方法,而这时返回值就是调用的方法了。所以会console出Function,即输出了调用的方法的类型。
继续测:
var a='abcdefg'["split"]('');
console.log(a); //返回一个数组:[ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ]
有了上面那个Function
的输出,返回这个数组就不难理解了。就是将字符串按每个字符分割为数组。
继续:
var a='abcdefg'["split"]('')["reverse"]()["join"]('');
console.log(a); //输出字符串:“gfedcba”
后面的就不用解释了,原来是将字符串倒过来。做为病毒,应该是为了反杀毒。
这里仅简单记录一下字符串后面跟方括号可以调用类型的方法的问题。病毒的源码很长,在此不做分析。