通过php提取自解压exe档案
Posted
技术标签:
【中文标题】通过php提取自解压exe档案【英文标题】:Extracting self-extracting exe archive via php 【发布时间】:2011-06-28 09:19:10 【问题描述】:我有问题。我有服务给我 .exe 文件,他们声称实际上是 zip 存档。自解压档案。 问题是我正在使用我的应用程序(php)将其下载到服务器,并且需要在没有下载到本地计算机的情况下将其提取到那里。 我已经尝试将 .exe 文件下载到本地计算机 - 它在 Windows 上自动解压到 /temp 目录,而不是自动启动 FLASH 播放器。
$zip = zip_open($myfile);给出 print_r($zip): 1 zip->open 也没有结果。 将 .exe 更改为 .zip 不会让 winzip 或 Windows 上的其他类型的解压缩程序打开它 - winzip 也无法打开 .exe。
现在我不知道如何处理它。如果有人可以建议请。
【问题讨论】:
抱歉 - 一个误导性的事实 - 服务器是 linux。 我相信内容——它只是一些用于下载的 Flash 会话——所以我不担心任何“安全” 已排序,生成的文件不是“zip”。只是花了一段时间才弄清楚。我只是仍然不确定如何提取自我 extart zip。无论如何,谢谢大家的帮助。 【参考方案1】:尝试使用system 命令将程序作为可执行文件执行
【讨论】:
+1 因为它是一个 .exe 文件,你不能只将它提供给 zip,解压器将不知道如何处理 PE 头文件和二进制文件。事实上,它会查看第一个字节并发现它们是“MZ”而不是“PK”,然后就会退出。显然,运行可执行文件并非没有安全问题。话虽如此,您应该能够将文件加载到字符串中并搜索0x50 0x4B 0x03 0x00
,这标志着实际 ZIP 数据的开始,假设“它是 ZIP”的声明是正确的(而不是 LZMA 或其他)。将开始的数据提供给 zip 解压缩器。
我用记事本++打开,发现里面有一句话:“这个程序不能在DOS模式下运行。”文件以“MZ”字符开头。【参考方案2】:
从 100% 不信任的外部来源执行文件绝不是一个好主意。
info-zip 版本的 zip 允许您从自解压 zip 文件(带有 -J 标志)中删除 SFX 存根,并将其转换回普通 zip 文件。
源代码免费提供。
制作一个自解压的 zip 文件是在一个 zip 文件前面加上 SFX 二进制代码,然后将二进制存根的大小附加到生成的文件中——但我不确定数据是如何表示的——但是对可用代码进行一些逆向工程应该可以清楚地说明这一点。
【讨论】:
【参考方案3】:嗯...如果您的 PHP 服务器是 Windows,那么将其作为系统命令执行应该不会有问题。否则,这有点棘手。我听说 unzip 系统命令会解压自解压的 zip 文件,但我目前无法访问 Linux 机器来试用它。
如果您使用共享主机,您可能无法做到。
【讨论】:
其实我是在共享主机上,花了一整天的时间试图弄清楚如何做到这一点:/ 嗯,您需要从托管公司那里了解一些事情:服务器是什么操作系统(Windows/Linux)?如果是 Windows,可以将 exes 作为系统命令运行吗? (怀疑他们是否允许这样做)如果是 Linux,您可以将 unzip 作为系统命令运行吗? 它的 Bluehost,架构 x86_64,操作系统 linux。我会在可能的情况下尝试“解压缩”,因为它现在已经崩溃了。【参考方案4】:如果你认为执行exe文件后会提取其中的内容,那么你可以使用exec
函数来运行如下的.exe文件:
exec("d:\\example\\php\_exe\\1436.exe");
你也可以使用system
函数来运行外部程序。
如果你想知道有什么区别:
PHP - exec() vs system() vs passthru()
【讨论】:
以上是关于通过php提取自解压exe档案的主要内容,如果未能解决你的问题,请参考以下文章
使用 php 中的每个循环上传 zip 档案会导致 codeigniter 中 zip 文件中的 zip 档案重复