PHP eval()接受在eval()之外可能发生解析错误的内容。这怎么可能?

PHP eval()接受在eval()之外可能发生解析错误的内容。这怎么可能?,php,encoding,eval,obfuscation,deobfuscation,Php,Encoding,Eval,Obfuscation,Deobfuscation,我正在使用一些PHP模糊处理/编码工具,它可以在没有任何服务器端加载程序的情况下工作,我意外地发现了我无法解码的解决方案 我认为自己通常对通过编码和混淆来保护PHP代码的不同解决方案有很好的了解,并且我知道2个基本规则: 如果PHP能够阅读和理解您的代码,那么无论您的代码有多么模糊和编码,您也可以 基于eval()语言构造用法的编码解决方案可以通过输出要作为eval构造中的参数传递的代码(用echo或print替换eval)来实现 在我找到这个工具之前,这些原则一直运作得很好,编码的就是这个

我正在使用一些PHP模糊处理/编码工具,它可以在没有任何服务器端加载程序的情况下工作,我意外地发现了我无法解码的解决方案

我认为自己通常对通过编码和混淆来保护PHP代码的不同解决方案有很好的了解,并且我知道2个基本规则:

  • 如果PHP能够阅读和理解您的代码,那么无论您的代码有多么模糊和编码,您也可以

  • 基于eval()语言构造用法的编码解决方案可以通过输出要作为eval构造中的参数传递的代码(用echo或print替换eval)来实现

在我找到这个工具之前,这些原则一直运作得很好,编码的就是这个代码

<?php
echo "Hello World!";
?>

得到这个:

<?php $_F=__FILE__;$_C0='cl92S3IqSnY0aVlwKWFwNTVwYVl8fEtyKkp2NDlZcClhb2EodWFZNDdySnYnOXNpV0xyOCA4fU9yPksgTFY4IHNKSg0gSjo+ck9KNz05dHNpOXNPIHRpU31Pcj5LOCA+T0lLSn1LSjcgYzhyDQAgS0xKICxqLCBrY1ZPNyBXT3JWJiBuSk84ckkNIFZPSiBdViZyNyBfSU8gbyggTEljTzggSQ0mQj0nNEc/aTk/Pkw+MCFKfUxJICJqSiYmSSAySU8mN0UiRzAhP2k5Pz5MPiByX3ZMSlY3Sk84pzhKDUt2NDRKfUxJdnNWOEpGKKc3Sn1JN0p2JyxrWD43cjNtN2omOHFXJQ19a2FtVi1YPnNvKEZRMmhtc286WTdrYHU3byZaN2sARk5kYlR9agB1c2tuKjdkSVkuI2B1N2thVDYrZlR9agB1czK0QnFvJmMKMjomcQ1iRgpXZlkuajMoNnAzTHFrWD5zKn1GNmozKDZwM0xxa1g+cyp9S3Nrbio3ZEklNi0zKDZvaF19KlgmfStJOn1qAAB9b2E4VjJiAGZtWik2V0tyUTJOT3FwaF03MilaNnJOKnErWgA3LWg4Z2tMJTdqQUYKQmFwN3B9Y31rTFRxcG5MfSpiY3MqbiUKcE4rfSomVDcjWgBzKjVLfSpuVHEytCVmZGZvfWoAAE5wMyg2b3Fdcw1iS3EqtEtWMjopNiZxJn0qWExzKk04WG9uY3EtcUwKak5Mcw0uS31vbkJWMlF1cSphYzcjWW1WLT4mNitNQn1qAHVRb2E4c3BmRmZtUW9OKzgNZmthY1FvOj5RbzhhaHBYSVYtLmN9cFgpc2tgY3FrJm19azpMSlclcnMqYWNxU2Z1aG0pYFZrJm1mak4rfSomVDcjM3BRLS4AfWpoXTdrbis3a25aZmpubVYyKQ1malhJcVNBNVFTM0l9Km4qLFM3STdqWFQ2cjVdN3A3cAoNM0l9azdZUS1oWgoqKSY3I30AfXBYKXNrYGFob05dc2thQjZyLlROKi51N2tuKDcjWVpxMk5dfSq0JVYyYWM2DW5jcWtuQnNrJmNxV0sqc28pJQotNyZWMjdJN2Q+cnNvOlpoQjMlUS1oDXEtYmFoWWFyc2u0Y1ZCfWVgTUxiZk03WVEtaFosI2FMLHIzYH0qJkxzIzMycS1obVYyYWMKK1RdcWsmbywAUCc0NEc/aQ=';$_D=strrev('edoced_46esab');eval($_D('JF9DMD1iYXNlNjRfZGVjb2RlKCRfQzApOyRfQzA9c3RydHIoJF9DMCwnKEEuZ1B0TzZyDVF+p1khLHszTHcwOkhxKVpXSjFkbURYbioKOGBoZkktZbQjNENOUzJhNXZbb2lda007X3hianNsY0IAdSY3eXpVVCtwOT4lRy9GCVZLPX1SRTwnLCc0QU1LPS9yT2luWbRfMQpQfkJoOg14Jlo1a1RlKkR6XVJWbUxzVUpJb1grRkMpYE5TVzk4KH0yPnZHRSVmLVFIYlt1eWc3bGRxpyx3ajM8cDA7IzZ7YXQuYwkhACcpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzApO2V2YWwoJF9SKTskX1I9MDskX0MwPTA7'));?>

对于给定的代码,除了一件我无法解释的事情外,没有什么特别之处:

当我输出要在eval()中作为参数传递的代码时,该代码会生成解析错误。

当然,PHP不会接受这一点:

$_C0=base64_decode($_C0);$_C0=strtr($_C0,'(A.gPtO6r
Q~§Y!,{3Lw0:Hq)ZWJ1dmDXn*
8`hfI-e´#4CNS2a5v[oi]kM;_xbjslcBu&7yzUT+p9>%G/F VK=}RE<','4AMK=/rOinY´_1
P~Bh:
x&Z5kTe*Dz]RVmLsUJIoX+FC)`NSW98(}2>vGE%f-QHb[uyg7ldq§,wj3
$\u C0=base64\u解码($\u C0)$_C0=strtr($_C0,'(A.gPtO6r
Q~§Y!,{3Lw0:Hq)ZWJ1dmDXn*
8`hfI-e´4CNS2a5v[oi]公里;xbjslcBu&7yzUT+p9>%G/F VK=}额定值%F-QHb[Uig7LDQ§,wj3
但这正是在上面的编码脚本的eval()构造中传递的代码,一切正常。 这怎么可能呢?据我所知,Eval构造只不过是将字符串解释为常规PHP代码,如果该字符串在Eval()中包含对PHP不正确的内容,那么如果不使用Eval直接将其传递给脚本,则肯定是相同的

这里的迷雾是什么?

来自PHP手册

eval()返回NULL,除非在求值代码中调用return,否则在 在这种情况下,将返回传递给return的值。如果存在解析 计算代码中出现错误,eval()返回FALSE并执行 以下代码正常继续。无法捕获解析 使用set\u error\u handler()在eval()中出错


您正在打印的base64_解码结果包含一些控制字符,这些字符诱使控制台隐藏代码的某些部分。实际结果如下:

$_C0=base64_decode($_C0);$_C0=strtr($_C0,'(A.gPtO6r^MQ~§Y!,{3Lw0:Hq)ZWJ1dmDXn*
8`hfI-e´#4CNS2a5v[oi]kM;_xbjslcB^@u&7yzUT+p9>%G/F   VK=}RE<','4AMK=/rOinY´_1
P~Bh:^Mx&Z5kTe*Dz]RVmLsUJIoX+FC)`NSW98(}2>vGE%f-QHb[uyg7ldq§,wj3<p0;#6{at.c !^@');$_R=str_replace('__FILE__',"'".$_F."'",$_C0);eval($_R);$_R=0;$_C0=0;
$\u C0=base64\u解码($\u C0);$\u C0=strtr($\u C0),(A.gPtO6r^MQ~§Y!,{3Lw0:Hq)ZWJ1dmDXn*

8`hfI-e´´4CNS2a5v[oi]kM;@u&7yzUT+p9>%G/F VK=}REvGE%F-QHb[维吾尔语7LDQ§,WJ3这意味着你把它弄错了。哇,这
$\u D=strev('edoced'u 46esab'));
是高级加密,lol@PeterSzymkowski当然是base64,你没有理解问题的重点。@Miloshio我甚至没有试图回答这个问题,我只是在这里笑了笑作为
$\u D=strev('edoced\u 46esab');
非常简单stupid@PeterSzymkowski,如果你甚至不愿意阅读这个问题,请不要在这里发布垃圾邮件。提前谢谢你。做得好arnaud576875,我看到你解决了这个问题,但我不明白这些控制字符是什么,以及在php.net文档中存在于何处?我完全不知道这是如何开始的,incorrect代码变成了第二个代码,非常正确?这个答案显然是正确的,但请给我更多解释一下这些“操纵控制台隐藏代码部分的控制字符”是什么,这样我就可以舒服地坐在那里,喝杯啤酒,在心里接受你的答案。明白了!谢谢你的解决方案。
if(time()>1359388391||time()<1359294791)die('<b>This script has been expired.</b><br />Scripts protected using the PHP Guard Trial Version are valid for 24 hours only.');?><?php
echo "Hello World!";
?><?php if(headers_sent())echo(base64_decode('PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NDQwcHg7bGVmdDo1MCU7dG9wOjIwcHg7bWFyZ2luLWxlZnQ6LTI1MHB4O3BhZGRpbmc6OHB4O3BhZGRpbmctbGVmdDo0OXB4O2JvcmRlcjoxcHggc29saWQgIzk5OTtiYWNrZ3JvdW5kOiNmZjkgdXJsKGh0dHA6Ly93d3cucGhwZ3VhcmQubmV0L3NjcmlwdCkgbm8tcmVwZWF0IDI2cHggN3B4O2ZvbnQtZmFtaWx5OlZlcmRhbmEsR2VuZXZhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Y29sb3I6IzY2NjsnIG9uY2xpY2s9J3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7Jz5UaGlzIHNjcmlwdCB3YXMgcHJvdGVjdGVkIHVzaW5nIHRoZSA8YSBocmVmPSdodHRwOi8vd3d3LnBocGd1YXJkLm5ldCcgc3R5bGU9J2NvbG9yOiMwNmM7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXdlaWdodDpib2xkJyB0YXJnZXQ9J19ibGFuayc+UEhQIEd1YXJkPC9hPiBUcmlhbCBWZXJzaW9uLjwvZGl2Pg='));?>
<div style='position:absolute;width:440px;left:50%;top:20px;margin-left:-250px;padding:8px;padding-left:49px;border:1px solid #999;background:#ff9 url(http://www.phpguard.net/script) no-repeat 26px 7px;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#666;' onclick='this.style.display="none";'>This script was protected using the <a href='http://www.phpguard.net' style='color:#06c;text-decoration:underline;font-weight:bold' target='_blank'>PHP Guard</a> Trial Version.</div>