WordPress 3.x 版本中的彩蛋

今天笔者在进行 WordPress 博客考古活动时,得知了一个彩蛋。来源见:WordPress 的彩蛋
在 WordPress 文章中使用 Compare Revisions 功能,如果两个相比较的文章 ID 一致,就会触发彩蛋。其效果是显示文字:

Wake up XXX… The matrix has you. Follow the white rabbit. Don’t let this happen again.

这是一个致敬《黑客帝国》的彩蛋。经过对 WordPress 历史版本的分析,发现该彩蛋已在 4.x 版本移除。通过分析 3.0.2 版本的文件,找到了该版本的 revision.phprevision-js.php 文件,并大致研究出了其实现方法。在 revision.php 中有这样一串代码:

1
2
3
4
5
6
// If we're comparing a revision to itself, redirect to the 'view' page for that revision or the edit page for that post
if ( $left_revision->ID == $right_revision->ID ) {
$redirect = get_edit_post_link( $left_revision->ID );
include( './js/revisions-js.php' );
break;
}

而在 revision-js.php 中,有一串经过了 eval 混淆的代码,用于向用户输出彩蛋内容。 目前笔者正在尝试反混淆代码,并复现这个彩蛋。如果你有兴趣,也可以下载 revision-js.php 进行研究。

本文更新于 2017 年 11 月 11 日:
由于笔者并不准备搭建旧版本 WordPress 的运行环境,于是决定从代码入手,分析这个彩蛋。
revisions-js.php 中定义的函数 dvortr() 作用是使用一对一的替换来加密字符串,该文件中有两次调用此函数:

1
dvortr( "Erb-y n.y ydco dall.b aiacbv Wa ce]-irxajt- dp.u]-$-VIr XajtWzaVv" )

1
dvortr( 'Eabi.p!' )

经过解密,其输出分别为

1
Don't let this happen again. <a id='goback' href='$'>Go Back</a>

Danger!
而定义的变量 $j 作用是包含 jQuery 库,$n 是获取的当前用户名,$d 是 noscript 时的输出。通过替换掉一些 WordPress 中定义的函数,笔者成功地使部分解码后的 PHP 文件在本地 Apache 服务器成功运行。并且,笔者还重新制作了这个彩蛋,现在它已经可以在 ZSQ.IM 以某种方式触发~

下面附上整个解密过程中所用到的文件:WordPress-Easter-Egg。其中 revision.phprevisions-js.php 是原文件,decode.php 是部分解密后的文件,decode.js 是浏览器获取的匿名 js 文件,decoder.html 是根据原文件的加密算法编写的加密、解密脚本。