《Flappy Pig》被高手破解 “无敌”代码分析

开发 前端
《Flappy Pig》被高手破解,在@Laix的留言中,有这么一段“奇怪的代码”……无敌了,各位牛X的js大神来看看。

今天早晨刚起来,看到一个朋友(@Laix)的留言,他留了一段“奇怪的代码”,说在控制台执行会发生神奇的事情:

1._=~[];_={___:++_,$$$$:(![]+"")[_],__$:++_,$_$_:(![]+"")[_],_$_:++_,$_$$:({}+"")[_],$$_$:(_[_]+"")[_],_$$:++_,$$$_:(!""+"")[_],$__:++_,$_$:++_,$$__:({}+"")[_],$$_:++_,$$$:++_,$___:++_,$__$:++_};_.$_=(_.$_=_+"")[_.$_$]+(_._$=_.$_[_.__$])+(_.$$=(_.$+"")[_.__$])+((!_)+"")[_._$$]+(_.__=_.$_[_.$$_])+(_.$=(!""+"")[_.__$])+(_._=(!""+"")[_._$_])+_.$_[_.$_$]+_.__+_._$+_.$;_.$$=_.$+(!""+"")[_._$$]+_.__+_._+_.$+_.$$;_.$=(_.___)[_.$_][_.$_];_.$(_.$(_.$$+"\""+_.$$$$+(![]+"")[_._$_]+_.$_$_+"\\"+_.__$+_.$$_+_.___+"\\"+_.__$+_.$$_+_.___+"\\"+_.__$+_.$$$+_.__$+".\\"+_.__$+_.$_$+_.__$+"\\"+_.__$+_.$_$+_.$$_+"\\"+_.__$+_.$_$+_.__$+_.__+"();"+"\"")())(); 
  • 1.

这一坨乱七八糟的代码,甚至连个字母都没有。我还是打开Flappy Pig试了一下(chrome或者firefox打开,F12呼出开发者工具,输入上面的代码,回车):

 

之后按空格键开始游戏~~~~~神奇的事情果然发生了,小猪无敌了,撞在柱子上不会死~~~~~~

下面分析下这位高手是怎么做到的

首先把那段奇怪的javascript“美化”一下:

_ = ~ [];  
_ = {  
___: ++_,  
$$$$: (![] + "")[_],  
__$: ++_,  
$_$_: (![] + "")[_],  
_$_: ++_,  
$_$$: ({} + "")[_],  
$$_$: (_[_] + "")[_],  
_$$: ++_,  
$$$_: (!"" + "")[_],  
$__: ++_,  
$_$: ++_,  
$$__: ({} + "")[_],  
$$_: ++_,  
$$$: ++_,  
$___: ++_,  
$__$: ++_  
};  
_.$_ = (_.$_ = _ + "")[_.$_$] + (_._$ = _.$_[_.__$]) + (_.$$ = (_.$ + "")[_.__$]) + ((!_) + "")[_._$$] + (_.__ = _.$_[_.$$_]) + (_.$ = (!"" + "")[_.__$]) + (_._ = (!"" + "")[_._$_]) + _.$_[_.$_$] + _.__ + _._$ + _.$;  
_.$$ = _.$ + (!"" + "")[_._$$] + _.__ + _._ + _.$ + _.$$;  
_.$ = (_.___)[_.$_][_.$_];  
_.$(_.$(_.$$ + "\"" + _.$$$$ + (![] + "")[_._$_] + _.$_$_ + "\\" + _.__$ + _.$$_ + _.___ + "\\" + _.__$ + _.$$_ + _.___ + "\\" + _.__$ + _.$$$ + _.__$ + ".\\" + _.__$ + _.$_$ + _.__$ + "\\" + _.__$ + _.$_$ + _.$$_ + "\\" + _.__$ + _.$_$ + _.__$ + _.__ + "();" + "\"")())(); 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

可以看出,其实_是个变量(我们平时不会这么命名变量),~ []就是-1(大家可以执行下,不要问我为什么,我还是菜鸟,javascript 基础不扎实,还没彻底搞明白),以此类推,代码可以进一步“美化”(虽然这一步跨的有点大):

_ = ~ [];  
_ = {  
$$$: 7  
$$$$: "f" 
$$$_: "e" 
$$_: 6  
$$_$: "d" 
$$__: "c" 
$_$: 5  
$_$$: "b" 
$_$_: "a" 
$__: 4  
$__$: 9  
$___: 8  
_$$: 3  
_$_: 2  
__$: 1  
___: 0  
};  
_.$_ = "constructor";  
_.$$ = "return" 
_.$ = (0)[constructor][constructor];  
0["constructor"]["constructor"](  
0["constructor"]["constructor"](  
"flappy.init ()" 
)()  
)(); 
  • 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.

最关键的代码就是后面的(0)[constructor][constructor],他实质上是执行了flappy.init (),关于(0)[constructor][constructor]的分析看这里,那么我们再次打开 flappy pig,打开开发者工具,执行flappy.init ()

没错,“小猪”无敌了。

总结:

1、其实核心的就是执行一句话flappy.init (),这是我的疏忽,再一次初始化游戏,会产生 bug,小猪就无敌了。

2、这位高手用很复杂代码,各种拼凑,让我这种菜鸟各种看不懂的执行了flappy.init ()

3、我的 javascript 还是没学懂

4、@Laix 你还真是顽皮啊。

原文链接:http://keenwon.com/1021.html

责任编辑:林师授 来源: KeenWon.com
相关推荐

2021-07-21 09:00:00

面部识别AI安全

2020-12-04 10:36:12

OpenClinic漏洞破解

2012-12-18 11:55:38

2017-06-01 16:42:16

2009-12-07 15:27:02

2009-12-10 09:30:32

2022-08-06 13:04:27

LinuxSHH

2009-11-05 14:33:13

2020-02-06 10:20:19

硬件黑客技术

2012-05-08 09:57:35

WiFi

2009-12-08 10:52:56

2012-11-14 14:39:50

2009-04-27 21:32:18

2025-01-20 20:44:21

2024-12-09 13:11:22

2015-08-19 14:43:19

pighadoop

2014-12-09 14:26:12

C++

2022-06-29 11:15:45

面试腾讯

2015-10-19 10:29:33

2021-04-20 14:45:22

人脸识别安全技术
点赞
收藏

51CTO技术栈公众号