Pergunta

Eu tenho um jarro em que todos os arquivos de classe tem a sua magia, número e tipo removido, eu não tenho muito conhecimento sobre esta área específica.Qual seria a melhor maneira de ir sobre a adição de volta em 0XCAFEBABE e o tipo de volta para cada classfile e reembalagem o frasco?

EDITAR:tenho verificado, apenas o número mágico é ausente, os arquivos estão intactos, se eu adicioná-lo manualmente.

Foi útil?

Solução

Se você gostaria de fazer isto em tempo de execução, você pode criar o seu próprio carregador de classe.Anexei algumas pseudo-código que pode ficar no caminho:

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



  }

}

Mas eu acho que é melhor apenas de corrigir o arquivo jar usando alguns sistemas operacionais, ferramentas.

Outras dicas

Se você apenas deseja adicionar o número mágico de volta para a classe de arquivos, você pode usar um simples script de shell para este (supondo que você estiver no Linux, ou ter o Cygwin no Windows).

Primeiro crie um arquivo com apenas 4 bytes de cabeçalho (CAFEBABE).

Em seguida, extraia os arquivos de classe do frasco, para algum diretório e execute este comando na raiz:

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:O script acima funciona em bash, mas você deve ser capaz de escrever algo semelhante para qualquer shell, ou mesmo para o Windows.

Mas o que você quer dizer com "ter o seu número mágico e tipo removido"?Se o bytecode foi deturpado de qualquer forma, as alterações podem ser muito mais difícil de resolver, se não impossível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top