Como faço para "descompilar" arquivos de classe Java? [fechadas]

556

Qual programa posso usar para descompilar um arquivo de classe? Na verdade, receberei o código Java ou é apenas o código de montagem da JVM?

Nas questões de desempenho do Java neste site, muitas vezes vejo respostas de pessoas que "descompilaram" o arquivo de classe Java para ver como o compilador otimiza certas coisas.

Kip
fonte
4
A arte de "descompilar" também pode ser pensada como engenharia reversa. Embora, às vezes, ao fazer uma engenharia reversa, você nem sempre tenha acesso a binários.
Makach
Ninguém mencionou bytecodeviewer.com , que pode descompilar no código-fonte java e no código de bytes (o código-fonte java é baseado no JAD).
Fernando Gonzalez Sanchez

Respostas:

588

Atualização em fevereiro de 2016:

www.javadecompilers.com lista JAD como sendo:

o descompilador Java mais popular, mas principalmente dessa idade. Escrito em C ++, muito rápido.
Desatualizado, sem suporte e não descompila corretamente o Java 5 e posterior

Portanto, sua milhagem pode variar com o jdk recente (7, 8).

O mesmo site lista outras ferramentas.

E o javadecompiler, conforme observado por Salvador Valencia nos comentários (setembro de 2017), oferece um SaaS em que você faz o upload do .classarquivo na nuvem e retorna o código descompilado.


Resposta original: outubro de 2008

  • A versão final do JSR 176, definindo os principais recursos do J2SE 5.0 (Java SE 5), foi publicada em 30 de setembro de 2004.
  • A última versão do Java suportada pelo JAD, o famoso descompilador Java escrito por Pavel Kouznetsov, é o JDK 1.3 .
  • A maioria dos descompiladores Java que podem ser baixados hoje da Internet, como “DJ Java Decompiler” ou “Cavaj Java Decompiler”, são equipados com JAD: eles não podem exibir fontes Java 5.

Descompilador Java (outro descompilador Fast Java):

  • Suporte explícito para descompilar e analisar arquivos Java 5+ ".class".
  • Uma boa interface gráfica:

captura de tela

Ele funciona com compiladores do JDK 1.1.8 até o JDK 1.7.0 e outros ( Jikes , JRockit , etc.).

Possui uma versão demo online ao vivo que é totalmente funcional! Você pode simplesmente soltar um arquivo jar na página e ver o código-fonte descompilado sem instalar nada.

VonC
fonte
5
+1 Vale ressaltar que também é modularizado, para que o núcleo (implementado em C ++) possa ser aproveitado em outro lugar.
Quinn Taylor
1
jd-gui-0.3.3 também está disponível aqui
amaidment
1
Caso alguém tenha instalado o plug-in do descompilador java do Eclipse no Eclipse Juno, e o Eclipse começou a travar na inicialização do Marketplace DND forçando a morte de todo o processo: remover o jd. *. Jar do diretório de plugins do Eclipse apenas o corrigiu para mim.
24513 LSerni
4
@Rishi da mesma maneira que protege seu IP em qualquer idioma ou plataforma - bons advogados. DRM é apenas um bandaid.
Antimony
1
Agora ele oferece SaaS onde você carrega o arquivo .class na nuvem e retorna o código descompilado. Trabalhou para um simples POJO.
Salvador Valencia
101

Existem alguns decompiladores por aí ... Uma rápida pesquisa gera:

  1. Procyon : código-fonte aberto (Apache 2) e desenvolvido ativamente
  2. Krakatau : código aberto (GPLv3) e desenvolvido ativamente
  3. CFR : código aberto (MIT) e desenvolvido ativamente
  4. JAD
  5. DJ Java Decompiler
  6. Mocha

E muitos mais.

Eles produzem código Java. O Java vem com algo que permite ver o código de bytes da JVM ( javap ).

billjamesdev
fonte
2
Devo também acrescentar que Procyon, CFR, JAD e DJ estão disponíveis como um serviço da web: javadecompilers.com
Andrew Rukin
javadecompilers.com - salva-vidas mano!
MarcoZen
kpdus.com/jad.html é um link do AD
marcinj
Obrigado @ marcinj, encontrei outro link com links para baixá-lo.
billjamesdev
51

Para ver o código-fonte Java, verifique algum descompilador. Vá procurar jad .

Se você quiser ver bytecodes, basta usar o javap que vem com o JDK.

Marko
fonte
5
Eu recomendaria um dos descompiladores de código aberto, pois eles são ativamente desenvolvidos. Use Procyon , o descompilador CFR ou Krakatau (Python).
Janus Troelsen
29

Eu tentei vários, e Procyon parecia funcionar melhor para mim. Está em desenvolvimento ativo e suporta muitos recursos das versões mais recentes do Java.

Estes são os outros que eu tentei:

  • CFR
    • Decompilação de método promissora, mas geralmente com falha. Eu vou ficar de olho nesse aqui. Também desenvolvido ativamente com suporte para os mais recentes recursos Java.
  • Krakatau
    • Adota uma abordagem diferente, na tentativa de gerar código Java equivalente em vez de tentar reconstruir a fonte original, que tem o potencial de melhorar o código ofuscado. Nos meus testes, foi mais ou menos a par do Procyon, mas ainda assim é bom ter algo diferente. Eu tive que usar o -skipsinalizador de linha de comando para não parar por erros. Desenvolvido ativamente e, curiosamente, está escrito em Python.
  • JD-GUI
  • JAD
    • Funcionou, mas suporta apenas Java 1.4 e abaixo. Também disponível como um plug-in do Eclipse . Não está mais em desenvolvimento.
bmaupin
fonte
1
Observe que a IGNORE_EXCEPTIONScoisa foi alterada para o sinalizador da linha de comando -skip.
Antimônio
14

Procyon inclui um descompilador. É FOSS.

Janus Troelsen
fonte
13

A fuligem é uma opção para o código Java mais recente. Pelo menos tem a vantagem de ainda ser mantido recentemente ...

Além disso, o Java Decompiler é um descompilador com uma GUI independente e integração com o Eclipse.

Por fim, o Jdec não foi mencionado, embora não seja tão sofisticado quanto as outras opções.

Quinn Taylor
fonte
Você sabe como descompilar um arquivo de classe concreto com o Soot? Eu não tenho certeza que é possível ...
Janus Troelsen
12

JD-GUI é realmente bom. Você pode simplesmente abrir um arquivo JAR e navegar pelo código como se estivesse trabalhando em um IDE. Coisa boa.

G Kumar
fonte
11

Aqui está uma lista de descompiladores a partir de fevereiro de 2015:

Procyon , código aberto, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , gratuito, sem código-fonte disponível, http://www.benf.org/other/cfr/

JD , gratuito apenas para uso não comercial, http://jd.benow.ca/

Fernflower , código aberto, https://github.com/fesh0r/fernflower ,

JAD - fornecido aqui apenas por razões históricas. Gratuito, sem código-fonte disponível, http://varaneckas.com/jad/ Desatualizado, sem suporte e não descompila corretamente o Java 5 e posterior.

Você pode testar os descompiladores mencionados acima online, sem necessidade de instalação e fazer sua própria escolha.

Descompiladores Java na nuvem: http://www.javadecompilers.com/

Andrew Rukin
fonte
1
Procyon funciona melhor !!!!
MarcoZen
10

Existem alguns programas que você pode usar. Você obterá o código Java real, mas às vezes o código será ofuscado, portanto os métodos são nomeados por uma letra ou número ou uma mistura aleatória de letras e números.

DJ Decompiler Mocha

Mike Pone
fonte
9

A maioria dos decompiladores para Java é baseada no JAD . É uma ótima ferramenta, mas infelizmente não foi atualizada por um tempo e não lida muito bem com as classes Java 1.5+. Eu não vi nenhuma ferramenta que lide adequadamente com mais de 1,5 classes.

John Meagher
fonte
3
aqui está: acabei de postar uma resposta para a sua resposta;) JDK1.5 e mais suportado!
VonC 07/11
"Eu não vi nenhuma ferramenta que irá lidar adequadamente 1.5+ classes" - Procion, Fernflower, JDCore e CFR (este alças Java 8!)
Andrew Rukin
6

Dê uma olhada no cavaj .

Paulo Guedes
fonte
3
Isso também usa jadpor baixo.
Quinn Taylor
6

Todos os links JAD listados até agora parecem estar quebrados, por isso encontrei este site. Funciona muito bem (para Linux, pelo menos)! No Ubuntu 11.10, eu tive que baixar o estático por qualquer motivo.

http://www.varaneckas.com/jad

kdazzle
fonte
5
  • JAD é aquele que funciona e é simples.

  • Além disso, se você quiser apenas ver os métodos, use javap.

Berlin Brown
fonte
5

Se você deseja ver como o compilador Java faz certas coisas, não deseja descompilar, desmontar. A descompilação envolve a transformação do bytecode em fonte Java, o que significa que muitas informações de baixo nível são perdidas e, se você está pensando em otimização do compilador, provavelmente é essa a mesma informação em que você está interessado.

De qualquer forma, eu escrevi um desmontador Java de código aberto . Ao contrário do Javap, isso funciona mesmo em classes altamente patológicas, para que você possa ver o que as ferramentas de ofuscação também estão fazendo nas suas aulas. Também pode descompilar, embora eu não recomendo.

Antimônio
fonte
4

O JAD não funciona para mim (questão do Ubuntu 11.10), então segui em frente e mergulhei no JODO . Pelo menos, ele possui código-fonte Open Java e foi capaz de descompilar meu .class corretamente.

Eu recomendo verificar a ramificação 'branches / generic' primeiro. Os troncos não são estáveis.

alexander.box
fonte
1
O JODO é mantido esporadicamente enquanto o CFR e o Procyon são ativamente desenvolvidos e têm suporte ao JDK 8.
Janus Troelsen
4

Na plataforma IntelliJ IDEA, você pode usar o Java Decompiler IntelliJ Plugin . Permite exibir todas as fontes Java durante o processo de depuração, mesmo se você não tiver todas elas. É baseado nas famosas ferramentas JD-GUI .

insira a descrição da imagem aqui

naXa
fonte
@ NoOP Você é um robô? Ou simplesmente não prestando atenção a um assunto de revisão?
NaXa
Desculpe por isso, à primeira vista, parece que o link apenas responde. Talvez você deva adicionar mais detalhes e sua resposta esteja em conformidade apenas com o título da pergunta e não com o conteúdo da pergunta.
ashiquzzaman33
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
21715 Kristievan Iliev
@ Chris, você já tentou a solução sugerida? Você já leu a pergunta ?
NaXa
1
@ Noop de desculpas por ter sido rude = (Estou impressionado com o número de revisores que não o fazem prestar atenção.
NAXA
1

Com o AndroChef Java Decompiler, você pode descompilar arquivos de classes apk, dex, jar e java. É simples e fácil. O AndroChef JD é baseado em FernFlower . Você pode avaliar em 10 usos gratuitos.

O AndroChef suporta recursos da linguagem Java, como genéricos, enumerações e anotações. Segundo alguns estudos, o AndroChef Java Decompiler é capaz de descompilar 98,04% dos aplicativos Java gerados com os compiladores Java tradicionais - uma taxa de recuperação muito alta. É uma ferramenta simples, mas poderosa, que permite decompilar o bytecode Java e Dalvik (DEX, APK) em uma fonte Java legível.

naXa
fonte
1
@ Dimitrius, leia as respostas cuidadosamente durante uma revisão. Como você imagina incluir um FernFlower ou AndroChef aqui?
NaXa