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

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

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

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

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

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

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

首先把那段奇怪的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 基础不扎实,还没彻底搞明白),以此类推,代码可以进一步“美化”(虽然这一步跨的有点大):

 
 
  1. _ = ~ [];  
  2. _ = {  
  3. $$$: 7  
  4. $$$$: "f" 
  5. $$$_: "e" 
  6. $$_: 6  
  7. $$_$: "d" 
  8. $$__: "c" 
  9. $_$: 5  
  10. $_$$: "b" 
  11. $_$_: "a" 
  12. $__: 4  
  13. $__$: 9  
  14. $___: 8  
  15. _$$: 3  
  16. _$_: 2  
  17. __$: 1  
  18. ___: 0  
  19. };  
  20. _.$_ = "constructor";  
  21. _.$$ = "return" 
  22. _.$ = (0)[constructor][constructor];  
  23. 0["constructor"]["constructor"](  
  24. 0["constructor"]["constructor"](  
  25. "flappy.init ()" 
  26. )()  
  27. )(); 

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

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

没错,“小猪”无敌了。

总结:

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

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

3、我的 javascript 还是没学懂

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

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

THE END