Inserimento del numero magico nei file di classe
-
11-12-2019 - |
Domanda
Ho un barattolo in cui tutti i file di classe hanno il loro numero magico e il tipo rimosso, non sono molto ben informato su questa specifica area.Quale sarebbe il modo migliore per accedere a 0xcafebabe e il tipo di ritorno in ogni classfile e reinserire il barattolo?
Modifica: Ho controllato, manca solo il numero magico, i file sono intatti se lo aggiungo manualmente.
Soluzione
Se desideri farlo in fase di esecuzione, potresti creare il tuo cardografico.Ho allegato un po 'di pseudo-codice che potrebbe farti arrivare in arrivo:
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);
}
}
.
Ma immagino sia meglio risolvere il file JAR utilizzando alcuni strumenti OS.
Altri suggerimenti
Se vuoi semplicemente aggiungere il numero magico ai file di classe, è possibile utilizzare un semplice script di shell per questo (supponendo che tu sia su Linux o avere cygwin su Windows).
Prima crea un file con solo i 4 byte dell'intestazione (Cafebabe).
Quindi, estrai i file di classe dal barattolo a una directory e eseguire questo comando alla radice:
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: lo script sopra funziona in Bash, ma dovresti essere in grado di scrivere qualcosa di simile per qualsiasi shell, o anche per Windows.
Ma cosa intendi per "avere il loro numero magico e Tipo rimosso "?Se il bytecode è stato manglato in alcun modo, i cambiamenti potrebbero essere molto più difficili da risolvere se non impossibile.