淘先锋技术网

首页 1 2 3 4 5 6 7
PHP Packer是一种通用的工具,可将PHP脚本进行代码转换和压缩,而这种转换不会影响脚本本身的功能,同时还大大减少了脚本的大小。但有时候,我们需要将已经压缩的PHP脚本解压缩,进行分析和调试。本文将介绍如何解压PHP Packer压缩的文件,同时伴随着详细的代码说明和举例。
首先,了解一下PHP Packer的原理,PHP Packer生成的压缩包一般是包含了两部分内容:第一部分是解码函数,主要负责对第二部分加密的PHP脚本进行解密;第二部分是加密的PHP脚本。那么如何解压PHP Packer打包成的文件呢?
解压PHP Packer打包成的文件,其实就是执行第一部分解码函数,将第二部分的加密的PHP脚本进行解密。解码函数通常都是固定的,我们通过查找反混淆的手法,可以找到解码函数的具体位置,手工将函数提取成一个独立的PHP文件。例如,下面这个PHP Packer压缩的脚本:
eval(gzinflate(base64_decode('HrMNas ... ')));

其中,eval()函数中的一串Base64编码的字符就是加密的PHP脚本,那么我们需要将这段加密的PHP脚本解密出来。在这种情况下,我们需要首先将加密的PHP脚本解密成明文,然后再将明文通过eval()函数进行执行。
解密加密的PHP脚本,可以通过以下代码实现:
$packed = 'HrMNas ...';
$code = gzinflate(base64_decode($packed));
eval($code);

其中,$packed变量中是第二部分加密的PHP脚本。我们首先使用base64_decode()函数将Base64编码的字符串解码成原始的二进制数据,而后再使用gzinflate()函数将二进制数据解压为明文PHP代码。
下面,我们举一个示例,演示如何解压一个PHP Packer打包的脚本:
function myeval($code){    
return eval($code);
}
<br>
function decode($packed){
$code = gzinflate(base64_decode($packed));
$code = preg_replace(array('{\\\x([0-9a-fA-F]{2})}', '{\\\([0-7]{3})}'), array('chr(hexdec("$1"))', 'chr(octdec("$1"))'), $code);
<br>
    if (strpos($code, 'eval(') !== false){
$code = preg_replace_callback('#eval\((.*)\)#i', function($m){
$packed = $m[1];
$packed = strtr($packed, array('\\\\' => '\\'));
return 'myeval(decode("'.$packed.'"))';
}, $code);
}
return $code;
}
<br>
$packed = 'HrMNas ...';
echo decode($packed);

其中,decode()函数就是PHP Packer的解码函数,通过解码函数可以将加密的PHP脚本转换成明文PHP脚本。函数中使用preg_replace()函数,将\x和\\两种形式的转义字符解码成二进制数据,并使用myeval()函数执行所有的eval()函数,最后输出解密后的PHP脚本。
总之,PHP Packer虽然可以有效地保护PHP代码的安全,但在需要调试或进行分析时,需要使用解码函数将加密的PHP脚本解密出来。本文简单介绍了如何使用PHP代码将加密的 PHP脚本解密出来。