解释某宝的一段混淆视听的代码

在某宝的登录界面上,有这么一段代码

S.one(window).on("load", function() {
  eval(function(p, a, c, k, e, d) {
    e = function(c) {
      return c
    };
    if (!''.replace(/^/, String)) {
      while (c--) {
        d[c] = k[c] || c
      }
      k = [
        function(e) {
          return d[e]
        }
      ];
      e = function() {
        return '\\w+'
      };
      c = 1
    };
    while (c--) {
      if (k[c]) {
        p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
      }
    }
    return p
  }('0 1=5;0 2=4;0 3=1&2;6.9("8").7=3;', 10, 10, 'var|a|b|c|110|10|document|value|gvfdc|getElementById'.split('|'), 0, {}))
});

 初看之下,很复杂,实际上,分析下来真的很简单,最大的特色就是利用string的replace代码完成了一个把某些文本构造成一个真实有用的语句,然后执行

 先来看这句

''.replace(/^/, String)

 实际上这句的结果永远为false,大家可以用Firebug在控制台下执行一下看。

 这样分析下来, 那下面这句

while (c--) {
        d[c] = k[c] || c
      }

 在分析这句之前,我们先来看看K的值,它的值为'var|a|b|c|110|10|document|value|gvfdc|getElementById'.split('|')执行得到的,会得到一个10个元素的字符串数组

 所以,上面那句语句的含义,我们现在也可以很清楚的知道了,就是分别把它们放到对应下标的词典中去。

 最后一个大复杂句,我们再来看一下

 

while (c--) {
      if (k[c]) {
        p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
      }
    }

 由于上面c=1了,所以这个循环,实际上只执行一次,就是这个关键的replace语句。把所有的单词进行了一个全局替换,替换的内容由k[c]这个值。前面我们会看到k[c]这个东西实际为下面语句:

k = [
        function(e) {
          return d[e]
        }
      ];

 看到了吗,实际上它返回的就是对应d这个词典中以e(也就是前面正则匹配的单词)为下标对应的项。

 到此,整个这么大块语句下来,最后的结果就很清楚了。

 你还不知道,那还不快用Firebug去控制台执行看看。

 

  这说不定会成为你写让人看不懂代码的一个突破哦

posted @ 2014-04-27 11:14  理查杨哥  阅读(517)  评论(1编辑  收藏  举报