小议 开源中国 I LOVE YOU js代码
今天在开源中国看到一篇神作《I LOVE YOU js代码》是17号的文章了,也许你已经看过了。
文章非常有意思,由 5 个 "爱心" 组成的一段js代码,能正常执行,执行后弹出 "I love you." 字符串。
$= ~[]; $={___:
++$,$$$$: (![]+"")[$],
__$:++$,$_$_:(![]+"")
[$],_$_:++$,$_$$:
({} + "")[$],
$$_$
:
($[$]+"") [$],_$$:
++$,$$$_:(!""+"")[$],$__:
++$,$_$:++$,$$__:({}+"")
[$],$$_: ++$,$$$:++$,
$___:++$,$__$:++$
};$.$_ = ($.$_=
$ + "")
[
$.$_$]+ ($._$=
$.$_[$.__$ ])+($.$$=(
$.$+"")[$.__$])+((!$)+"")
[$._$$]+($.__=$.$_[$.$$_
])+($.$=(!""+"")[$.__$
]) + ($._= (!""+"")
[ $._$_]) +$.$_
[ $.$_$ ]+
$.__+
$._$+ $.$;
$.$$=$.$+(!""+"")
[$._$$]+$.__+$._+$.$+
$.$$;$.$=($.___)[$.$_]
[$.$_];$.$($.$($.$$+
"\""+$.$_$_+(![]+
"")[$._$_]+
$.$$$_+
"\\"+
$.__$+ $.$$_+
$._$_+$.__+"(\\\"\\"+
$.__$+$.__$+$.__$+"\\"+
$.$__+$.___+(![]+"")[$._$_]+
$._$+"\\"+$.__$+$.$$_+$.$$_+
$.$$$_+"\\"+$.$__+ $.___+
"\\"+$.__$+$.$$$+$.__$+
$._$+$._+".\\\"\\"+
$.$__ +$.___+
")"+ "\"")
( ))(
)
高手觉得没什么技术含量,无非就是类似 jsfuck 之类的。
当然,这个没jsfuck那么复杂,其实作者只是拼接字符串然后得到 Function 然后执行了下。
只是这个排版可能花了不少时间吧。
来,我们来简单的分析下这个js。我水平不够,不是直接看代码分析的,是在控制台下动态调试跟踪了几遍。
(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 执行下即可。
好了,今天水了,,因为有事情。。
小议 开源中国 I LOVE YOU js代码的更多相关文章
- 开源中国iOS客户端学习
开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客 http://blog.csdn.net/column/details/xfzl-kykhd.html ...
- oschina(开源中国)的Git代码托管平台使用教程
oschina(开源中国)的Git代码托管平台使用教程 第一章 平台介绍 一. Git@OSC简介 开源中国的Git@OSC一个账号最多可以创建1000个项目,包含公有和私有,开源中国代码托管地址:h ...
- Git(分布式版本控制系统)在Windows下的使用-将代码托管到开源中国(oschina)
一.Git是什么? Git --- The stupid content tracker, 傻瓜内容跟踪器.Git是目前世界上最先进的分布式版本控制系统. 二.SVN与Git的最主要的区别? ...
- Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)
一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit 下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...
- 使用git推送代码到开源中国以及IDEA环境下使用git
使用git推送代码到开源中国以及IDEA环境下使用git 在学习Java的过程中我们会使用到git这个工具来将我们本周所编写的代码上传到开源中国进行代码托管,而在使用git的时候有很多的同学由于不会操 ...
- 用开源中国(oschina)Git管理代码(整合IntelliJ 13.1.5)
简介 开源中国提供了Git服务(地址:http://git.oschina.net/),在速度上比国外的github要快很多.使用了一段时间,感觉很不错.oschina git提供了演示平台,可以运行 ...
- 沈晓军 / LarvaFrame - 代码托管 - 开源中国社区
沈晓军 / LarvaFrame - 代码托管 - 开源中国社区 统计
- AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区
AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区 AeroGear.js 1.2.0 发布,手机Web应用脚手架
- eclipse中如何向开源中国(码云)上传代码
摘要 本文将介绍如何将本地的项目提交到开源中国上去,过程比较详细,实现起来很简单.由于自己也算是一个新手,所以没有做过多的解释,只是单纯的描述了该如何去做. 1.在开源中国上面新建一个空项目 到这 ...
随机推荐
- NodeMCU学习(四):与其他设备通信
TCP连接 TCP是计算机网络中运输层协议,是应用层协议http协议的支撑协议.两台远程主机之间可以通过TCP/UDP协议进行通信并交换信息,前提是,相互通信的两台主机之间必须知道彼此的IP地址和端口 ...
- 整理一些常用的前端CND加速库,VUE,Jquery,axios
VUE https://cdn.staticfile.org/vue/2.2.2/vue.min.js Jquery https://cdn.bootcss.com/jquery/3.4.0/jque ...
- CMake与MSVC工程化实践
CMake与MSVC工程化实践 CMake基础 cmake无疑是最流行的c++跨平台构建工具之一,关于cmake入门指南这里不再赘述,官方文档是最好的参考,这里通过一个例子简述构建一个工程常用的函数和 ...
- python的闭包函数
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包. #闭包函数的实例# outer是外部函数 a和b都是外函数的临时变量def o ...
- 《Linux内核分析》第三周:Linux系统启动过程
杨舒雯 原创作品转载请注明出处 Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验--使用gdb跟踪调试内 ...
- ANSI C 常见宏的使用
1. __VA_ARGS__: ... 表示可变参数列表,__VA_ARGS__在预处理中会被可变参数列表替代 2. __FILE__:正在编译文件的文件路径 3. __LINE__:正在编译文件的 ...
- Linux_Centos7_设置MySql定时备份
一.查看是否安装了必要的组件 [root@localhost /]# rpm -qa | grep cron cronie-1.4.11-14.el7_2.1.x86_64 cronie-anacro ...
- 去掉DataTable列中的重复行
DataTable dt = ds.Tables[0]; //获得 DataTable DataView dv = new DataView(dt);DataTable dt2 = dv.T ...
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest F(递推)
F题 Problem F Philosopher’s Walk 题意:给你n,m,n代表一个长宽都为2的n次方的格子里,m代表走了从左下角开始走了m米,求最后的坐标. 思路: 看上图很容易便可以看出规 ...
- Rust 阴阳谜题,及纯基于代码的分析与化简
Rust 阴阳谜题,及纯基于代码的分析与化简 雾雨魔法店专栏 https://zhuanlan.zhihu.com/marisa 来源 https://zhuanlan.zhihu.com/p/522 ...