如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

在上一篇文章中,苏南大叔和大家一起学习了phar文件的创建,https://newsn.net/say/php-phar-create.html。在本篇文章中,苏南大叔将继续讲述phar文件的还原。因为我们大家已经知道了:phar文件其实就是一系列php(及其它类型)文件的结合体。所以,如果您拿到了一个phar文件后,肯定会很好奇,里面到底有些什么东西。那么本文的内容,就是为了您满足您的好奇心,而准备的。当然,如果你想修改某个别人提供的phar文件的话,本文的内容也是你需要查看的。

解压无压缩的代码到文件夹

对于没有使用任何压缩手段的phar文件,使用下面的代码即可顺利解压出源代码到文件夹。文件夹是自动创建的。支持自动创建多层文件夹。这里的压缩手段,指的是创建phar文件时的函数方法compressFiles

$phar = new Phar('phar.phar');
//$phar->extractTo('phar2/source/');
$phar->extractTo('phar2/source/',null,true);

但是,如果参数不变,再次执行extractTo的时候,会提示错误,文件已经存在。这个时候,就需要设置extractTo的第三个参数$overwrite了,就是说是否覆盖原文件。而第二个参数$files可以是字符串,也可以是数组,用于指出解压的时候就解压哪几个文件。显然,这个参数顺序安排也是不合理的,显然$overwrite是最大的需求,而$files是其次需求,一般来说,用null来忽略掉这个$files参数的匹配项目。https://doc.php.sh/zh/phar.extractto.html

注意: 但是上述代码对于使用compressFiles方法的phar文件来说,这就是个陷阱,掉进去之后,不要忘记挣扎几下。对于使用了压缩手段的phar文件来说,上述代码可以解压到相关文件,但是相关文件打开之后全部是乱码或者空白。

如何解包还原一个phar文件 - 005

改进版解压代码

对于使用了压缩的phar文件的解压,这里有个不是太合适的poc。因为网上流传的代码中,都没有对压缩版的phar进行特殊处理。所以,在这里,苏南大叔认为可能也许是自己使用的php版本的bug,但是如果您也有类似的问题,不妨试试我这个不合适的poc。

如何解包还原一个phar文件 - 008

$phar = new Phar('phar.phar');
foreach ($phar as $file) {
  file_get_contents($file);
}
$phar->extractTo('phar2', null, true); //提取一份原项目文件目录

就是在上述代码的基础上,增加了个遍历文件加file_get_contents,乱码就会正常。显然,这个poc不是很合适。但是,确实达到了我们的目的。当然,苏南大叔也实验了decompress()decompressFiles()这两个方法,并没有得到想要的结果。当然,如果您有什么好的见解,请留言给我。谢谢。

直觉上,这个extractTo函数调用过程中,可能存在着一个异步的解压过程。所以这个时机控制的不是很好,就导致了上述莫名其妙的问题了。

转格式为zip,再解压zip

这个代码仅仅是个途径参考,不如上边的方案来的直接。我们先把phar.phar,转化格式为phar.zip,然后再解压zip文件,得到代码。如果得到的代码还是乱码,那么轻参照上一条方案的poc。

@unlink('phar.zip');
$phar = new Phar('phar.phar');
$phar->convertToData(Phar::ZIP); //另外再提取一份zip
$zip = new ZipArchive;
if ($zip->open('phar.zip') === TRUE) {
    $zip->extractTo('phar3/');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

结论

phar代码的解包过程,似乎还是要费点周折的。在试图用其他函数方法的解包的时候,也有一些莫名其妙的问题存在。但是对于我们最基本的解包需求来说,本文的内容已经足够了。

如果您想了解更多有关phar的经验文章,欢迎您点击苏南大叔的更多经验文章。https://newsn.net/tag/phar/

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。