【问题标题】:How does PHP's eval() count line numbers?PHP 的 eval() 如何计算行号?
【发布时间】:2025-12-02 00:45:02
【问题描述】:

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

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

我已经在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() 链追踪到实际导致问题的代码点?

【问题讨论】:

  • D:确实,非常非常 D:。
  • 是的,混淆代码?也许您应该修复“许可证状态”并要求发布者进行修复。
  • 通过“许可证状态不明确”,我的意思是,“我们的安装 100% 符合许可证,但我认为他们会很不高兴看到他们的代码在 SO 。”我们正在与他们就修复我们的安装进行谈判,但我怀疑他们是否会修复他们的混乱邪恶软件架构。

标签: php eval


【解决方案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);

我意识到这需要一些时间来解码和重新排列这些片段以使其正常工作,但随后错误就会很明显。

【讨论】:

  • 这是一个很好的建议,是的 - 不幸的是,目前情况已经严重到可能无法正常工作!不过,我会尝试拉动那个线程。
  • 问题的解决方案最终是“将代码踢回原始开发人员,对支持合同做出疯狂的姿态,并发出愤怒的声音”。但是,这个答案很聪明,告诉了我一些我不知道的事情,所以我接受了。