Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
fernflower — Decompilador de bytecode Java para Java, usado no IntelliJ IDEA. | Kitploit
Ferramentas/GitHubGitHub/jetbrains/fernflower
Análise EstáticaEngenharia ReversaAnálise de Binários
GitHubjetbrains/fernflower

fernflower

Decompilador de bytecode Java para Java, usado no IntelliJ IDEA.

Ver RepositórioSite
4.4k726há 10 diasRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Fernflower

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

As versões são publicadas no repositório IntelliJ Community.

Por favor, envie seus relatórios de bugs e solicitações de funcionalidades para o issue tracker (no subsistema Java. Decompiler. Engine).

Uso no IntelliJ

O Fernflower é empacotado no IntelliJ IDEA e é usado principalmente para exibir código Java durante a depuração ou navegação em arquivos de classe.

Uso na linha de comando

O Fernflower pode ser executado a partir da linha de comando no modo autônomo usando o seguinte comando:

root@kitploit:~
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

* significa zero ou mais vezes

+ significa uma ou mais vezes

<source>: arquivo ou diretório com arquivos a serem descompilados. Os diretórios são escaneados recursivamente. As extensões de arquivo permitidas são class, zip e jar. Fontes prefixadas com -e= significam arquivos de "biblioteca" que não serão descompilados, mas serão considerados ao analisar relacionamentos entre classes ou métodos. Especialmente a renomeação de identificadores (veja a opção ren) pode se beneficiar de informações sobre classes externas.

<destination>: diretório de destino para colocar o código-fonte Java resultante

<option>=<value>: uma opção de linha de comando com o valor correspondente (veja "Opções de linha de comando" abaixo).

Exemplos

root@kitploit:~
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
root@kitploit:~
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

Opções de linha de comando

Exceto por mpm e urc, o valor 1 significa que a opção está ativada, 0 - desativada. O valor padrão, se houver, é fornecido entre parênteses.

Normalmente, as seguintes opções serão alteradas pelo usuário, se houver: hes, hdc, dgs, mpm, ren, urc As demais opções podem ser deixadas como estão: elas são destinadas a engenheiros reversos profissionais.

  • rbr (1): ocultar métodos bridge
  • rsy (0): ocultar membros sintéticos de classe
  • din (1): descompilar classes internas
  • dc4 (1): colapsar referências de classe 1.4
  • das (1): descompilar asserções
  • hes (1): ocultar invocação vazia de super
  • hdc (1): ocultar construtor padrão vazio
  • dgs (0): descompilar assinaturas genéricas
  • ner (1): assumir retorno sem lançamento de exceções
  • den (1): descompilar enumerações
  • rgn (1): remover invocação de getClass(), quando fizer parte de uma instrução new qualificada
  • lit (0): exibir literais numéricos "como estão"

Renomeação de identificadores

Alguns ofuscadores dão às classes e seus elementos membros nomes curtos, sem sentido e, acima de tudo, ambíguos. A recompilação de tal código leva a um grande número de conflitos. Portanto, é aconselhável deixar o decompilador renomear os elementos por sua vez, garantindo a exclusividade de cada identificador.

A opção ren (ou seja, -ren=1) ativa a funcionalidade de renomeação. A estratégia padrão de renomeação funciona da seguinte forma:

  • renomear um elemento se seu nome for uma palavra reservada ou for menor que 3 caracteres
  • novos nomes são construídos de acordo com um padrão simples: (class|method|field)_<número consecutivo único>
    Você pode sobrescrever essas regras fornecendo sua própria implementação dos 4 métodos principais invocados pelo decompilador durante a renomeação. Simplesmente passe uma classe que implemente org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer na opção urc (ex.: -urc=com.example.MyRenamer) para o Fernflower. A classe deve estar disponível no classpath da aplicação.

O significado de cada método deve ficar claro pelo nome: toBeRenamed determina se o elemento será renomeado, enquanto os outros três fornecem novos nomes para classes, métodos e campos, respectivamente.

Desenvolvimento

Construir um script de inicialização executável:

root@kitploit:~
./gradlew :installDist

O script de inicialização é gerado em build/install/engine/bin.

Contribuição

O Fernflower faz parte do projeto IntelliJ Community, contribuições são bem-vindas, a forma preferida de enviar patches é criando um pull request no repositório da comunidade IntelliJ. Ao enviar patches, por favor siga as diretrizes de contribuição.

Licença

O Fernflower é licenciado sob a Apache License Version 2.0.

Créditos

O Fernflower foi originalmente desenvolvido por Stiver mas tem sido mantido pela JetBrains desde 2014. Alguns patches do ForgeFlower foram mesclados neste repositório. O espelho do Fernflower também foi mantido por Andrew McRae por muito tempo.

Nomenclatura

O nome correto é Fernflower, não FernFlower.

Baixar ferramenta
  • asc (0): codificar caracteres não ASCII em literais de string e caractere como escapes Unicode
  • bto (1): interpretar int 1 como booleano verdadeiro (solução alternativa para um bug do compilador)
  • nns (0): permitir atributo sintético não definido (solução alternativa para um bug do compilador)
  • uto (1): considerar tipos sem nome como java.lang.Object (solução alternativa para uma falha na arquitetura do compilador)
  • udv (1): reconstruir nomes de variáveis a partir de informações de depuração, se presentes
  • ump (1): reconstruir nomes de parâmetros a partir de atributos correspondentes, se presentes
  • rer (1): remover intervalos de exceção vazios
  • fdi (1): desenlinear estruturas finally
  • mpm (0): tempo máximo de processamento permitido por método descompilado, em segundos. 0 significa sem limite superior
  • ren (0): renomear classes e elementos de classe ambíguos (respectivamente ofuscados)
  • urc (-): nome completo de uma classe fornecida pelo usuário que implementa a interface IIdentifierRenamer. É usado para determinar quais identificadores de classe devem ser renomeados e fornece novos nomes de identificadores (veja "Renomeação de identificadores")
  • inn (1): verificar a anotação específica do IntelliJ IDEA @NotNull e remover código inserido, se encontrado
  • lac (0): descompilar expressões lambda para classes anônimas
  • nls (0): definir um novo caractere de linha a ser usado na saída. 0 - '\r\n' (Windows), 1 - '\n' (Unix), o padrão depende do SO
  • ind: string de indentação (o padrão é 3 espaços)
  • crp (0): usar padrões de registro onde for possível
  • cps (0): usar switch com padrões onde for possível
  • log (INFO): nível de log, valores possíveis são TRACE, INFO, WARN, ERROR
  • iec (0): incluir todo o classpath no contexto ao descompilar
  • isl (1): enlinar expressões lambda simples
  • ucrc (1): ocultar construtor e getters de registro desnecessários
  • cci (1): verificar se o recurso em try-with-resources realmente implementa a interface AutoCloseable
  • jvn (0): sobrescrever todos os nomes de variáveis locais com nomes no estilo JAD
  • jpr (0): incluir nomes de parâmetros na nomenclatura JAD
  • pbo (0): adicionar parênteses esclarecedores quando operadores bitwise/shift são misturados com aritméticos