Question

J'ai un pot dans lequel tous les fichiers de classe ont leur numéro magique et leur type supprimé, je ne connaissais pas très bien cette zone spécifique.Quelle serait la meilleure façon de faire de l'ajout dans 0xcafafafebabe et du type dans chaque fichier de classe et de remballer le pot?

Edit: J'ai vérifié, seul le numéro de magie est manquant, les fichiers sont intacts si je l'ajoute manuellement.

Était-ce utile?

La solution

Si vous souhaitez le faire au moment de l'exécution, vous pouvez créer votre propre chargeur de classe.J'ai joint un pseudo-code qui pourrait vous obtenir sur le chemin:

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);



  }

}

Mais je suppose qu'il vaut mieux résoudre le fichier JAR en utilisant une outillage du système d'exploitation.

Autres conseils

Si vous souhaitez simplement ajouter le numéro de magie dans les fichiers de la classe, vous pouvez utiliser un script de shell simple pour cela (en supposant que vous êtes sous Linux ou que vous avez Cygwin sous Windows).

Créez d'abord un fichier avec uniquement les 4 octets de l'en-tête (Cafebabe).

Ensuite, extrayez les fichiers de classe du JAR dans un répertoire et exécutez cette commande à la racine:

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

Remarque: le script ci-dessus fonctionne dans Bash, mais vous devriez pouvoir écrire quelque chose de similaire pour n'importe quel shell, voire pour Windows.

Mais que voulez-vous dire par "avoir leur numéro magique et Type supprimé "?Si le bytecode a été géré de quelque manière que ce soit, les modifications pourraient être beaucoup plus difficiles à réparer sinon impossible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top