11

Minecraft是一款 Java 游戏,本周末免费。Windows 版本作为 exe 文件下载。我很好奇 EXE 文件在做什么以及它从哪里解压和运行实际的游戏 JAR。因此,使用命令,我找到了正在运行的 javaw.exe 进程的命令行参数;奇怪的是,它是以指向可执行文件的类路径启动的!(意思是,.exe 文件充当 jar)。事实上,在将 Minecraft.exe 重命名为 Minecraft.jar 之后,我能够打开它并看到加载器类文件等,就好像它是一个普通的 JAR 文件,而不是一个 EXE。

这怎么可能?我怎么能用我自己的 JAR 文件来做呢?

4

5 回答 5

11

这在以前很常见——尤其是在软盘时代,空间很宝贵,解压缩程序与 zip 文件位于不同的磁盘上是很乏味的。

之所以能做到,是因为zip-file的inventory结构位于zip-file的末尾,而不是最前面,所以一个zip文件可以包含大量的初始无关字节,只要inventory结构不存在不要指向它们(以及扩展的 jar 文件)。一个非常常见的用途是包含一个仅解压缩的小型程序,然后可以解压缩 zip 文件。

unzipsfx 是添加此类程序的一个实用程序。这是它的手册页:http: //linuxcommand.org/man_pages/unzipsfx1.html

似乎 Minecraft 使用了另一个在其自身上调用 Java 的前置程序。


编辑:用十六进制编辑器查看内部。Minecraft.exe 是用 Launch4j 包装的。

于 2010-09-21T02:07:42.077 回答
3

将 Minecraft.exe 重命名为 Minecraft.jar 后,我能够打开它并查看加载器类文件等

一些 EXE 文件实际上是自解压 ZIP 文件。JAR 文件又是具有特殊文件结构的普通 ZIP 文件。我敢打赌,您只是在重命名后使用 ZIP 工具打开它。请注意,一些 ZIP 工具会自动集成到 Windows 资源管理器中(或相反),因此它看起来是透明的。

于 2010-09-20T19:08:06.113 回答
2

ZIP(以及扩展名为 JAR)文件格式很灵活,因为它允许将存档嵌入到另一种文件格式中。这就是使自解压 ZIP 存档成为可能的原因(一些小代码嵌入在 ZIP 文件参数确保被解压缩实用程序忽略的区域中)。它也被用于一些特别偷偷摸摸的攻击。

我的猜测是,Minecraft 类似地利用了使存档成为有效的 Windows 可执行文件的能力,并添加了代码以在类路径中启动 JVM。

另请参阅:维基百科:将 ZIP 与其他文件格式相结合

于 2010-09-20T19:23:21.433 回答
2

Launch4J 就是这样做的。这真的很令人印象深刻。

于 2010-09-20T19:57:40.393 回答
1

如果你想要一个快速的解决方案而不需要过多的研究并使用包装器,那么 Jsmooth可以很好地完成它的工作。

于 2010-09-20T19:04:13.587 回答