2010-09-20 20 views
11

Minecraft,Java遊戲,本週末免費。 Windows版本作爲exe文件下載。我很好奇EXE文件在做什麼以及它在哪裏解包並運行實際的遊戲JAR。所以使用一個命令,我找到了正在運行的javaw.exe進程的命令行參數;奇怪的是,它是通過指向可執行文件的類路徑啓動的! (意思是,.exe文件充當一個jar)。事實上,將Minecraft.exe重命名爲Minecraft.jar後,我能夠打開它並查看加載器類文件等,就好像它是普通的JAR文件,而不是EXE。隱藏在EXE內部的JAR?

這怎麼可能?我怎樣才能用我自己的JAR文件做到這一點?

+0

並雙擊EXE文件啓動遊戲?這是一些瘋狂的東西! – jrharshath 2010-09-20 19:04:12

+0

這可能與如何自解壓檔案工作(WinZip)有關?畢竟Jar基本上是一個Zip存檔,對吧?實際上,你也可以在類路徑中添加一個Zip文件,你確定它不是一個? – 2010-09-20 19:07:11

+0

我不這麼認爲。重命名自解壓存檔不會神奇地給它一個jar文件結構... – jrharshath 2010-09-20 19:07:46

回答

11

以前使用過這種軟件非常普遍 - 尤其是在軟盤空間非常寶貴的時代,解壓縮程序與zip文件在不同的磁盤上很繁瑣。

可以這樣做的原因是因爲壓縮文件清單結構位於壓縮文件的而不是前端,所以壓縮文件可以包含大量初始不相關字節,只要庫存結構不指向他們(也可以通過擴展jar文件)。對此非常頻繁的使用是附上一個小的解壓縮程序,然後解壓zip文件。

預先安裝這樣一個程序的一個工具是unzipsfx。這裏是它的手冊頁面: http://linuxcommand.org/man_pages/unzipsfx1.html

看來Minecraft使用另一個自行調用Java的預編程序。


編輯:看着裏面用十六進制編輯器。 Minecraft.exe是用Launch4j包裝的。

+1

感謝您指出Launch4j是包裝!很有意思。 – Ricket 2010-09-24 15:00:23

+0

我現在已經在一個項目中用了launch4j作爲JSMooth的替代品。到目前爲止沒有錯誤報告。 – 2013-12-13 14:47:11

1

如果你想要一個快速的解決方案,而不需要太多的研究和使用包裝,Jsmooth可以很好地工作。

+0

將jsmooth創建一個可以重命名爲JAR,*和像一個jar * *對待? – jrharshath 2010-09-20 19:06:09

+0

jsmooth包裝程序不會創建有效的jar文件。 – 2010-09-21 02:01:48

3

重命名Minecraft.exe到Minecraft.jar後,我能打開它,看看裝載機類文件,這樣

一些EXE文件其實都是自解壓ZIP文件。 JAR文件又是普通的ZIP文件,具有特殊的文件結構。我敢打賭,你只是在重命名後使用ZIP工具打開它。請注意,一些ZIP工具將在Windows資源管理器中自動整合(或者相反),以便它看似透明。

+0

第二個想法,答案不完全一樣,所以我自己添加了一個答案。我不認爲OP在看一個自解壓ZIP文件;他們只是使用相同的機制將可執行代碼放入zip壓縮文件中。 – 2010-09-20 19:23:51

2

ZIP(和擴展名爲JAR)文件格式的靈活性在於它允許將檔案文件嵌入到另一種文件格式中。這就是使得自解壓ZIP存檔成爲可能的原因(一些小代碼嵌入ZIP文件參數確保被解壓縮實用程序忽略的區域)。它也被用於一些特別偷偷摸摸的攻擊。

我的猜測是Minecraft同樣利用了將存檔設置爲有效的Windows可執行文件並添加了代碼以在類路徑中啓動JVM。

參見:Wikipedia: Combining ZIP with other file formats

+0

哈哈,乍一看,你的名字與Markus Persson(我的世界的創造者)非常相似,我認爲這是他的一個「官方」問題的答案。 – Ricket 2010-09-24 14:58:27

2

Launch4J做到這一點。這真的很令人印象深刻。

+0

開源,但除此之外,「Launch4j可用於封裝源代碼,商業應用程序。」 – 2010-09-21 06:13:23

+1

我偷看了。我的世界是用Launch4j包裝的。 – 2010-09-24 09:25:49