EXE文件中隐藏了JAR文件吗?

11

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

这是怎么实现的?我怎么才能用自己的 JAR 文件实现这个功能呢?


双击EXE文件就可以开始游戏?太疯狂了! - jrharshath
这可能与自解压缩档案(WinZip)的工作方式有关吗?毕竟,Jar基本上是一个Zip归档文件,对吧?实际上,您也可以将Zip文件添加到类路径中,您确定它不是其中之一吗? - Mark Peters
我不这么认为。重命名自解压归档文件并不能神奇地赋予它jar文件的结构... - jrharshath
@此处有狼: 我相信自解压缩归档仍符合Zip文件格式标准,基本上与Jar文件格式相同。 - Mark Peters
在这种情况下,这可能是某种魔法。顺便问一下,你能否发布任何链接来解释这种zip文件的文件格式? - jrharshath
@Mark 哦,没事了,我在你的评论中找到了那个链接 :) - jrharshath
5个回答

11

以前这种做法非常普遍,尤其是在软盘时代,因为存储空间宝贵,而且将解压程序与压缩文件放在不同的磁盘上很麻烦。

之所以可以这样做,是因为zip文件清单结构位于zip文件的末尾,而不是开头,因此只要清单结构不指向初始无关字节(以及jar文件),zip文件就可以包含大量的这些字节。其中一个非常频繁的用途是将一个小的仅限解压程序封装起来,然后解压缩zip文件。

一个可用于添加此类程序的实用工具是unzipsfx。以下是其手册页面: http://linuxcommand.org/man_pages/unzipsfx1.html

看起来Minecraft使用另一种预置程序来调用Java本身。


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


1
感谢您找出Launch4j是包装器!非常有趣。 - Ricket
我已经在一个项目中使用launch4j替换了JSMooth一段时间了。到目前为止没有错误报告。 - Thorbjørn Ravn Andersen

3

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

有些EXE文件实际上是自解压的ZIP文件。而JAR文件则是具有特殊文件结构的普通ZIP文件。我猜你只是在重命名后使用了一个ZIP工具打开它。请注意,某些ZIP工具会自动集成到Windows资源管理器中(或反之),使它变得似乎透明。


转念一想,答案并不完全相同,所以我自己添加了一个答案。我认为 OP 没有在查看自解压缩 ZIP 文件;他们只是使用相同的机制将可执行代码放入 zip 存档中。 - Mark Peters

2
ZIP(以及JAR)文件格式具有灵活性,允许将存档嵌入到另一个文件格式中。这就是使自解压缩ZIP存档成为可能的原因(一些小代码被嵌入到ZIP文件参数确保被解压缩实用程序忽略的区域中)。它也已经被用于一些特别狡猾的攻击中。
我猜想Minecraft同样利用了使存档成为有效的Windows可执行文件的能力,并添加了启动JVM和自身在类路径中的代码。
另请参阅:维基百科:将ZIP与其他文件格式结合使用

哈哈,你的名字一眼看上去和Minecraft创始人Markus Persson如此相似,我曾经一度以为这是他对问题的“官方”回答。 - Ricket

2
Launch4J可以实现这一功能,它的表现非常出色。

开源,但是“Launch4j也可以用于封装闭源的商业应用程序。” - Nicolas Raoul
1
我看了一眼。Minecraft被Launch4j包装。 - Thorbjørn Ravn Andersen

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

JSmooth能否创建一个可重命名为JAR文件并像JAR文件一样处理的exe文件? - jrharshath
jsmooth包装器无法创建有效的jar文件。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接