PHP的eval()如何计算行数?

时间:2012-03-26 23:13:55

标签: php eval

我在Magento安装过程中处理了一大堆非常讨厌的第三方代码,我在跟踪它的线程时遇到了一些麻烦。这是我看到的错误消息:

PHP解析错误:语法错误,意外']'在/chroot/home/user/example.com/html/dev4/app/code/local/company/PluginName/Model/Module/License/Light/Performer/ Reader.php(36):eval()'代码(18):eval()'代码(1302):第1行的eval()代码

我已经在Reader.php中确定了eval()链的开头,并且它在第36行。那么之后是带括号的数字,还只是对大块文本中的行引用?我倾向于这么认为,但我不能完全理解这一点。如果是这种情况,eval()'d code(1302)似乎特别可怕。 d:

我会给出更多的上下文,但是代码的许可状态并不是非常清楚,所以我能给出的是这个三重eval()链目前正在破坏它,并且它的第二层被构造像这样:

$s = "$BLOCK_OF_SCRAMBLED_TEXT"
$s2 = '';
for ($i=0;($i+0xB-1)<strlen($s);$i+=11) {
    for ($k = 013-1 ; $k > -1 ; --$k) {
        $s2 .= $s[$i+$k];
    }
}
    eval($s2);

当您在Magento的程序流程之外调整该块时,$s2包含可爱的内容,例如 -

if($license->getModule()->getDecode()) {
    $source = base64_decode($source);
}
...
list($source) = explode("PERFORMER_CLASS_CREATED",$source,2);
$source .=  " */";

ob_start();
eval($source);
ob_end_clean();

那么:我如何追踪eval()这个链到实际导致问题的代码点?

1 个答案:

答案 0 :(得分:1)

这样做的一种方法,虽然单调乏味,但是解码所有内容并在一个文件中一起运行。例如,无论您在哪里看到eval()函数,都是因为它们对要评估的代码进行了去混淆。注释掉线,然后将其转储到屏幕上进行复制并粘贴到新文件中(或者如果您愿意,可以将其直接写入文件)。

$s = "BLOCK_OF_SCRAMBLED_CODE";
$s2 = '';
// Decode scrambled PHP
for ($i=0;($i+0xB-1)<strlen($s);$i+=11) {
   for ($k = 013-1 ; $k > -1 ; --$k) {
      $s2 .= $s[$i+$k];
   }
}
// Don't evaluate, instead output it via your preferred method and copy/paste
// into a new file...
// eval($s2);
var_dump($s2);

我意识到这需要花费时间来解码并重新排列才能正常运行,但错误将会很明显。