JAR спрятан внутри EXE? - PullRequest
       23

JAR спрятан внутри EXE?

11 голосов
/ 20 сентября 2010

Minecraft , игра Java, бесплатна в эти выходные. Версия для Windows загружается как исполняемый файл. Мне было любопытно, что делает EXE-файл и откуда он распаковывает и запускает сам игровой JAR-файл. Поэтому, используя команду, я нашел аргументы командной строки для запущенного процесса javaw.exe; и как ни странно, он был запущен с указанием пути к классу для исполняемого файла! (имеется в виду, что файл .exe действовал как jar). Действительно, после переименования Minecraft.exe в Minecraft.jar я смог открыть его и посмотреть файлы классов загрузчика и тому подобное, как если бы это был обычный файл JAR, а не EXE-файл вообще.

Как это возможно? И как я могу сделать это с моими собственными файлами JAR?

Ответы [ 5 ]

11 голосов
/ 21 сентября 2010

Раньше это было очень распространенным явлением, особенно во времена гибких дисков, когда пространство было драгоценным, и разархивировать программу было утомительно на диске, отличном от zip-файла.

Причина, по которой это можно сделать, заключается в том, что структура инвентаризации zip-файлов расположена в end zip-файла, а не на передней части, поэтому zip-файл может содержать большое количество исходных нерелевантные байты до тех пор, пока структура инвентаря не указывает на них (и, соответственно, на jar-файлы расширения). Чаще всего для этого использовалась небольшая программа, предназначенная только для распаковки, которая затем могла бы распаковать файл zip.

Одной из утилит для добавления такой программы является unzipsfx. Вот справочная страница для этого: http://linuxcommand.org/man_pages/unzipsfx1.html

Похоже, что Minecraft использует другую предварительно созданную программу, которая сама вызывает Java.


EDIT: заглянул внутрь с помощью шестнадцатеричного редактора. Minecraft.exe упакован с Launch4j.

3 голосов
/ 20 сентября 2010

после переименования Minecraft.exe в Minecraft.jar, я смог открыть его и посмотреть файлы классов загрузчика и тому подобное

Некоторые EXE-файлы фактически являются самораспаковывающимися ZIP-файлами. JAR-файлы, в свою очередь, являются обычными ZIP-файлами со специальной файловой структурой. Могу поспорить, что вы просто открыли его с помощью инструмента ZIP после переименования. Обратите внимание, что некоторые инструменты ZIP автоматически интегрируются в проводник Windows (или наоборот), так что это происходит на первый взгляд прозрачно.

2 голосов
/ 20 сентября 2010

Launch4J делает это. Это действительно впечатляет.

2 голосов
/ 20 сентября 2010

Формат файла ZIP (и, соответственно, JAR) является гибким в том смысле, что он позволяет встраивать архив в другой формат файла.Это то, что делает возможным самораспаковывающиеся архивы ZIP (некоторый небольшой код встроен в области, которые, как гарантируют параметры файла ZIP, игнорируются утилитами распаковки).Он также использовался для некоторых особенно хитрых эксплойтов.

Я предполагаю, что Minecraft аналогичным образом использовал возможность сделать архив допустимым исполняемым файлом Windows и добавил код для запуска JVM с самим собой в пути к классам.

См. Также: Википедия: Объединение ZIP с другими форматами файлов

1 голос
/ 20 сентября 2010

Если вам нужно быстрое решение без особых затрат и использования обертки, Jsmooth хорошо справляется со своей задачей.

...