Як я "декомпілюю" файли класу 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.