springs rentals noticias news independent glenwood daily colorado classified java class classloader antivirus

java - rentals - post independent glenwood springs classified



¿Reemplazando la clase java? (1)

Estoy trabajando en una función de espacio aislado para mi antivirus java, y me he preguntado: ¿el paquete especificado en una clase es importante para la compilación?

Ejemplo: estoy ejecutando un programa que quiere usar Runtime.getRuntime().exec() , cuando el cargador de clases intenta cargar eso para ejecutar un método, ¿comprueba el paquete calificado en el archivo, si existen? Preferiría no intentar cambiar los archivos en la JVM, sino simplemente cargar los de un paquete diferente. Puedo llevar a cabo la carga y tal, pero mi único dilema, ¿se estrellará y arderá? Dentro de java, se registraría como, por ejemplo, java.lang.Runtime , pero el código compilado dirá, por ejemplo, pkg.pkg.Runtime y ¿tendrá que extender el viejo tiempo de ejecución? Mi suposición es que extender el tiempo de ejecución anterior simplemente lo rompería. ¿Alguien sabe algo de esto? Estoy trabajando en hacer un ejemplo comprobable, pero aún estoy un poco lejos y quería obtener algunas respuestas, y esto podría beneficiar a algunas personas.


¿El paquete especificado en una clase es importante para la compilación?

Sí, sí importa. Una clase llamada pkg.pkg.Runtime() no se puede cargar como si fuera java.lang.Runtime .

Además, si mi memoria es correcta, la JVM tiene algunas medidas de seguridad adicionales para evitar que las aplicaciones normales inyecten clases en paquetes principales como java.lang .

Si necesita cambiar el comportamiento de la clase java.lang.Runtime (¡con fines experimentales!), Entonces creo que deberá colocar su versión modificada en el classpath de inicio , antes del archivo "rt.jar".

Sin embargo:

  • Este nivel de retoque puede resultar fácilmente en inestabilidad de JVM; es decir, bloqueos difíciles de JVM que son difíciles de diagnosticar.

  • Si su objetivo es producir una herramienta de "calidad de producción", entonces encontrará que las cosas que involucran retoques con la JVM no se consideran aceptables. Las personas van a desconfiar mucho de las instrucciones de instalación que dicen cosas como "agregar esto al compilado inicial de JVM de la JVM".

  • La distribución de una JVM "modificada" puede incumplir el acuerdo de licencia de Oracle de Java.

Mi consejo sería buscar una forma menos intrusiva de hacer lo que estás tratando de hacer. Por ejemplo, si está intentando hacer una comprobación de virus, hágalo fuera de la JVM o en un cargador de clases de aplicación personalizado.

Usted comentó:

Tengo un cargador de clases personalizado, mi pregunta es: si compilo una clase etiquetada como digamos, pkg.pkg.Runtime, ¿puedo registrarme en mi cargador de clases como java.lang.Runtime?

Como dije antes, no, no puedes. Un archivo de código de bytes tiene el nombre de clase incrustado en él. Si intenta "mover rápidamente" cargando una clase con un nombre diferente, la JVM arrojará un Error .

Y:

Si no, ¿cómo puedo reemplazar la clase? Si el nombre del paquete compilado tiene que ser igual al nombre de la solicitud, ¿puedo modificar el archivo .class para que coincida, o quizás compilarlo como si estuviera en el paquete java.lang?

Eso es lo que tendrías que hacer. java.lang.Runtime nombrar la clase java.lang.Runtime en el código fuente y compilarlo como tal.

Pero lo que quise decir con mi consejo anterior es que debes usar el virus para verificar el cargador de clases. Olvídate de intentar reemplazar / modificar el comportamiento de Runtime . Es una mala idea por las razones que enumeré arriba.