小议 开源中国 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.在开源中国上面新建一个空项目 到这 ...
随机推荐
- PAT甲题题解-1104. Sum of Number Segments (20)-(水题)
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT甲题题解-1117. Eddington Number(25)-(大么个大水题~)
如题,大水题...贴个代码完事,就这么任性~~ #include <iostream> #include <cstdio> #include <algorithm> ...
- 团队作业Week6:规格说明书编写
(1)请分析你们团队项目的典型用户和场景,并写一个团队博客发布你们团队项目的功能规格说明书. (2)再写一个博客团队博客发布你们项目的设计文档(技术规格说明书). 截止时间:2015-11-03
- 11.19daily_scrum
本阶段的工作内容为测试并且撰写笔记本APP应用的测试报告,目的在于总结测试阶段的测试以及分析测试结果,描述系统是否符合需求,测试软件功能的完善性.除了音频界面还未完成,其他部分均已开始实现测试功能,具 ...
- 爬虫项目之NABC
Need 在如今的互联网市场上相关的网络爬虫软件已然很多,要想赢得客户,高效.稳定.创新都必不可少的. 我们初步阅读和运行了上一届团队的项目,决定从以下几个方面修改和完善创新这一项目: 1.改善对爬取 ...
- Linux内核分析 NO.3
跟踪分析Linux内核的启动过程 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002 ...
- Ubuntu安装eclipse,并创建桌面快捷方式
系统:Ubuntu 16.04 JDK版本:1.8.0_121 Ubuntu下安装JDK配置环境变量可见我的这篇文章 http://www.cnblogs.com/AloneZ/p/Ubuntu1 ...
- ElasticSearch 2 (3) - Breaking Changes
ElasticSearch 2.1.1 (3) - Breaking Changes Search Changes search_type = scan Deprecated GET /my_ind ...
- Xshell登录Docker
使用SSH协议登录即可,用户名为docker,密码为tcuser
- quartz.net 3.x版本如何通过xml文件进行Job配置
在2.x版本中,我们可以简单的在quartz.config文件中通过以下Xml配置方式来注册相应的Job以及触发器 quartz.plugin.xml.type = Quartz.Plugin.Xml ...