代码分析之-再析《Flappy Pig》被高手破解
前两天看到这篇文章, 有一种IOCCC的风格. 忍不住就做了下面的分析, 不足之处希望有高人不吝赐教, 先在此谢过.
很可惜, 是自动生成的. 不过还是有很多非常值得学习的地方.
_ = ~[]; // -1; /* 利用空数组和弱类型语言特性按位取反的来, 忽略类型js中空数组的值是与false和0相等的 */ _ = { ___ : ++_, // 0, 自增一 $$$$ : (![] + "")[_], // "f", false的第一个字符 /* 很有意思的是, 对空数组取反也是false. 因为空数组实际是存在的, 所以存在的值取反为false. 但是存在的对象转换的值与false相同并不能代表这个对象的值是false. js中false和0也是相等的 */ __$ : ++_, // 1, 自增一 $_$_ : (![] + "")[_], // "a", false的第二个字符 _$_ : ++_, // 2, 自增一 $_$$ : ({} + "")[_], // "b", [object Object]的第三个字符 $$_$ : (_[_] + "")[_], // "d", undefined的第三个字符 _$$ : ++_, // 3, 自增一 $$$_ : (!"" + "")[_],// "e", true的第四个字符 $__ : ++_, // 4, 自增一 $_$ : ++_, // 5, 自增一 $$__ : ({} + "")[_], // "c", [object Object]的第六个字符 $$_ : ++_, // 6, 自增一 $$$ : ++_, // 7, 自增一 $___ : ++_, // 8, 自增一 $__$ : ++_ // 9, 自增一 }; _.$_ = (_.$_ = _ + "")[_.$_$] // "c", [object Object]的第六个字符 + (_._$ = _.$_[_.__$]) // "o", [object Object]的第二个字符 + (_.$$ = (_.$ + "")[_.__$]) // "n", undefined的第二个字符 + ((!_) + "")[_._$$] // "s", false的第四个字符 + (_.__ = _.$_[_.$$_]) // "t", [object Object]的第七个字符 + (_.$ = (!"" + "")[_.__$]) // "r", true的第二个字符 + (_._ = (!"" + "")[_._$_]) // "u", true的第三个字符 + _.$_[_.$_$] // "c", [object Object]的第六个字符 + _.__ // "t", 上面赋值 + _._$ // "o", 上面赋值 + _.$; // "r", 上面赋值 _.$$ = _.$ // "r", 上面赋值 + (!"" + "")[_._$$] // "e", true的第四个字符 + _.__ // "t", 上面赋值 + _._ // "u", 上面赋值 + _.$ // "r", 上面赋值 + _.$$; // "n", 上面赋值 _.$ = (_.___)[_.$_][_.$_]; // Function() /* _.___ 的值是0, _.$_是上面拼的"constructor", 所以就是(0)["constructor"]["constructor"], 0的构造函数式Number(), Number()的构造函数式Function() */ _.$( // Function( _.$( // Function _.$$ // return, 上面拼的 + "\"" // ", 字符串开始 + _.$$$$ // "f", 上面赋值 + (![] + "")[_._$_] // "l", false的第三个字符 + _.$_$_ // "a", 上面赋值 + "\\" // "\" + _.__$ // "1", 上面赋值 + _.$$_ // "6", 上面赋值 + _.___ // "0", 上面赋值 /* "\160", 八进制的"p" */ + "\\" // "\" + _.__$ // "1", 上面赋值 + _.$$_ // "6", 上面赋值 + _.___ // "0", 上面赋值 /* "\160", 八进制的"p" */ + "\\" // "\" + _.__$ // "1", 上面赋值 + _.$$$ // "7", 上面赋值 + _.__$ // "1", 上面赋值 /* "\171", 八进制的"y" */ + ".\\" // ".\" + _.__$ // "1", 上面赋值 + _.$_$ // "5", 上面赋值 + _.__$ // "1", 上面赋值 /* "\151", 八进制的"i" */ + "\\" // "\" + _.__$ // "1", 上面赋值 + _.$_$ // "5", 上面赋值 + _.$$_ // "6", 上面赋值 /* "\156", 八进制的"n" */ + "\\" // "\" + _.__$ // "1", 上面赋值 + _.$_$ // "5", 上面赋值 + _.__$ // "1", 上面赋值 /* "\151", 八进制的"i" */ + _.__ // "t", 上面赋值 + "();" // "();", 函数调用结束 + "\"" // ", 字符串结束 )() // 函数调用结束 /* 构造字符为函数 */ )(); // 函数调用结束
代码中巧妙借用true, false, [object Object]和八进制转义产生字符, 并使用constructor将字符转换为可运行的语句.
本来打算分析下生成网站的源码的, 不过最近实在太忙了. 以后有机会吧.
本文出自 “temp” 博客,转载请与作者联系!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。