Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
fernflower — Decompilador de bytecode de Java a Java, usado en IntelliJ IDEA. | Kitploit
Herramientas/GitHubGitHub/jetbrains/fernflower
Análisis EstáticoIngeniería InversaAnálisis de Binarios
GitHubjetbrains/fernflower

fernflower

Decompilador de bytecode de Java a Java, usado en IntelliJ IDEA.

Ver RepositorioSitio web
4.4k7264hace 8 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Fernflower

Fernflower es el primer descompilador analítico que realmente funciona para Java y probablemente para un lenguaje de programación de alto nivel en general.

Las versiones se publican en el repositorio de IntelliJ Community.

Envía tus informes de errores y solicitudes de funciones al issue tracker (en el subsistema Java. Decompiler. Engine).

Uso en IntelliJ

Fernflower se incluye en IntelliJ IDEA y se usa principalmente para mostrar código Java al depurar o navegar por archivos de clase.

Uso en línea de comandos

Fernflower se puede ejecutar desde la línea de comandos en modo independiente usando el siguiente comando:

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

* significa cero o más veces

+ significa una o más veces

<source>: archivo o directorio con archivos a descompilar. Los directorios se escanean recursivamente. Las extensiones de archivo permitidas son class, zip y jar. Las fuentes con el prefijo -e= significan archivos "biblioteca" que no se descompilarán pero se tendrán en cuenta al analizar relaciones entre clases o métodos. Especialmente el renombrado de identificadores (ver la opción ) puede beneficiarse de la información sobre clases externas.

Descargar herramienta
ren

<destination>: directorio de destino para colocar el código Java resultante.

<option>=<value>: una opción de línea de comandos con el valor correspondiente (ver "Opciones de línea de comandos" más abajo).

Ejemplos

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\

Opciones de línea de comandos

Excepto para mpm y urc, el valor 1 significa que la opción está activada, 0 - desactivada. El valor por defecto, si lo hay, se indica entre paréntesis.

Normalmente, las siguientes opciones serán cambiadas por el usuario, si es que se cambian: hes, hdc, dgs, mpm, ren, urc El resto de opciones se pueden dejar como están: están pensadas para ingenieros inversos profesionales.

  • rbr (1): ocultar métodos puente
  • rsy (0): ocultar miembros de clase sintéticos
  • din (1): descompilar clases internas
  • dc4 (1): colapsar referencias a clases 1.4
  • das (1): descompilar aserciones
  • hes (1): ocultar invocación vacía a super
  • hdc (1): ocultar constructor por defecto vacío
  • dgs (0): descompilar firmas genéricas
  • ner (1): asumir que el retorno no lanza excepciones
  • den (1): descompilar enumeraciones
  • rgn (1): eliminar invocación a getClass() cuando forma parte de una sentencia new calificada
  • lit (0): mostrar literales numéricos "tal cual"
  • asc (0): codificar caracteres no ASCII en literales de cadena y carácter como escapes Unicode
  • bto (1): interpretar int 1 como booleano true (solución alternativa para un error del compilador)
  • nns (0): permitir que no se establezca el atributo sintético (solución alternativa para un error del compilador)
  • uto (1): considerar tipos sin nombre como java.lang.Object (solución alternativa para una falla de arquitectura del compilador)
  • udv (1): reconstruir nombres de variables a partir de información de depuración, si está presente
  • ump (1): reconstruir nombres de parámetros a partir de atributos correspondientes, si están presentes
  • rer (1): eliminar rangos de excepción vacíos
  • fdi (1): desenlinear estructuras finally
  • mpm (0): tiempo máximo de procesamiento permitido por método descompilado, en segundos. 0 significa sin límite superior
  • ren (0): renombrar clases y elementos de clase ambiguos (resp. ofuscados)
  • urc (-): nombre completo de una clase proporcionada por el usuario que implementa la interfaz IIdentifierRenamer. Se utiliza para determinar qué identificadores de clase deben renombrarse y proporciona nuevos nombres de identificador (ver "Renombrado de identificadores")
  • inn (1): buscar la anotación @NotNull específica de IntelliJ IDEA y eliminar el código insertado si se encuentra
  • lac (0): descompilar expresiones lambda a clases anónimas
  • nls (0): definir un carácter de nueva línea para la salida. 0 - '\r\n' (Windows), 1 - '\n' (Unix), por defecto depende del SO
  • ind: cadena de sangría (por defecto 3 espacios)
  • crp (0): usar patrones de registro donde sea posible
  • cps (0): usar switch con patrones donde sea posible
  • log (INFO): nivel de registro, valores posibles: TRACE, INFO, WARN, ERROR
  • iec (0): incluir todo el classpath en el contexto al descompilar
  • isl (1): enlinealizar expresiones lambda simples
  • ucrc (1): ocultar constructor y getters de registro innecesarios
  • cci (1): comprobar si el recurso en try-with-resources realmente implementa la interfaz AutoCloseable
  • jvn (0): sobrescribir cualquier nombre de variable local con nombres de estilo JAD
  • jpr (0): incluir nombres de parámetros en el nombrado JAD
  • pbo (0): agregar paréntesis aclaratorios cuando los operadores bitwise/desplazamiento se mezclan con aritméticos

Renombrado de identificadores

Algunos ofuscadores dan a las clases y a sus elementos miembros nombres cortos, sin significado y, sobre todo, ambiguos. Recompilar dicho código conduce a una gran cantidad de conflictos. Por lo tanto, es recomendable dejar que el descompilador renombre los elementos a su vez, asegurando la unicidad de cada identificador.

La opción ren (es decir, -ren=1) activa la funcionalidad de renombrado. La estrategia de renombrado por defecto es la siguiente:

  • renombrar un elemento si su nombre es una palabra reservada o tiene menos de 3 caracteres
  • los nuevos nombres se construyen según un patrón simple: (class|method|field)_<número único consecutivo>
    Puedes sobrescribir estas reglas proporcionando tu propia implementación de los 4 métodos clave invocados por el descompilador durante el renombrado. Simplemente pasa una clase que implemente org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer en la opción urc (por ejemplo, -urc=com.example.MyRenamer) a Fernflower. La clase debe estar disponible en el classpath de la aplicación.

El significado de cada método debería quedar claro por el nombre: toBeRenamed determina si el elemento será renombrado, mientras que los otros tres proporcionan nuevos nombres para clases, métodos y campos respectivamente.

Desarrollo

Compilar un script de inicio ejecutable:

root@kitploit:~
./gradlew :installDist

El script de inicio se genera en build/install/engine/bin.

Contribuciones

Fernflower es parte del proyecto IntelliJ Community, las contribuciones son bienvenidas; la forma preferida de enviar parches es creando una pull request en el repositorio de IntelliJ Community. Al enviar parches, por favor sigue las directrices de contribución.

Licencia

Fernflower está licenciado bajo la Apache License Version 2.0.

Créditos

Fernflower fue desarrollado originalmente por Stiver pero ha sido mantenido por JetBrains desde 2014. Algunos parches de ForgeFlower se fusionaron en este repositorio. El espejo de Fernflower también fue mantenido por Andrew McRae durante mucho tiempo.

Nombre

El nombre correcto es Fernflower, no FernFlower.