我正在Magento安装过程中处理一个非常令人讨厌的第三方代码,我在跟踪它的线程时遇到了一些麻烦.这是我看到的错误消息:
PHP解析错误:语法错误,/chroot /home/user/example.com/html/dev4/app/code/local/company/PluginName/Model/Module/License/Light/Performer/Reader.php中的意外']' (36):eval()'d代码(18):eval()'代码(1302):eval()'代码在第1行
我已经确定了eval()链的开头Reader.php,并且它在第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);
Run Code Online (Sandbox Code Playgroud)
当你在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();
Run Code Online (Sandbox Code Playgroud)
那么:我怎样才能追踪eval()到实际导致问题的代码点呢?
实现此目的的一种方法(尽管很乏味)是解码所有内容并将其在一个文件中一起运行。例如,无论您在哪里看到一个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);
Run Code Online (Sandbox Code Playgroud)
我意识到这需要时间来解码和重新排列这些片段以使其发挥作用,但随后错误就会清楚。