Вставка магического номера в класс файлов
-
11-12-2019 - |
Вопрос
У меня есть банка, в которой все классные файлы имеют свой магический номер, а тип удалены, я не очень хорошо осведомлен об этой конкретной области.Что было бы лучшим способом поступить в 0xcafebabe и обратно в каждый класс и переупаковки банку?
Редактировать: Я проверил, только волшебное число отсутствует, файлы не повреждены, если я добавлю его вручную.
Решение
Если вы хотите сделать это во время выполнения, вы можете создать свой собственный класс загрузки.Я приложил некоторый псевдо-код, который может заставить вас в пути:
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);
}
}
.
Но я думаю, что лучше просто исправить файл JAR, используя некоторые ОС.
Другие советы
Если вы просто хотите добавить магический номер обратно в файлы классов, вы можете использовать простой скрипт оболочки для этого (при условии, что вы находитесь на Linux или Cygwin в Windows).
Сначала создайте файл только с 4 байтами заголовка (cafebabe).
Затем извлеките файлы классов из банки в какой-то каталог и запустите эту команду в корне:
find . -name "*.class" | while read file; do
mv ${file} ${file}-old
cat /path/to/file/with/header ${file}-old > $file
rm ${file}-old
done
.
Примечание. Приведенный выше скрипт работает в Bash, но вы сможете написать что-то подобное для любой оболочки или даже для Windows.
Но что вы подразумеваете под «их волшебным числом и