小议 开源中国 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下动态调试非常容易阅读。
前面得到一些基本字符串,然后拼接出 constructor 和 return 字符,
接着利用 constructor 得到 Function 函数。
有了 Function 剩下的非常简单了,拼接字符串然后用 Function 执行下即可。
好了,今天水了,,因为有事情。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述