Pergunta

Existe um utilitário semelhante ao OllyDbg/SoftICE para java?Ou sejaexecutar classe (do jar / com caminho de classe) e, sem código-fonte, mostrar a desmontagem do código intermediário com capacidade de percorrer / passar por cima / procurar referências / editar código intermediário específico na memória / aplicar edição ao arquivo...

Caso contrário, é possível escrever algo assim (assumindo que estamos dispostos a viver sem hotspot durante a depuração)?

Editar:Não estou falando de JAD ou JD ou Cavaj.Esses são bons descompiladores, mas não quero um descompilador por vários motivos, o mais notável é que sua saída está incorreta (na melhor das hipóteses, às vezes simplesmente errada).Não estou procurando por "bytes compilados para código Java" mágicos - quero ver os bytes reais que estão prestes a ser executados.Além disso, gostaria de poder alterar esses bytes (assim como em um depurador de montagem) e, com sorte, gravar a parte alterada de volta no arquivo de classe.

Editar2:Eu sei que o javap existe - mas ele funciona apenas de uma maneira (e sem qualquer tipo de análise).Exemplo (código retirado da documentação do vmspec):No código java, usamos "javac" para compilar isto:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

para um arquivo java .class.Usando javap -c posso obter esta saída:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

Tudo bem para a parte de desmontagem (não é muito bom sem análise - "campo nº 4 é Exemplo.i"), mas não consigo encontrar as outras duas "ferramentas":

  1. Um depurador que analisa as próprias instruções (com pilha, despejos de memória, etc.), permitindo-me examinar o código e o ambiente reais.
  2. Uma forma de reverter o processo - edite o código desmontado e recrie o arquivo .class (com o código editado).
Foi útil?

Solução

Não acho que esta seja realmente uma resposta completa, mas algumas dicas que podem fornecer algo viável:

(1) Em termos de visualização e trabalho direto com bytecode, o antigo Kit de construção da classe BCEL pode ser útil (é o único editor GUI para bytecode que conheço).

(2) Em termos de depuração e análise do bytecode, este plugin do Eclipse, que se integra ao depurador do Eclipse pode atender às suas necessidades.

Não conheço nenhum utilitário que combine esses recursos e permita manipular o bytecode enquanto o código está sendo executado (pelo menos da mesma maneira que você faz no OllyDbg, etc.).No entanto, o Java API do depurador deve ser capaz de suportar a manipulação do código em tempo de execução (embora, dada a natureza do HotSpot e do JIT em geral, não sei se seria possível reescrever uma instrução pouco antes de ela ser invocada --- o bytecode atualmente em execução opcode é realmente uma abstração de como o intérprete escolhe implementar a operação, ao contrário do código nativo onde o opcode desmontado é, na verdade, a instrução enviada para a CPU).Alternativamente, você pode olhar para o API de instrumentação Java que fornece uma maneira de redefinir o código de bytes em tempo de execução.E claro, qualquer uma das várias bibliotecas de manipulação de bytecode de código aberto pode ser capaz de ajudar ou fornecer inspiração.

E, claro, sempre existe a opção de contornar toda a infraestrutura da JVM e simplesmente anexar um depurador ao processo da JVM.Há alguma discussão sobre isso nesta questão e assim por diante esta página vinculada a essa pergunta.

O resultado final, entretanto, é que o que você parece estar tentando realizar, embora seja comum no mundo do código nativo, não é uma prática tão comum no mundo Java (parte da razão para usar Java é a abstração de todos os detalhes sangrentos).Isso e a natureza relativamente trivial da descompilação de código de bytes (em comparação com, digamos, C++) levaram a uma situação em que esse tipo de requisito é escasso, assim como esse tipo de ferramenta.

Outras dicas

Dar uma olhada em Jad Decompier Para descompilar o código Java. Você pode executar o depurador embutido de um IDE usando fontes produzidas. O IDE pode ser Intellij, Eclipse ou Netbeans. Essa abordagem não é completamente automática, mas deve fazer o trabalho.

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