Как PHP eval () считает номера строк? - PullRequest
5 голосов
/ 27 марта 2012

Я имею дело с очень неприятным фрагментом стороннего кода в середине установки Magento, и у меня возникли небольшие проблемы с его потоками.Вот сообщение об ошибке, которое я вижу:

Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное ']' в /chroot/home/user/example.com/html/dev4/app/code/local/company/PluginName / Модель / Модуль / Лицензия / Свет / Исполнитель / Reader.php (36): код d eval () (18): код d eval () (1302): код eval () в строке 1

Я определил начало цепочки eval () в Reader.php, и он находится в строке 36. Значит, эти числа в скобках после этого также являются просто ссылками на строки внутри больших блоков текста?Я склонен верить в это, но я не могу понять это самостоятельно.Если это так, то eval()'d code(1302) кажется особенно ужасным.D:

Я бы дал больше контекста, но статус лицензии кода не очень ясен, поэтому я могу лишь сказать, что эта цепочка triple-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 Ответ

1 голос
/ 27 марта 2012

Один из способов сделать это, хотя и утомительно, - это декодировать все и запускать все это вместе в одном файле. Например, везде, где вы видите функцию 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);

Я понимаю, что потребуется время для того, чтобы части были декодированы и переставлены, чтобы они работали, но тогда ошибка будет ясна.

...