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

jopen 11年前發布 | 7K 次閱讀 代碼

        今天早晨剛起來,看到一個朋友(@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
                    <span id="shareA4" class="fl">                          </span>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!