D码点评:4 Weird JS

据说在每一个电脑维修部里,都有一个扫地的老太太. 很偶然地,当她经过一个维修工程师的身边,扫一眼显示器上字符的,会低声提醒对方说:小心,分区表出错了.

funny_weird_picture_9.jpg(JPEG 图像,500x375 像素)

豆瓣电台的奇怪代码

来自 9月15日 00:19 的线报!

豆瓣FM - 红心歌曲列表 有类似代码

怎么破?! 果然, 神奇的桟溢出给解释了:

Weird javascript appeared in a page - Stack Overflow

这是种通过4个步骤制造出来的代码:

  1. $式声明
  2. 构建一个字典使用的当前值$,然后再赋值给$
  3. 运用字典中即有的键/值对,创建额外的键/值对并置入当前字典
  4. 构造立即执行的嵌套函数

一切从一个 $ 声明开始:

$=~[];

在 Chrome 的控制台,这将返回 -1; 即数字内容, ~ 参考: D码点评:1 为毛得”10”?! 有类似的推导! [] 变为 0, ~ (按位 NOT) 作用与 0 得到 -1. 所以, 最终我们获得了一个 值为 -1 的变量. 等效于:

v = -1;

然后开始构建字典, 等效代码的对应如下:

$={ ___ : ++$,              dct={ zero  : 0,
  $$$$  : (![] + "")[$],          f     : "f",
  __$   : ++$,                    one   : 1,
  $_$_  : (![] + "")[$],          a     : "a",
  _$_   : ++$,                    two   : 2,
  $_$$  : ({} + "")[$],           b     : "b",
  $$_$  : ($[$] + "")[$],         d     : "d",
  _$$   : ++$,                    three : 3,
  $$$_  : (!"" + "")[$],          e     : "e",
  $__   : ++$,                    four  : 4,
  $_$   : ++$,                    five  : 5,
  $$__  : ({} + "")[$],           c     : "c",
  $$_   : ++$,                    six   : 6,
  $$$   : ++$,                    seven : 7,
  $___  : ++$,                    eight : 8,
  $__$  : ++$                     nine  : 9
  };                            };

现在,我们有一个字典, 包含一些 09 的数值,以及 af 的字母; 那些魔法样儿的操作? 不过是从字典中取值生成需要的JS 代码. 比如: 将错误的值赋给 “” 获得 “false”, {}+”” 获得 [对象 对象],等等

接下来的一系列字符串 $_ (且称为 alpha) 是用作字典元素的, 如 ($.$_) 是一系列字串 (类似的键名已声明过, 如 _$ 变成 beta , $$ 是 gamma, __ 算 delta, $ epsilon, _ 是 phi )

(dct.alpha = dct + "")[dct.five]    // dct.alpha = "[object Object]", yields "c"
(dct.beta  = dct.alpha[dct.one])    // dct.beta="o", yields "o"
(dct.gamma = (dct.epsilon + "")[dct.one]) // dct.gamma="n", "n"
((!dct) + "")[dct.three]            // "s"
(dct.delta = dct.alpha[dct.six])    // dct.delta="t", "t"
(dct.epsilon= (!"" + "")[dct.one])  // dct.epsilon="r", "r"
(dct.phi   = (!"" + "")[dct.two])   // dct.phi = "u", "u"
dct.alpha[dct.5]                    // "c"
dct.delta                           // "t"
dct.beta                            // "o"
dct.epsilon                         // "r"

于是 dct.alpha ($.$_) 得到 “constructor”. 邪恶的来了, $.$$ (是我们能调用的 gamma), 再设置上 “return”.

迷雾继续加深.

继续赋值, 这时 $.$ (即 dct.epsilon), 设置成:

dct.epsilon = (dct.zero)[dct.alpha][dct.alpha]

这不仅仅是一个数组查找. dct.zero为0, 所以 (0)["constructor"] 是查找 0 的属性 constructor.

记住, 在 javascript 中, a["b"] 等价与 a.b, 于是 (0)["constructor"]["constructor"] 就是 0.constructor.constructor. 而 constructor 是数字的构造函式, 即 Function function. 此 function (指针) 是配给 dct.epsilon 的, 于是, 蠕虫在此返回了.

最后声明是一个嵌套函数调用 $.$$ :

dct.epsilon(                  Function(
  dct.epsilon(                  Function(
    //long concatenation            // something functiony
  )()                           )()
)();                          )()

blablabla…

是也乎

好的,就是这样一层层变形伪造下去, 大妈已经没有兴趣翻译了; 最终是一段标准的将网页 dom 树写入目标元素而已!

所以! 这只是利用了 JS 的小小变态能力,综合使用了普通密码学里的字串移位操作, 向浏览器输出只有机器认识的标准 JS 代码来完成不希望普通人看懂的功能.

但是,事实总是不断的证明,人类的无聊是没有底线的! 无论JS 写的多么隐晦,总是有好事者推导的出来!

再次证明, JS 是个变态语言.

并进一步证明, 豆瓣已经驾驭这种变态能力到变态的程度了…

9.14 珠海首届 DevFest:

巡阅

2013-09-17  

声明: 本文采用 BY-NC-SA 授权。转载请注明转自: #ZHGDG#


以上...


加入 珠海GDG

  1. 注册 Meetup
  2. 关注 Zhuhai GDG
  3. 或扫描: 2meetup

通过 珠海GDG 可以:

    第一时间获知谷歌最新技术,
    可以学到如何去谷歌平台上赚钱的思路和方法,
    可以认识很多有可能将来一起走上自己创业道路的人,
    可以学会把你的创新带向国际市场,
    参加那里的活动有经常和国际上的开发者们进行交流的机会...

PS:

若无意外,题图都是从原文提取或是通过 Google 图片搜索出来的, 版权属左, 不负责任 ;-)

PPS:

珠海GDG 微信/Blog 欢迎投稿,只要追自认内容吻合以下条件:

0. 有趣 ~ 至少是自个儿有兴趣的领域吧...
1. 有料 ~ 至少有点儿原创的东西吧..
2. 有种 ~ 至少不能是成功学吧!

有好物请及时通过邮件列表投稿成也: [email protected]
(发空邮件到 [email protected] 即完成订阅)

微信公号

栏目设定:

    G术图书 (gb:推荐好书,书无中外)
    D码点评 (dd:麻辣评点,善意满盈)
    G说公论 (gt:时评杂文,新旧不拘)
    珠的自白(dm:大妈自述,每周一篇)
    海选文章(hd:得要相信,大妈法眼)

总之, 请大家告诉大家, 珠海生活中的技术社区 都来订阅呗 ;-)

订阅方法

hacker emblem

GDG珠海 社区资源:

大妈的多重宇宙 - YouTube

全新自媒体系列...科学幻想,读书,说故事...

任何问题

随时邮件提问可也:
[email protected]