Як я "декомпілюю" файли класу 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 Decompiler (ще один швидкий декомпілятор 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
У випадку, якщо хтось встановив плагін декомпілятора Java Eclipse на Eclipse Juno, і Eclipse почав висіти на Marketplace DND Initialization, змусивши знищити весь процес: видалення jd. *. Jar із каталогу плагінів Eclipse просто виправило мене.
— LSerni

4
@ Rishi так само, як ви захищаєте свій 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
— Andrew

javadecompilers.com - рятувальник бро!
— MarcoZen

kpdus.com/jad.html є деяким посиланням AD
— квітня 16:15

Дякую @marcinj, я знайшов ще одне посилання, яке містить посилання, щоб завантажити його.
— billjamesdev

51

Щоб побачити вихідний код Java, перевірте декомпілятор. Перейдіть на пошук jad .

Якщо ви хочете побачити байт-коди, просто використовуйте javap, який постачається з JDK.


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

29

Я спробував кілька, і Procyon здавалося, найкраще працює для мене. Він перебуває під активною розробкою і підтримує безліч функцій останніх версій Java.

Це інші, які я спробував:

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

1
Зауважте, що IGNORE_EXCEPTIONSтепер предмет було змінено на прапор командного рядка -skip.
— Сурма



13

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

Також Java Decompiler - це декомпілятор, що має як автономний інтерфейс GUI, так і інтеграцію Eclipse.

Нарешті, Jdec не згадується, хоча він не такий відполірований, як інші варіанти.


Чи знаєте ви, як декомпілювати конкретний файл класу за допомогою Soot? Я не впевнений, що це можливо ...
— Janus Troelsen

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
Procyon найкраще працює !!!!
— MarcoZen

10

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

DJ Decompiler Mocha


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 . Принаймні, він має вихідний Java-код і міг декомпілювати мій .class належним чином.

Рекомендую спочатку перевірити «гілки / загальні» відділення. Стовбури не стійкі.


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

4

На платформі IntelliJ IDEA ви можете використовувати Java Decompiler IntelliJ Plugin . Це дозволяє відображати всі джерела Java під час процесу налагодження, навіть якщо у вас їх немає. Він заснований на відомих інструментах JD-GUI .

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


@ NoOP's Ти робот? Або просто не звертати уваги на предмет перегляду?
— naXa

Вибачте за це, на перший погляд здається, що лише відповідь на посилання. Можливо, ви повинні додати більше деталей, а також відповідь відповідати лише заголовку питання, а не змісту питання.
— ashiquzzaman33

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
— Крістіян Ілієв

@Chris Ви спробували запропоноване рішення? Ви навіть читали запитання ?
— naXa

1
@ NoOP вибачте за грубість = (Мене переймає кількість рецензентів, які не звертають уваги.
— naXa

1

За допомогою AndroChef Java Decompiler ви можете декомпілювати файли класів apk, dex, jar та java. Це просто і легко. 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.