Как «декомпилировать» файлы classов Java?

Какую программу я могу использовать для декомпиляции файла classа? Я действительно получу Java-код, или это просто код сборки JVM?

На вопросах производительности Java на этом сайте я часто вижу ответы от людей, которые «декомпилировали» файл classа Java, чтобы увидеть, как компилятор оптимизирует некоторые вещи.

    Обновление февраля 2016 года:

    http://www.javadecompilers.com перечисляет JAD как:

    самый популярный декомпилятор Java, но в первую очередь только этого возраста. Написано на C ++, так очень быстро.
    Устаревший, неподдерживаемый и не декомпилирует правильно Java 5 и более поздних версий

    Таким образом, ваш пробег может варьироваться в зависимости от недавнего jdk (7, 8).

    Этот же список сайтов содержит другие инструменты.

    И javadecompiler, как отметил Сальвадор Валенсия в комментариях (сентябрь 2017 г.), предлагает SaaS, где вы загружаете файл .class в облако, и он возвращает вам декомпилированный код.


    Оригинальный ответ: октябрь 2008 г.

    • Окончательный выпуск JSR 176, определяющий основные функции J2SE 5.0 (Java SE 5), был опубликован 30 сентября 2004 года.
    • Последняя версия Java, поддерживаемая JAD, известным декомпилятором Java, написанным г-ном Павлом Кузнецовым, – JDK 1.3 .
    • Большинство декомпиляторов Java, загружаемых сегодня из Интернета, таких как «DJ Java Decompiler» или «Cavaj Java Decompiler», работают от JAD: они не могут отображать источники Java 5.

    Java Decompiler (еще один декомпилятор Fast Java) имеет:

    • Явная поддержка декомпиляции и анализа файлов Java 5+ «.class».
    • Хороший графический интерфейс:

    Скриншот

    Он работает с компиляторами от JDK 1.1.8 до JDK 1.7.0 и другими ( Jikes , JRockit и т. Д.).

    В нем есть онлайн- демо-версия, которая на самом деле полностью функциональна! Вы можете просто удалить файл jar на странице и увидеть декомпилированный исходный код, не устанавливая ничего.

    Есть несколько декомпиляторов там … Быстрый поиск дает:

    1. Procyon : open-source (Apache 2) и активно развивается
    2. Кракатау : open-source (GPLv3) и активно развивается
    3. CFR : с открытым исходным кодом (MIT) и активно развивается
    4. JAD
    5. DJ Java Decompiler
    6. кофе мокко

    И еще много.

    Они производят Java-код. Java поставляется с чем-то, что позволяет вам видеть код байта JVM ( javap ).

    Чтобы увидеть исходный код Java, проверьте некоторый декомпилятор. Иди искать джад .

    Если вы хотите увидеть байт-коды, просто используйте javap, который поставляется вместе с JDK.

    Я попробовал несколько, и Процион, казалось, работал лучше для меня. Он находится в активной разработке и поддерживает множество функций последних версий Java.

    Это те, которые я пробовал:

    • CFR
      • Перспективная, но часто неудачная декомпиляция метода. Я буду следить за этим. Также активно развивается поддержка новейших функций Java.
    • Кракатау
      • Принимает другой подход в том, что он пытается вывести эквивалентный Java-код вместо того, чтобы пытаться восстановить исходный источник, который имеет потенциал сделать его лучше для обфускации кода. Из моих тестов это было примерно наравне с Procyon, но все же приятно иметь что-то другое. Мне пришлось использовать -skip командной строки -skip чтобы он не останавливался на ошибках. Активно развивается, и достаточно интересно это написано на Python.
    • JD-GUI
      • Работал, но выход Procyon был намного лучше. Вот страница, сравнивающая вывод Procyon с оригиналом и JD-GUI . JD-GUI также доступен как плагин Eclipse , который не работает для меня вообще. Кажется, что это не с открытым исходным кодом, а развитие кажется спорадическим.
    • JAD
      • Работал, но поддерживал только Java 1.4 и ниже. Также доступен как плагин Eclipse . Больше не разрабатывается.

    Я использую JAD Decompiler .

    Для него есть плагин Eclipse , jadeclipse . Это довольно хорошо.

    Procyon включает декомпилятор. Это FOSS.

    Саут – это вариант для более нового кода Java. По крайней мере, это имеет то преимущество, что в последнее время поддерживается …

    Кроме того, Java Decompiler является декомпилятором как с автономным графическим интерфейсом, так и с интеграцией Eclipse.

    Наконец, Jdec не упоминается, хотя это не так полируется, как другие варианты.

    JD-GUI действительно хорош. Вы можете просто открыть JAR- файл и просмотреть код, как если бы вы работали над IDE. Хорошая вещь.

    Вот список декомпиляторов по состоянию на февраль 2015 года:

    Procyon , open-source, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

    CFR , бесплатно, без исходного кода, http://www.benf.org/other/cfr/

    JD , бесплатно только для некоммерческого использования, http://jd.benow.ca/

    Fernflower , open-source, https://github.com/fesh0r/fernflower ,

    JAD – дается здесь только по исторической причине. Бесплатно, без исходного кода, http://varaneckas.com/jad/ Устаревший, неподдерживаемый и не декомпилирует правильно Java 5 и более поздних версий.

    Вы можете протестировать вышеупомянутые декомпиляторы онлайн, не требуется установка и сделать свой собственный образованный выбор.

    Java-декомпиляторы в облаке: http://www.javadecompilers.com/

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

    DJ Decompiler Mocha

    Большинство декомпиляторов для Java основаны на JAD . Это отличный инструмент, но, к сожалению, он не обновлялся некоторое время и не очень хорошо справляется с classами Java 1.5+. Я не видел никаких инструментов, которые должным образом обрабатывали бы 1.5+ classы.

    Взгляните на кавадж .

    Все ссылки JAD, перечисленные до сих пор далеко, похоже, сломаны, поэтому я нашел этот сайт. Отлично работает (для Linux, по крайней мере)! На Ubuntu 11.10 мне приходилось загружать статическую по любой причине.

    http://www.varaneckas.com/jad

    • JAD – это тот, который работает и прост.

    • Кроме того, если вы просто хотите увидеть методы, используйте javap.

    Если вы хотите увидеть, как компилятор Java делает определенные вещи, вы не хотите декомпиляции, вы хотите parsingку. Декомпиляция включает в себя преобразование байт-кода в источник Java, а это означает, что теряется много информации о низком уровне, и если вам интересно о оптимизации компилятора, это, вероятно, самая интересная информация.

    Во всяком случае, я, случается, написал открытый дизассемблер Java . В отличие от Javap, это работает даже на высокопатологических classах, поэтому вы можете видеть, какие инструменты обфускации делают с вашими classами. Он также может выполнять декомпиляцию, хотя я бы не рекомендовал его.

    JAD не работает для меня (проблема Ubuntu 11.10), поэтому я продвинулся вперед и рубил JODO . По крайней мере, у него есть исходный код Open Java и он способен декомпилировать мой .class правильно.

    Я рекомендую сначала проверить ветвь «ветви / общий» . Сундуки нестабильны.

    На платформе IntelliJ IDEA вы можете использовать Java Decompiler IntelliJ Plugin . Он позволяет отображать все источники Java во время процесса отладки, даже если у вас их нет. Он основан на известных инструментах JD-GUI .

    введите описание изображения здесь

    С AndroChef Java Decompiler вы можете декомпилировать apk, dex, jar и java-файлы classов. Это просто и легко. AndroChef JD основан на FernFlower . Вы можете оценить его в 10 бесплатных использованиях.

    AndroChef поддерживает функции языка Java, такие как дженерики, enums и annotations. Согласно некоторым исследованиям, AndroChef Java Decompiler способен декомпилировать 98,04% приложений Java, сгенерированных традиционными компиляторами Java, – очень высокая скорость восстановления. Это простой, но мощный инструмент, который позволяет декомпилировать байт-код Java и Dalvik (DEX, APK) в читаемый источник Java.

    Для OSX я рекомендую: jarzilla или JD-GUI

    Они оба позволяют вам просматривать банку, войну и т. Д. содержимое файла и декомпилирует любые файлы classов внутри них.

    Jarzilla: https://code.google.com/p/jarzilla/
    JD-GUI: http://jd.benow.ca/

    Interesting Posts

    Почему C-массив имеет неправильное значение sizeof (), когда он передается функции?

    Как создавать эскизы для менее распространенных видеоконтейнеров (mkv, ogm, mp4, flv, rmvb и mov) в обозревателе Windows 7?

    Spring Boot – невозможно определить встроенный class драйвера базы данных для типа базы данных NONE

    Генератор случайных паролей: многие, в столбцах, в командной строке, в Linux

    Как интерпретировать Logcat

    Есть ли способ увидеть какой-либо прогресс в tar за файл?

    В чем разница между MOV и LEA?

    Подключение к VPN с помощью командной строки приводит к ошибке 691

    TwitteR, ROAuth и Windows: зарегистрируйтесь в порядке, но проверка сертификата не выполнена

    Ошибка: Status {statusCode = DEVELOPER_ERROR, разрешение = null}

    Является ли часть возвращаемого типа сигнатурой функции?

    Как найти полное имя сборки?

    Импортированные виртуальные машины не запускаются, а загружаются в бесконечном цикле

    Как запустить функцию bash_profile из файла псевдонимов desktop .command на OSX Lion?

    Импортировать обычный файл CSS в файл SCSS?

    Давайте будем гением компьютера.