Pregunta

Tengo un frasco en el que todos los archivos de clase tienen su número mágico y su tipo eliminado, no estoy muy bien informado sobre este área específica.¿Cuál sería la mejor manera de agregar de nuevo en 0xcafebabe y el tipo de nuevo en cada archivo de clase y reenvasando el frasco?

Editar: He comprobado, solo falta el número mágico, los archivos están intactos si lo agrego manualmente.

¿Fue útil?

Solución

Si desea hacer esto en tiempo de ejecución, podría crear su propio cargador de clases.He adjuntado algún pseudo-código que podría llevarlo en el camino:

public class MyClassLoader extends SecureClassLoader {

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
     ...
     FileInputStream fis = new FileInputStream(brokenClassFile);
     BufferedInputStream bis = new BufferedInputStream(fis);
     ByteArrayOutputStream bas = new ByteArrayOutputStream((int) encryptedClassFile.length());
     byte[] wrongBytes = bas.toByteArray(); 
     byte[] goodbytes = ...     
     // add  a new byte[] and put in the appropiate missing bytes for the cafebabe and magic number
     CodeSource cs = new CodeSource(jarfile.toURI().toURL(), (CodeSigner[]) null);
     return super.defineClass(name, goodbytes, 0, bytes.length, cs);



  }

}

Pero supongo que es mejor simplemente solucionar el archivo JAR utilizando algunas herramientas de sistema operativo.

Otros consejos

Si solo desea agregar el número mágico a los archivos de la clase, podría usar un script de shell simple para esto (suponiendo que esté en Linux, o tenga Cygwin en Windows).

Primero cree un archivo con solo 4 bytes del encabezado (cafebabé).

Luego, extraiga los archivos de clase desde el frasco a algún directorio, y ejecute este comando en la raíz:

find . -name "*.class" | while read file; do
    mv ${file} ${file}-old
    cat /path/to/file/with/header ${file}-old > $file
    rm ${file}-old
done

NOTA: El script anterior funciona en Bash, pero debería poder escribir algo similar para cualquier concha, o incluso para Windows.

¿Pero qué quiere decir con "tener su número mágico y su tipo eliminado "?Si el código bytecode ha sido destrozado de alguna manera, los cambios pueden ser mucho más difíciles de solucionar si no es imposible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top