《Flappy Pig》被高手破解 “無敵”代碼分析
今天早晨剛起來,看到一個朋友(@Laix)的留言,他留了一段“奇怪的代碼”,說在控制臺執(zhí)行會發(fā)生神奇的事情:
- 1._=~[];_={___:++_,$$$$:(![]+"")[_],__$:++_,$_$_:(![]+"")[_],_$_:++_,$_$$:({}+"")[_],$$_$:(_[_]+"")[_],_$$:++_,$$$_:(!""+"")[_],$__:++_,$_$:++_,$$__:({}+"")[_],$$_:++_,$$$:++_,$___:++_,$__$:++_};_.$_=(_.$_=_+"")[_.$_$]+(_._$=_.$_[_.__$])+(_.$$=(_.$+"")[_.__$])+((!_)+"")[_._$$]+(_.__=_.$_[_.$$_])+(_.$=(!""+"")[_.__$])+(_._=(!""+"")[_._$_])+_.$_[_.$_$]+_.__+_._$+_.$;_.$$=_.$+(!""+"")[_._$$]+_.__+_._+_.$+_.$$;_.$=(_.___)[_.$_][_.$_];_.$(_.$(_.$$+"\""+_.$$$$+(![]+"")[_._$_]+_.$_$_+"\\"+_.__$+_.$$_+_.___+"\\"+_.__$+_.$$_+_.___+"\\"+_.__$+_.$$$+_.__$+".\\"+_.__$+_.$_$+_.__$+"\\"+_.__$+_.$_$+_.$$_+"\\"+_.__$+_.$_$+_.__$+_.__+"();"+"\"")())();
這一坨亂七八糟的代碼,甚至連個字母都沒有。我還是打開Flappy Pig試了一下(chrome或者firefox打開,F(xiàn)12呼出開發(fā)者工具,輸入上面的代碼,回車):
之后按空格鍵開始游戲~~~~~神奇的事情果然發(fā)生了,小豬無敵了,撞在柱子上不會死~~~~~~
下面分析下這位高手是怎么做到的
首先把那段奇怪的javascript“美化”一下:
- _ = ~ [];
- _ = {
- ___: ++_,
- $$$$: (![] + "")[_],
- __$: ++_,
- $_$_: (![] + "")[_],
- _$_: ++_,
- $_$$: ({} + "")[_],
- $$_$: (_[_] + "")[_],
- _$$: ++_,
- $$$_: (!"" + "")[_],
- $__: ++_,
- $_$: ++_,
- $$__: ({} + "")[_],
- $$_: ++_,
- $$$: ++_,
- $___: ++_,
- $__$: ++_
- };
- _.$_ = (_.$_ = _ + "")[_.$_$] + (_._$ = _.$_[_.__$]) + (_.$$ = (_.$ + "")[_.__$]) + ((!_) + "")[_._$$] + (_.__ = _.$_[_.$$_]) + (_.$ = (!"" + "")[_.__$]) + (_._ = (!"" + "")[_._$_]) + _.$_[_.$_$] + _.__ + _._$ + _.$;
- _.$$ = _.$ + (!"" + "")[_._$$] + _.__ + _._ + _.$ + _.$$;
- _.$ = (_.___)[_.$_][_.$_];
- _.$(_.$(_.$$ + "\"" + _.$$$$ + (![] + "")[_._$_] + _.$_$_ + "\\" + _.__$ + _.$$_ + _.___ + "\\" + _.__$ + _.$$_ + _.___ + "\\" + _.__$ + _.$$$ + _.__$ + ".\\" + _.__$ + _.$_$ + _.__$ + "\\" + _.__$ + _.$_$ + _.$$_ + "\\" + _.__$ + _.$_$ + _.__$ + _.__ + "();" + "\"")())();
可以看出,其實_
是個變量(我們平時不會這么命名變量),~ []
就是-1(大家可以執(zhí)行下,不要問我為什么,我還是菜鳥,javascript 基礎(chǔ)不扎實,還沒徹底搞明白),以此類推,代碼可以進一步“美化”(雖然這一步跨的有點大):
- _ = ~ [];
- _ = {
- $$$: 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 ()"
- )()
- )();
最關(guān)鍵的代碼就是后面的(0)[constructor][constructor]
,他實質(zhì)上是執(zhí)行了flappy.init ()
,關(guān)于(0)[constructor][constructor]
的分析看這里,那么我們再次打開 flappy pig,打開開發(fā)者工具,執(zhí)行flappy.init ()
:
沒錯,“小豬”無敵了。
總結(jié):
1、其實核心的就是執(zhí)行一句話flappy.init ()
,這是我的疏忽,再一次初始化游戲,會產(chǎn)生 bug,小豬就無敵了。
2、這位高手用很復(fù)雜代碼,各種拼湊,讓我這種菜鳥各種看不懂的執(zhí)行了flappy.init ()
。
3、我的 javascript 還是沒學懂
4、@Laix 你還真是頑皮啊。