Вставка магического числа в файлы классов
У меня есть банка, в котором удалены все файлы классов и их магический номер и тип, я не очень осведомлен об этой конкретной области. Что было бы лучшим способом добавить обратно в 0XCAFEBABE и тип обратно в каждый файл класса и перепаковать jar?
РЕДАКТИРОВАТЬ: я проверил, отсутствует только магическое число, файлы не повреждены, если я добавлю его вручную.
2 ответа
Если вы хотите сделать это во время выполнения, вы можете создать свой собственный загрузчик классов. Я приложил некоторый псевдокод, который может помочь вам в пути:
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).
Затем извлеките файлы классов из jar в какой-нибудь каталог и выполните эту команду в корне:
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.
Но что вы подразумеваете под " удалить их магический номер и тип "? Если байт-код был искажен каким-либо образом, изменения могут быть гораздо сложнее исправить, если не невозможно.