《Flappy Pig》被高手破解,代码分析

jopen 10年前

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

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

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

《Flappy Pig》被高手破解,代码分析

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

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

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

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

        可以看出,其实_是个变量(我们平时不会这么命名变量),~ []就是-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 ()"
)()
)();

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

《Flappy Pig》被高手破解,代码分析

        没错,“小猪”无敌了。

        总结:

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

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

        3、我的 javascript 还是没学懂

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

来自: keenwon.com