2012-05-19 8 views
0

У меня есть банка, в которой все файлы классов имеют свое магическое число и тип удалены, я не очень хорошо осведомлен об этой конкретной области. Каким будет лучший способ добавить обратно в 0XCAFEBABE и тип обратно в каждый файл классов и переупаковать банку?Вставка магического номера в файлы классов

EDIT: я проверил, только магия номер отсутствует, файлы не повреждены, если я добавлю его вручную.

+1

Почему бы просто не взглянуть на исходный код java? (У меня такое чувство, что я знаю ответ на этот вопрос) –

+0

@HovercraftFullOfEels: Я думаю, что OP спрашивает об этом: http://en.wikipedia.org/wiki/Java_class_file#Magic_Number, который не имеет никакого отношения к исходному коду. –

+2

Как было удалено магическое число? Кажется, это очень странно, и я сомневаюсь, что дальнейший урон не будет. –

ответ

0

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

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); 



    } 

} 

Но я думаю, что лучше просто исправить файл банку с помощью некоторых ОС инструментов.

0

Если вы просто хотите добавить магическое число обратно к файлам классов, вы можете использовать для этого простой сценарий оболочки (если вы находитесь в 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 

Примечание: Данный скрипт работает в Баш, но вы должны быть в состоянии написать что-то подобное для любой оболочки или даже для Windows.

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