Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
fernflower — Декомпилятор из байт-кода Java в Java, используемый в IntelliJ IDEA. | Kitploit
Инструменты/GitHubGitHub/jetbrains/fernflower
Статический анализОбратная инженерияАнализ Бинарных Файлов
GitHubjetbrains/fernflower

fernflower

Декомпилятор из байт-кода Java в Java, используемый в IntelliJ IDEA.

РепозиторийСайт
4.4k72610 дней назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Fernflower

Fernflower — это первый реально работающий аналитический декомпилятор для Java и, вероятно, для языков программирования высокого уровня в целом.

Релизы публикуются в репозитории Intellij Community.

Пожалуйста, отправляйте сообщения об ошибках и запросы на новые функции в [трекер задач] (в подсистеме Java. Decompiler. Engine).

Использование в IntelliJ

Fernflower поставляется в составе IntelliJ IDEA и в основном используется для отображения Java-кода при отладке или навигации по файлам классов.

Использование в командной строке

Fernflower можно запускать из командной строки в автономном режиме с помощью следующей команды:

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

* означает ноль или более раз

+ означает один или более раз

<source>: файл или каталог с файлами, подлежащими декомпиляции. Каталоги сканируются рекурсивно. Допустимые расширения файлов: class, zip и jar. Источники с префиксом -e= означают «библиотечные» файлы, которые не будут декомпилированы, но будут учитываться при анализе связей между классами или методами. Особенно переименование идентификаторов (см. опцию ren) может извлечь выгоду из информации о внешних классах.

<destination>: целевой каталог для размещения результирующего Java-исходного кода

<option>=<value>: опция командной строки с соответствующим значением (см. «Опции командной строки» ниже).

Примеры

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\

Опции командной строки

За исключением mpm и urc значение 1 означает, что опция активирована, 0 — деактивирована. Значение по умолчанию, если оно есть, указано в скобках.

Обычно пользователь меняет следующие опции, если вообще меняет: hes, hdc, dgs, mpm, ren, urc Остальные опции можно оставить как есть: они предназначены для профессиональных реверс-инженеров.

  • rbr (1): скрывать мостовые методы
  • rsy (0): скрывать синтетические члены класса
  • din (1): декомпилировать внутренние классы
  • dc4 (1): сворачивать ссылки на классы 1.4
  • das (1): декомпилировать утверждения
  • hes (1): скрывать пустой вызов super
  • hdc (1): скрывать пустой конструктор по умолчанию
  • dgs (0): декомпилировать обобщённые сигнатуры
  • ner (1): предполагать, что return не выбрасывает исключения
  • den (1): декомпилировать перечисления
  • rgn (1): удалять вызов getClass(), когда он является частью оператора new с квалификацией
  • lit (0): выводить числовые литералы «как есть»

Переименование идентификаторов

Некоторые обфускаторы дают классам и их членам короткие, бессмысленные и, прежде всего, неоднозначные имена. Перекомпиляция такого кода приводит к большому количеству конфликтов. Поэтому целесообразно позволить декомпилятору, в свою очередь, переименовывать элементы, обеспечивая уникальность каждого идентификатора.

Опция ren (т.е. -ren=1) активирует функциональность переименования. Стратегия переименования по умолчанию выглядит следующим образом:

  • переименовывать элемент, если его имя является зарезервированным словом или короче 3 символов
  • новые имена строятся по простому шаблону: (class|method|field)_<последовательный уникальный номер>
    Вы можете переопределить эти правила, предоставив собственную реализацию 4 ключевых методов, вызываемых декомпилятором при переименовании. Просто передайте класс, реализующий org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer, в опции urc (например, -urc=com.example.MyRenamer) в Fernflower. Класс должен быть доступен в classpath приложения.

Назначение каждого метода должно быть ясно из названия: toBeRenamed определяет, будет ли элемент переименован, а остальные три предоставляют новые имена для классов, методов и полей соответственно.

Разработка

Сборка исполняемого стартового скрипта:

root@kitploit:~
./gradlew :installDist

Стартовый скрипт генерируется в build/install/engine/bin.

Участие в разработке

Fernflower является частью проекта IntelliJ Community, вклад приветствуется, предпочтительный способ отправки патчей — создание pull request в репозитории IntelliJ community. При отправке патчей, пожалуйста, следуйте правилам участия.

Лицензия

Fernflower лицензирован в соответствии с Apache License Version 2.0.

Авторы

Fernflower изначально был разработан Stiver, но поддерживается компанией JetBrains с 2014 года. В этот репозиторий были включены некоторые патчи из ForgeFlower. Зеркало Fernflower также долгое время поддерживалось Andrew McRae.

Название

Правильное название — Fernflower, а не FernFlower.

Скачать инструмент
  • asc (0): кодировать не-ASCII символы в строковых и символьных литералах как Unicode-экранирования
  • bto (1): интерпретировать int 1 как boolean true (обходной путь для ошибки компилятора)
  • nns (0): разрешить отсутствие синтетического атрибута (обходной путь для ошибки компилятора)
  • uto (1): считать безымянные типы как java.lang.Object (обходной путь для недостатка архитектуры компилятора)
  • udv (1): восстанавливать имена переменных из отладочной информации, если она есть
  • ump (1): восстанавливать имена параметров из соответствующих атрибутов, если они есть
  • rer (1): удалять пустые диапазоны исключений
  • fdi (1): убрать встраивание finally-структур
  • mpm (0): максимальное допустимое время обработки на декомпилируемый метод, в секундах. 0 означает отсутствие ограничения
  • ren (0): переименовывать неоднозначные (или обфусцированные) классы и элементы классов
  • urc (-): полное имя пользовательского класса, реализующего интерфейс IIdentifierRenamer. Используется для определения того, какие идентификаторы классов следует переименовывать, и предоставляет новые имена идентификаторов (см. «Переименование идентификаторов»)
  • inn (1): проверять наличие специфической для IntelliJ IDEA аннотации @NotNull и удалять вставленный код, если она найдена
  • lac (0): декомпилировать лямбда-выражения в анонимные классы
  • nls (0): задавать символ новой строки для вывода. 0 — '\r\n' (Windows), 1 — '\n' (Unix), по умолчанию зависит от ОС
  • ind: строка отступа (по умолчанию 3 пробела)
  • crp (0): использовать запись с образцами (record patterns) где это возможно
  • cps (0): использовать switch с образцами где это возможно
  • log (INFO): уровень логирования, возможные значения: TRACE, INFO, WARN, ERROR
  • iec (0): включать весь classpath в контекст при декомпиляции
  • isl (1): встраивать простые лямбда-выражения
  • ucrc (1): скрывать ненужный конструктор записи и геттеры
  • cci (1): проверять, реализует ли ресурс в try-with-resources интерфейс AutoCloseable
  • jvn (0): перезаписывать имена локальных переменных именами в стиле JAD
  • jpr (0): включать имена параметров в именование JAD
  • pbo (0): добавлять уточняющие скобки при смешивании побитовых/сдвиговых операторов с арифметическими