博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解释某宝的一段混淆视听的代码
阅读量:7043 次
发布时间:2019-06-28

本文共 1435 字,大约阅读时间需要 4 分钟。

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

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去控制台执行看看。

 

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

转载于:https://www.cnblogs.com/richardy2012/p/3693802.html

你可能感兴趣的文章
Archlinux GRUB2 配置
查看>>
第二周作业
查看>>
团队事后分析
查看>>
mysql 关于列的语句
查看>>
博客作业2---线性表
查看>>
grub2引导安装kali2.0及安装ibus拼音输入法
查看>>
SQL常用命令
查看>>
Linux~Docker部分~
查看>>
Simple2D-15(音乐播放器)使用 glfw 库
查看>>
web.config 配置与获取
查看>>
据说每个大牛、小牛都应该有自己的库——DOM处理
查看>>
装饰器学习
查看>>
Mongodb Windows 集群
查看>>
linux 上查找pid,筛选出来
查看>>
每天一总结
查看>>
note 8 字符串
查看>>
thinkphp 3.2.3 连接sql server 2014
查看>>
求曲线上的动点到直线的距离的最值
查看>>
不等式证明中的断想
查看>>
用动态观点解决问题
查看>>