距离我上一次认真做逆向,已经过去很久了。这次是因为 Binary Ninja 迎来了 10 周年,全场 35% 折扣。想想这些年我在它前面浪费掉的大量时间,我觉得自己至少该为正版逆向软件付一次钱。于是,趁着打折,我掏了 200 美元。

钱花了,总得找点东西来练手。这正好是一个机会,把之前一直没完成的 ionCube 逆向工程收尾,顺便写一个脱壳器。如果你不了解 ionCube,可以把它理解为一款商业 PHP 编码器:你把 .php 源码丢进去,它会吐出一个混淆后的文件。开头大概长这样:

if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ... Loader for PHP needs to be installed.\n\n");exit(199);?>
后面跟着一大段 HR+cPup6CO3h4Ogt... 之类的数据。

表面上看,它仍然是一个 PHP 文件,可以直接用文本编辑器打开;但真正的代码已经不在明文里,而是被编码成字节码,只有在安装了 ionCube Loader 的 PHP 环境下才能运行。如果 Loader 没装,它只会打印一段安装提示,然后 exit(199)。

我这次要做的,就是顺着文件头部的版本信息、Loader 的校验逻辑和后面的编码数据,把整个文件格式摸清楚。再用 Binary Ninja 写脚本,定位编码函数、还原密钥和变换逻辑,最终把编码后的 PHP 字节码还原成可读的源码

十年前我欠下的逆向债,这下总算开始还了。