2011-10-22 7 views
6

Iré directo al grano para que no tenga que leer mucho.Cargador de clase de memoria cifrada Java

Básicamente, tengo un archivo AES-128bit Encrypted Jar. Quiero hacer un iniciador para que pueda cargar este Jar encriptado en la memoria y ejecutarlo (usando la tecla).

Tengo un Class Loader simple que funciona aunque, a menos que lo descifre en un directorio y lo ejecute, obviamente no hará lo que necesito (descifrar & carga de memoria).

TL; DR: Necesito hacer una jarra cifrada AES-128bit en la memoria.

Cualquier ayuda es muy apreciada, no dude en hacer preguntas!

+2

Si quiere que su código sea tan seguro, probablemente no deba escribirlo en uno de los idiomas más fáciles de descompilar. Es posible escribir un cargador de archivos jar pero no hay forma de evitar que las personas lo abandonen de la memoria. – 0x5f3759df

+0

Necesita ser compilado en Java. No porque no pueda codificar en otros idiomas, sino más, otros idiomas no son compatibles con lo que estoy haciendo. –

+0

@ 0x5f3759d Y lo mismo es cierto para C, C#, .. bien absolutamente cualquier idioma. Puede tardar 5 minutos más, pero al final si alguien quiere el archivo jar obtendrá la clave con la suficiente facilidad (establezca un punto de interrupción para CreateFile y consortes en el depurador, tal vez agregue uno para ReadFile con el fd encontrado y obtendrá lo suficientemente fácil). Aunque realmente no veo el problema aquí, ¿qué le impide leer el archivo y descifrarlo si ya tiene su cargador de clases? Es decir. ¿Cuál es tu problema real? – Voo

Respuesta

8

Para código de ejemplo sobre cómo cargar un frasco/clase de byte[] (que debe ser el resultado que se obtiene después de descifrarlo en la memoria/no hay necesidad de guardarlo en cualquier lugar del sistema de archivos) ver http://www.javaworld.com/javaworld/jw-10-1996/indepth/indepth.src.html

Básicamente lo que necesita para usar defineClass para lograr lo que quiere.

pero ten cuidado de que este no ofrece ninguna seguridad real ya que todo termina (después de descifrado) como código de bytes de Java en la memoria y por lo tanto se puede acceder a/manipulado/salvado etc.

Un poco de seguridad sería posible implementando una JVM personalizada y/o pre-JITing el código para que sea nativo ... para obtener información vea por ejemplo How to create encrypted Jar file?

+0

¡Gracias! Voy a probar esto para que sepas cómo funciona. También estaba pensando que una opción más fácil sería crear un archivo temporal que contenga el jar/bytes descifrado. Cargué el contenedor temporal en la memoria y luego lo eliminé de la carpeta temporal. –

+0

de nada ... ¡no olvide votar/marcar como aceptado cualquier respuesta que haya sido de ayuda! – Yahia

+0

Necesito obtener 15 reputación antes de poder votar. ¡Pero me aseguraré de hacerlo cuando llegue a 15 representantes! –

1

This article es una buena lectura que ilustra muy bien por qué la protección hermética de su código simplemente no es posible. Puede hacer que sea más difícil, muy difícil incluso si se mantiene lo más bajo posible, p. compile su código a instrucciones nativas que no sean (limpiamente) representables usando construcciones de lenguaje regulares.

Pero debe tener en cuenta que, en cualquier caso, en última instancia, sus datos cifrados deberán descifrarse utilizando alguna clave y esta clave, aunque sea brevemente, pero lo importante es que terminará en la memoria . No hay forma de evitar esto con sistemas operativos y hardware comunes. Entonces, como pirata informático, siempre puede recurrir a recuperar la clave de la memoria y avanzar desde allí hacia atrás. No es algo que los usuarios promedio sean capaces de hacer, pero ciertamente es posible.

Cuestiones relacionadas