如何解包还原一个phar文件?
发布于 作者:苏南大叔 来源:程序如此灵动~在上一篇文章中,苏南大叔和大家一起学习了phar
文件的创建。在本篇文章中,苏南大叔将继续讲述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
参数的匹配项目。
注意: 但是上述代码对于使用compressFiles
方法的phar文件来说,这就是个陷阱,掉进去之后,不要忘记挣扎几下。对于使用了压缩手段的phar
文件来说,上述代码可以解压到相关文件,但是相关文件打开之后全部是乱码或者空白。
改进版解压代码
对于使用了压缩的phar文件的解压,这里有个不是太合适的poc。因为网上流传的代码中,都没有对压缩版的phar进行特殊处理。所以,在这里,苏南大叔认为可能也许是自己使用的php版本的bug,但是如果您也有类似的问题,不妨试试我这个不合适的poc。
$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
文件,得到代码。如果得到的代码还是乱码,那么请参照上一条解决方案。
相关链接
结论
phar
代码的解包过程,似乎还是要费点周折的。在试图用其他函数方法的解包的时候,也有一些莫名其妙的问题存在。但是对于我们最基本的解包需求来说,本文的内容已经足够了。
如果您想了解更多有关phar的经验文章,欢迎您点击苏南大叔的更多经验文章。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
大佬厉害