【问题标题】:JAR hidden inside EXE?JAR 隐藏在 EXE 中?
【发布时间】:2011-04-14 20:23:48
【问题描述】:

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

这怎么可能?我怎样才能用我自己的 JAR 文件做到这一点?

【问题讨论】:

  • 然后双击EXE文件开始游戏?那是一些疯狂的东西!
  • 这可能与自解压档案 (WinZip) 的工作方式有关吗?毕竟 Jar 基本上是一个 Zip 存档,对吧?实际上,您也可以将 Zip 文件添加到类路径中,您确定不是吗?
  • 我不这么认为。重命名自解压档案不会神奇地给它一个 jar 文件结构...
  • @Here Be Wolves:我很确定自解压存档仍然符合 Zip 文件格式标准,与 Jar 文件格式基本相同。
  • 在那种情况下,这可能是一种神奇的东西。顺便说一句,你能发布任何链接来解释这种 zip 文件的文件格式吗?

标签: java jar executable-jar


【解决方案1】:

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

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

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

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


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

【讨论】:

  • 感谢您发现 Launch4j 是包装器!很有趣。
  • 我现在在一个项目中使用 launch4j 作为 JSMooth 的替代品已经有一段时间了。到目前为止没有错误报告。
【解决方案2】:

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

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

【讨论】:

  • 再想一想,答案并不完全相同,所以我自己添加了一个答案。我不认为 OP 正在查看自解压 ZIP 文件。他们只是使用相同的机制将可执行代码放入 zip 存档中。
【解决方案3】:

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

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

另见:Wikipedia: Combining ZIP with other file formats

【讨论】:

  • 哈哈,乍一看,你的名字与 Markus Persson(Minecraft 的创造者)非常相似,以至于我一度以为这是他对这个问题的“官方”回答。
【解决方案4】:

Launch4J 做到了这一点。真的很让人印象深刻。

【讨论】:

  • 开源但另外“Launch4j 可用于封装封闭源代码的商业应用程序。”
  • 我偷看了里面。 Minecraft 使用 Launch4j 进行包装。
【解决方案5】:

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

【讨论】:

  • jsmooth 会创建一个可以重命名为 JAR 的 exe,并像 jar 一样处理
  • jsmooth 包装器没有创建有效的 jar 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多