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


556

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

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


4
Искусство «декомпиляции» также можно рассматривать как реверс-инжиниринг. Хотя иногда при обратном проектировании чего-то не всегда есть доступ к двоичным файлам.
Макач

Никто не упомянул bytecodeviewer.com , который может декомпилироваться в исходный код Java и в байт-код (для исходного кода Java используется JAD).
Фернандо Гонсалес Санчес

Ответы:


588

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

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 (еще один декомпилятор Fast Java) имеет:

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

Скриншот

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

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


5
+1 Стоит отметить, что он также является модульным, поэтому ядро ​​(реализованное в C ++) может быть использовано в другом месте.
Куинн Тейлор

1
jd-gui-0.3.3 также доступен здесь
удивление

1
В случае, если кто-то установил плагин Eclipse для Java-декомпилятора на Eclipse Juno, и Eclipse начал зависать на Marketplace DND Initialization, вынудив завершить весь процесс: удаление jd. *. Jar из каталога плагинов Eclipse только что исправило это для меня.
LSerni

4
@ Риши так же, как вы защищаете свою IP на любом языке или платформе - хорошие юристы. DRM - это только повязка.
Сурьма

1
Теперь он предлагает SaaS, куда вы загружаете файл .class в облако, и возвращает вам декомпилированный код. Работал на простой POJO.
Сальвадор Валенсия

101

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

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

И многое другое

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


2
Позвольте мне также добавить, что Procyon, CFR, JAD и DJ доступны в виде веб-сервиса: javadecompilers.com
Андрей Рукин

javadecompilers.com - спасатель, братан!
MarcoZen

kpdus.com/jad.html - это ссылка на AD
marcinj

Спасибо @marcinj, я нашел другую ссылку, которая имеет ссылки для ее загрузки.
billjamesdev

51

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

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


5
Я бы порекомендовал один из декомпиляторов с открытым исходным кодом, так как они активно развиваются. Вместо этого используйте Procyon , декомпилятор CFR или Krakatau (Python).
Янус Троелсен

29

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

Это другие, которые я пробовал:

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

1
Обратите внимание, IGNORE_EXCEPTIONSчто теперь эта вещь была изменена на флаг командной строки -skip.
Сурьма



13

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

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

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


Знаете ли вы, как декомпилировать конкретный файл класса с помощью Soot? Я не уверен, что это возможно ...
Янус Троелсен

12

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


11

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

Procyon , с открытым исходным кодом, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

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

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

Fernflower , с открытым исходным кодом, https://github.com/fesh0r/fernflower ,

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

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

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


1
Процион работает лучше всего !!!!
MarcoZen

10

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

DJ декомпилятор мокко


9

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


3
здесь вы идете: я только что опубликовал ответ на ваш ответ;) JDK1.5 и более поддерживается!
VonC

«Я не видел каких-либо инструментов, которые будут должным образом обрабатывать 1,5+ классов» - Procion, Fernflower, JDCore и CFR (этот обрабатывает Java 8!)
Эндрю Рукин


6

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

http://www.varaneckas.com/jad


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

  • Также, если вы просто хотите увидеть методы, используйте javap.


5

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

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


4

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

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


1
JODO поддерживается время от времени, в то время как CFR и Procyon активно развиваются и имеют поддержку JDK 8.
Янус Троелсен

4

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

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


@ NoOP's Вы робот? Или просто не обращая внимания на предмет обзора?
NaXa

Извините за это, на первый взгляд кажется, что ссылка только ответ. Может быть, вы должны добавить больше деталей, а также ваш ответ соответствует только заголовку вопроса, но не содержанию вопроса.
ashiquzzaman33

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
Кристиан Илиев

@ Крис, ты пробовал предлагаемое решение? Вы вообще читали вопрос ?
NaXa

1
@ NoOP извините за грубость = (Я поражен количеством рецензентов, которые не обращают внимания.
naXa

1

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

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


1
@Dimitrius, пожалуйста, внимательно прочитайте ответы во время обзора. Как вы себе представляете, включая FernFlower или AndroChef здесь?
NaXa

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.