Como descompilar um arquivo Jar inteiro? [fechadas]

283

Alguém sabe de um descompilador gratuito que pode descompilar um arquivo Jar inteiro em vez de uma única classe? Eu tenho um problema com subclasses como nome $ 1.class name $ 2.class name.class

Coração de pedra
fonte
127
Lembre-se de mais duas coisas: 1) A simples menção de um descompilador fará com que o "santo mais do que você" apareça e faça julgamentos de valor sobre seus motivos, apesar de não ter idéia do seu uso planejado, portanto, tenha cuidado com quem você fala. 2) O sofisticado JavaDecompiler fornecerá uma excelente versão do código, bem estruturada e fácil de ler - faltando apenas comentários. É surpreendentemente bom, recuperar um arquivo JAR que há muito tempo perdeu a fonte completo com nomes de variáveis. É claro que não ocultamos nossos arquivos JAR internos.
Andrew
Veja também comentários no post Escolha e teste o descompilador java .
dma_k
8
Parei por esse tópico tantas vezes quando precisei estudar como alguém realizou algo para um plug-in Bukkit ... Esse comentário sempre me deixa com um sorriso. Eu gostaria de poder votá-lo toda vez que eu passo por aqui.
Jane Panda
O SecureTeam Java Decompiler pode fazer isso.
SecureTeam Software
Descompilador online simples, se você não deseja baixar nenhum software. javadecompilers.com
Nick Graham

Respostas:

313

2009: O JavaDecompiler pode fazer um bom trabalho com um jar: desde 0.2.5, Todos os arquivos, nos arquivos JAR, são exibidos.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

Consulte também a pergunta "Como faço para" descompilar "arquivos de classe Java?" .

O JD-Eclipse parece não ter mudado desde o final de 2009 (consulte Alterações ).
Portanto, sua integração com o Eclipse mais recente (3.8, 4.2+) pode ser problemática.

O JD-Core é mantido ativamente.

Ambos são o resultado do fantástico trabalho de (usuário de SO) Emmanuel Dupuy .


2018: Uma opção mais moderna, mencionada nos comentários de David Kennedy Araujo :

JetBrains / intellij-community / plugins / descompilador java / engine

Fernflower é o primeiro descompilador analítico realmente trabalhando para Java e provavelmente para uma linguagem de programação de alto nível em geral.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

Consulte também Como descompilar para arquivos java a idéia intelectual de um comando que trabalha com o IntelliJ IDEA recente.

VonC
fonte
5
fyi, o descompilador java funciona no windows, mac e linux.
yanokwa 13/09/11
4
@AlexS nice :) Passo seguinte: controle de versão ( stackoverflow.com/questions/59561/... ) E então Integração Contínua ( stackoverflow.com/questions/130592/... )
VonC
3
Com o Java Decompiler, você pode abrir o arquivo JAR e ir para Arquivo, Salvar todas as fontes. Ele salva todos os arquivos de classe em arquivos java = D
Akira Yamamoto
2
Lembre-se de que também comete erros. Eu tenho uma classe com uma variável Member e a moveu para o parâmetro de uma função, destruindo o efeito do código. Cuidado, ele vai te pegar.
CharlesW
1
JD é um bom ponto de partida, mas falha ao descompilar código complexo. Uma boa alternativa é usar o github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy
37

Antes de tudo, vale lembrar que todos os arquivos Java ( .jar/ .war/ etc ...) são basicamente apenas .ziparquivos sofisticados , com alguns manifestos e metadados adicionados.

Segundo, para resolver esse problema, eu pessoalmente uso várias ferramentas que lidam com esse problema em todos os níveis:

  • Jad + Jadclipse enquanto trabalha no IDE para descompilar.classarquivos
  • O WinRAR , minha ferramenta de compactação favorita, suporta nativamente os arquivos Java (novamente, consulte o primeiro parágrafo).
  • Além da comparação , minha ferramenta de comparação favorita, quando configurada corretamente, pode fazer comparações dinâmicas entre qualquer arquivo morto, incluindojars. Vale a pena tentar.

A vantagem de tudo o que foi mencionado acima é que não preciso segurar nenhuma outra ferramenta externa que atrapalhe meu ambiente de trabalho. Tudo o que eu precisarei de um desses arquivos pode ser tratado dentro do meu IDE ou difundido com outros arquivos nativamente.

Yuval Adam
fonte
lolz eu continuo descompactar Chrome e Firefox extensões e eu esqueci que .jar são apenas fecha também :)
Carter Cole
36

Se você tiver um shell bash e jad:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

Eu posso estar um pouquinho, com isso, mas deve funcionar mais ou menos como anunciado. Você deve $JAR.tmpconter os arquivos descompilados.

Chris R
fonte
1
no ubuntu usar #! / bin / bash em vez de #! / bin / sh becausw pushd doesnt trabalho para o padrão do Ubuntu desembolsar ...!
mossplix
1
Estou usando javapdentro dessa estrutura básica de loop, e está funcionando para mim.
Chris Prince
25

Eu tive um sucesso razoável com uma ferramenta chamada (frustrantemente) " JD: Java Decompiler ".

Eu o achei melhor do que a maioria dos decompiladores ao lidar com classes compiladas para Java 5 e superior . Infelizmente, ele ainda pode ter alguns problemas onde o JAD normalmente seria bem-sucedido.

Adam Paynter
fonte
Não consegui baixar a versão para Windows ou Linux do JD-GUI. Esse problema só aparece para mim?
mmdemirbas
@JanusTroelsen eu o apaguei. Obrigado por notificá-lo. Deixa respostas manter limpo :)
pramodc84
@ Zero3: atualizado
Gowtham Gopalakrishnan
11

Algo como:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

talvez?

cybertoast
fonte
1
Eu usei jad por um tempo e precisava de uma maneira rápida de extrair e descompilar um frasco inteiro. Obrigado, isso ajudou imensamente.
Alper Akture
5

Insira o seguinte em decompile.jar.sh

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // executável
  • ln -s ./decomplie.jar.s / usr / bin / dj

Pronto para usar, basta digitar dj your.jare você receberá uma your.jar.srcpasta com as fontes. Use a -dopção para o modo de depuração.

merzod
fonte
Obrigado, mas tive que mudar "jad" para "./jad" na linha 23 e executar "bash decompile.jar.sh foo.jar -d", pois não queria poluir minha pasta bin
Sam
qualquer recompilador? recompila arquivos jad em jar?
Jay
2

Um arquivo jar é apenas um arquivo zip com extensão jar. Você deve poder descompactar (winzip) um jar como um arquivo zip.

Cadoo
fonte
1

Você o extrai e, em seguida, usa jad contra o dir.

yanchenko
fonte
Eu não acho que você pode simplesmente executá-lo contra o dir. Você precisará especificar {dir} / ** / *. Class
Vihung
Extraia o frasco e usar algo como jad {dir}, acabo testado e não funciona no Windows
Jaime Hablutzel
1

Nota: Esta solução funciona apenas para usuários de Mac e * nix.

Eu também tentei encontrar Jad sem sorte. Minha solução rápida foi baixar o MacJad que contém jad. Após o download, você pode encontrar o jad em [where-you-download-macjad] / MacJAD / Conteúdo / Recursos / jad.

Joel S
fonte