今天在开源中国看到一篇神作《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代码的更多相关文章

  1. 开源中国iOS客户端学习

    开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

  2. oschina(开源中国)的Git代码托管平台使用教程

    oschina(开源中国)的Git代码托管平台使用教程 第一章 平台介绍 一. Git@OSC简介 开源中国的Git@OSC一个账号最多可以创建1000个项目,包含公有和私有,开源中国代码托管地址:h ...

  3. Git(分布式版本控制系统)在Windows下的使用-将代码托管到开源中国(oschina)

    一.Git是什么?     Git --- The stupid content tracker, 傻瓜内容跟踪器.Git是目前世界上最先进的分布式版本控制系统. 二.SVN与Git的最主要的区别?  ...

  4. Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)

    一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit  下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...

  5. 使用git推送代码到开源中国以及IDEA环境下使用git

    使用git推送代码到开源中国以及IDEA环境下使用git 在学习Java的过程中我们会使用到git这个工具来将我们本周所编写的代码上传到开源中国进行代码托管,而在使用git的时候有很多的同学由于不会操 ...

  6. 用开源中国(oschina)Git管理代码(整合IntelliJ 13.1.5)

    简介 开源中国提供了Git服务(地址:http://git.oschina.net/),在速度上比国外的github要快很多.使用了一段时间,感觉很不错.oschina git提供了演示平台,可以运行 ...

  7. 沈晓军 / LarvaFrame - 代码托管 - 开源中国社区

    沈晓军 / LarvaFrame - 代码托管 - 开源中国社区 统计

  8. AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区

    AeroGear.js 1.2.0 发布,手机Web应用脚手架 - 开源中国社区 AeroGear.js 1.2.0 发布,手机Web应用脚手架

  9. eclipse中如何向开源中国(码云)上传代码

    摘要 本文将介绍如何将本地的项目提交到开源中国上去,过程比较详细,实现起来很简单.由于自己也算是一个新手,所以没有做过多的解释,只是单纯的描述了该如何去做.   1.在开源中国上面新建一个空项目 到这 ...

随机推荐

  1. 绕WAF&安全狗新姿势

    俗话说只要思路宽,绕狗绕的欢.前段时间我有尝试着用以下的方法绕狗,效果还不错.不过这方法呢也许这段时间可以绕过,过段时间可能就失效了,大家还是要多去尝试找到更多的方法. 举例-->整型注入 绕过 ...

  2. 小程序swiper组件高度自适应【转载】

    最近在做小程序开发,复制官方文档上的swiper组件实测后发现,图片不能自适应.网上找了几个版本测试都发现存在一些小问题,目前这个版本本人实测是最好用的.记录一下,方便日后使用. 感谢原创大神的帮助, ...

  3. thinkphp在wamp 配置去掉url中index.php方法

    http://blog.csdn.net/youmypig/article/details/45008971

  4. Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis

    1.前言 MyBatis 是什么? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

  5. PSP(3.16——3.22)以及周记录

    3.17 13:30 14:45 15 60 讨论班 A Y min 14:50 17:05 5 130 得到设备 Cordova 蓝牙连接 A Y min 23:15 23:45 5 25 英语百词 ...

  6. eclipse运行tomcat中发生异常重启后tomcat端口被占用

    在任务管理器关闭javaw进程即可,一般此时会有两个以上javaw进程,关闭其中占用内存较少的那个 可用netstat -ano命令查看端口占用情况

  7. BZOJ5461 PKUWC2018Minimax(概率期望+线段树合并+动态规划)

    离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m]). 考 ...

  8. 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

    0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...

  9. Java 8新特性之接口改善(八恶人-1)

    Daisy Donergue 多莫歌·黛西 “By woman, you mean her?” 她也能叫女人? Java 8在13年9月发布,写这篇博文的时间已经是17年12月份了.来的有点晚,但是有 ...

  10. hihoCoder 1631 Cats and Fish(ACM-ICPC北京赛区2017网络同步赛)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU campus. They are all happy ...