Insertion de nombre magique dans les fichiers de classe
-
11-12-2019 - |
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.
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.