小议 开源中国 I LOVE YOU js代码

今天在开源中国看到一篇神作《I LOVE YOU js代码》是17号的文章了,也许你已经看过了。

文章非常有意思,由 5 个 "爱心" 组成的一段js代码,能正常执行,执行后弹出 "I love you." 字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  $= ~[];    $={___:
++$,$$$$: (![]+"")[$],
 __$:++$,$_$_:(![]+"")
   [$],_$_:++$,$_$$:
     ({} + "")[$],
        $$_$
          :
 
 
    ($[$]+"")   [$],_$$:
  ++$,$$$_:(!""+"")[$],$__:
   ++$,$_$:++$,$$__:({}+"")
    [$],$$_: ++$,$$$:++$,
      $___:++$,$__$:++$
       };$.$_ = ($.$_=
          $ + "")
             [
 
 
          $.$_$]+      ($._$=
         $.$_[$.__$  ])+($.$$=(
        $.$+"")[$.__$])+((!$)+"")
        [$._$$]+($.__=$.$_[$.$$_
         ])+($.$=(!""+"")[$.__$
           ]) + ($._= (!""+"")
            [ $._$_]) +$.$_
               [ $.$_$ ]+
                 $.__+
 
 
         $._$+    $.$;
       $.$$=$.$+(!""+"")
     [$._$$]+$.__+$._+$.$+
     $.$$;$.$=($.___)[$.$_]
      [$.$_];$.$($.$($.$$+
        "\""+$.$_$_+(![]+
          "")[$._$_]+
             $.$$$_+
              "\\"+
 
 
     $.__$+    $.$$_+
   $._$_+$.__+"(\\\"\\"+
  $.__$+$.__$+$.__$+"\\"+
$.$__+$.___+(![]+"")[$._$_]+
$._$+"\\"+$.__$+$.$$_+$.$$_+
 $.$$$_+"\\"+$.$__+  $.___+
   "\\"+$.__$+$.$$$+$.__$+
     $._$+$._+".\\\"\\"+
       $.$__  +$.___+
         ")"+ "\"")
           ( ))(
             )

高手觉得没什么技术含量,无非就是类似 jsfuck 之类的。

当然,这个没jsfuck那么复杂,其实作者只是拼接字符串然后得到 Function 然后执行了下。
只是这个排版可能花了不少时间吧。
来,我们来简单的分析下这个js。我水平不够,不是直接看代码分析的,是在控制台下动态调试跟踪了几遍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(function() {
    debugger;
    var $ = ~ []; // -1
    $ = {
        ___: ++$, // 0
        $$$$: (![] + "")[$], // "false"[0] => f
        __$: ++$, // 1
        $_$_: (![] + "")[$], // "false"[1] => a
        _$_: ++$, // 2
        $_$$: ({} + "")[$], // "[object Object]"[2] => b
        $$_$: ($[$] + "")[$],
        _$$: ++$, // 3
        $$$_: (!"" + "")[$], // "true"[3] => e
        $__: ++$, // 4
        $_$: ++$, // 5
        $$__: ({} + "")[$], // "[object Object]"[5] => c
        $$_: ++$, // 6
        $$$: ++$, // 7
        $___: ++$, // 8
        $__$: ++$ // 9
    };
 
    $.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$;
    // 这里这么长就是为了组成 "constructor" 字符串
 
    $.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$; // "return"
 
    $.$ = ($.___)[$.$_][$.$_]; // (0).constructor.constructor => Function
    // $.$ = Function
 
    // return"ale\162t(\"\111\40lo\166e\40\171ou.\"\40)"
    $.$(
        $.$(
            $.$$ + "\"" + $.$_$_ + (![] +"")[$._$_] + $.$$$_ + "\\" +
            $.__$ + $.$$_ +
            $._$_ + $.__ +
            "(\\\"\\" +
            $.__$ + $.__$ + $.__$ + "\\" +
            $.$__ + $.___ + (![] + "")[$._$_] +
            $._$ + "\\" + $.__$ + $.$$_ + $.$$_ +
            $.$$$_ + "\\" + $.$__ + $.___ +
            "\\" + $.__$ + $.$$$ + $.__$ +
            $._$ + $._ + ".\\\"\\" +
            $.$__ + $.___ +
            ")" + "\""
            // 这里这么长一段就是为了得到 return"ale\\162t(\\"\\111\\40lo\\166e\\40\\171ou.\\"\\40)" 字符串
        )()
    )();
    // 这部分代码相当于
    // Function(Function('return"ale\\162t(\\"\\111\\40lo\\166e\\40\\171ou.\\"\\40)"')())();
})();

这是我改造后的代码,这样在F12下动态调试非常容易阅读。
前面得到一些基本字符串,然后拼接出 constructorreturn 字符,
接着利用 constructor 得到 Function 函数。
有了 Function 剩下的非常简单了,拼接字符串然后用 Function 执行下即可。

好了,今天水了,,因为有事情。。

posted @   楼教主  阅读(2235)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
js output×
点击右上角即可分享
微信分享提示