代码分析之-再析《Flappy Pig》被高手破解

引用链接:《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” 博客,转载请与作者联系!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。