Вставка магического числа в файлы классов

У меня есть банка, в котором удалены все файлы классов и их магический номер и тип, я не очень осведомлен об этой конкретной области. Что было бы лучшим способом добавить обратно в 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.

Но что вы подразумеваете под " удалить их магический номер и тип "? Если байт-код был искажен каким-либо образом, изменения могут быть гораздо сложнее исправить, если не невозможно.

Другие вопросы по тегам