2010-09-20 15 views
11

Minecraft, un juego de Java, es gratis este fin de semana. La versión de Windows se descarga como un archivo exe. Tenía curiosidad por saber qué está haciendo el archivo EXE y dónde está desempaquetando y ejecutando el juego JAR real. Entonces, al usar un comando, encontré los argumentos de la línea de comando para el proceso javaw.exe en ejecución; y curiosamente, ¡se lanzó con un classpath apuntando al ejecutable! (es decir, el archivo .exe estaba actuando como un contenedor). De hecho, después de cambiar el nombre de Minecraft.exe a Minecraft.jar, pude abrirlo y ver los archivos de la clase del cargador y demás, como si fuera un archivo JAR normal y no un EXE en absoluto.¿JAR oculto dentro de EXE?

¿Cómo es esto posible? ¿Y cómo puedo hacerlo con mis propios archivos JAR?

+0

y haciendo doble clic en el archivo EXE, ¿comienza el juego? Eso es algo loco! – jrharshath

+0

¿Podría estar relacionado con el funcionamiento de los archivos autoextraíbles (WinZip)?Después de todo, Jar es básicamente un archivo Zip, ¿verdad? De hecho, también puede agregar un archivo Zip al classpath, ¿está seguro de que no era uno? –

+0

No lo creo. renombrar un archivo autoextraíble no le dará mágicamente una estructura de archivo jar ... – jrharshath

Respuesta

11

Esto solía ser muy común, especialmente en los días de los disquetes, donde el espacio era precioso y era tedioso para el programa de descompresión estar en un disco diferente al del archivo zip.

La razón por la que puede hacerse es debido a que la estructura del inventario archivo zip se encuentra en el final del archivo zip, no en el frente, por lo que un archivo zip puede contener un gran número de bytes irrelevantes iniciales como siempre que la estructura del inventario no los señale (y por extensión también los archivos jar). Un uso muy frecuente de esto ha sido adjuntar un pequeño programa de descompresión única que luego podría descomprimir el archivo zip.

Una utilidad para anteponer un programa así es el descomprimir. Aquí hay una página de manual para él: http://linuxcommand.org/man_pages/unzipsfx1.html

Parece que Minecraft usa otro programa anterior que invoca Java en sí mismo.


EDIT: Miró dentro con un editor hexadecimal. Minecraft.exe está envuelto con Launch4j.

+1

¡Gracias por descubrir que Launch4j es la envoltura! Muy interesante. – Ricket

+0

Ahora he usado launch4j como reemplazo de JSMooth en un proyecto por un tiempo. No hay informes de error hasta el momento. –

1

Si desea una solución rápida sin profundizar demasiado y usar un contenedor, Jsmooth hace bien su trabajo.

+0

¿creará jsmooth un exe que pueda renombrarse como JAR, * y tratado como un jar *? – jrharshath

+0

Los contenedores jsmooth no crean archivos jar válidos. –

3

después de cambiar el nombre de Minecraft.exe a Minecraft.jar, yo era capaz de abrir y ver los archivos de clase cargador y tales

Algunos archivos EXE se encuentran en archivos ZIP de extracción automática de datos. Los archivos JAR son a su vez archivos ZIP normales con una estructura de archivo especial. Apuesto a que lo estabas abriendo usando una herramienta ZIP después de cambiarle el nombre. Tenga en cuenta que algunas herramientas ZIP se integrarán automáticamente en el Explorador de Windows (o al revés) para que sucedan de forma aparentemente transparente.

+0

Pensándolo bien, las respuestas no son estrictamente las mismas, así que agregué una respuesta yo mismo. No creo que el OP estuviera mirando un archivo ZIP autoextraíble; solo usan el mismo mecanismo para poner código ejecutable en el archivo zip. –

2

El formato de archivo ZIP (y, por extensión, JAR) es flexible, ya que permite que el archivo se incruste en otro formato de archivo. Esto es lo que hace que los archivos ZIP autoextraíbles sean posibles (algunos pequeños códigos están incrustados en áreas que los parámetros del archivo ZIP aseguran son ignorados por las herramientas de descompresión). También se ha usado para algunas hazañas particularmente furtivas.

Supongo que Minecraft explotó de manera similar la capacidad de hacer que el archivo sea un ejecutable de Windows válido y agregó un código para iniciar JVM consigo mismo en el classpath.

Consulte también: Wikipedia: Combining ZIP with other file formats

+0

Jaja, su nombre, a primera vista, es tan similar a Markus Persson (creador de Minecraft) que pensé por un momento que esta era una respuesta "oficial" de la pregunta de él. – Ricket

2

Launch4J hace esto. Es realmente bastante impresionante.

+0

fuente abierta, pero además "Launch4j se puede usar para envolver aplicaciones comerciales de fuente cerrada". –

+1

Miré dentro. Minecraft está envuelto con Launch4j. –

Cuestiones relacionadas