Як декомпілювати цілий файл Jar? [зачинено]


283

Хтось знає про безкоштовний декомпілятор, який може декомпілювати весь файл Jar замість одного класу? У мене проблема з підкласами, такими як name $ 1.class name $ 2.class name.class


127
Запам’ятайте ще дві речі: 1) Сама згадка про декомпілятор призведе до того, що «вищі, ніж ви», і винесе ціннісні судження про ваші мотиви, незважаючи на те, що ви не маєте уявлення про те, що плануєте використовувати, тому будьте обережні, з ким ви спілкуєтесь. 2) Фантастичний JavaDecompiler подарує вам чудове видання коду, добре викладений і простий для читання - відсутні лише коментарі. Дивовижно добре, відновлення файлу JAR, який давно втратив джерело в комплекті зі змінними іменами. Звичайно, ми не перекриваємо наші внутрішні файли JAR.
Андрій

Дивіться також зауваження в пост Вибір та тестування Java-декомпілятора .
dma_k

8
Я стільки разів зупинявся на цій темі, коли мені потрібно було вивчити, як хтось щось зробив для плагіна Bukkit ... Цей коментар завжди залишає мене з посмішкою. Я б хотів, щоб я міг підсилити це кожного разу, коли заїжджаю.
Джейн Панда

Java Decompiler SecureTeam може це зробити.
SecureTeam Software

Простий онлайн-декомпілятор, якщо ви не хочете завантажувати жодне програмне забезпечення. javadecompilers.com
Нік Грем

Відповіді:


313

2009 рік: JavaDecompiler може добре виконати роботу з баночкою: з 0.2.5 відображаються всі файли у файлах JAR.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

Дивіться також питання "Як я" декомпілюю "файли класу Java?" .

Здається, JD-Eclipse не змінився з кінця 2009 року (див. Зміни ).
Тому його інтеграція з останніми програмами Eclipse (3.8, 4.2+) може бути проблематичною.

JD-Core активно підтримується.

Обидва є результатом фантастичної роботи (користувача SO) Еммануеля Дюпюя .


2018: Більш сучасний варіант, згаданий в коментарях по Девіду Кеннеді Араужо :

JetBrains / intellij-спільнота / плагіни / java-декомпілятор / двигун

Fernflower - це перший фактично працюючий аналітичний декомпілятор для Java та, ймовірно, для мови програмування високого рівня загалом.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

Див. Також Як декомпілювати в java файли ідею Intellij для команди, що працює з недавнім IntelliJ IDEA.


5
fyi, Java-декомпілятор працює на windows, mac та linux.
yanokwa

4
@AlexS приємно :) Наступний крок: контроль версій ( stackoverflow.com/questions/59561 / ... ) І потім Continuous Integration ( stackoverflow.com/questions/130592 / ... )
VonC

3
За допомогою Java Decompiler ви можете відкрити файл JAR та перейти до Файл, зберегти всі джерела. Він зберігає всі файли класів у файли java = D
Акіра Ямамото

2
Будь ласка, пам’ятайте, що він також робить помилки. У мене є клас зі змінною Member, і він перемістив його до параметра функції, знищивши ефект коду. Слідкуйте, це вам дістанеться.
CharlesW

1
JD - хороша відправна точка, але не вдасться декомпілювати складний код. Хорошою альтернативою є використання github.com/JetBrains/intellij-community/tree/master/plugins/…
Девід Кеннеді,

37

Перш за все, варто пам’ятати, що всі файли архіву Java ( .jar/ .war/ тощо) - це в основному просто фантазійні .zipфайли , з кількома доданими маніфестами та метаданими.

По-друге, для вирішення цієї проблеми я особисто використовую кілька інструментів, які вирішують цю проблему на всіх рівнях:

  • Jad + Jadclipse під час роботи в IDE для декомпіляції.classфайлів
  • WinRAR , мій улюблений інструмент стиснення, який підтримує архіви Java (ще раз, див. Перший параграф).
  • Крім порівняння , мій улюблений інструмент diff, коли правильно налаштований, може робити повні порівняння між будь-якими архівними файлами, включаючиjars. Ну варто спробувати.

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


lolz, я продовжую розкручувати розширення для chrome та firefox, і я забув, що .jar - це теж блискавки :)
Carter Cole

36

Якщо у вас є як bash shell, так і jad:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

Я можу бути крихітним, крихітним, але це має працювати більш-менш, як рекламується. У вас має бути $JAR.tmpвміст декомпільованих файлів.


1
в ubuntu використовуйте #! / bin / bash замість #! / bin / sh becausw pushd не працює для оболонки ubuntu за замовчуванням ...
mossplix

1
Я використовую javapцю базову структуру циклу, і вона працює для мене.
Кріс Принс

25

Я мав розумний успіх із інструментом під назвою (розчаровуючи) " JD: Java Decompiler ".

Я вважаю це кращим, ніж більшість декомпіляторів, коли маємо справу з класами, складеними для Java 5 і вище . На жаль, він все ще може мати деякі гикавки, коли JAD, як правило, досягає успіху.


Не вдалося завантажити Windows або Linux версію JD-GUI. Чи ця проблема постає лише у мене?
mmdemirbas

@JanusTroelsen Я її видалив. Дякуємо, що повідомили про це.
Дайте

@ Zero3: оновлено
Gowtham Gopalakrishnan

11

Щось на зразок:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

може бути?


1
Я деякий час використовував джад і мені потрібен був швидкий спосіб витягти та декомпілювати цілу банку. Дякую, це надзвичайно допомогло.
Alper Akture

5

Вставте наступне в decompile.jar.sh

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // виконуваний файл
  • ln -s ./decomplie.jar.s / usr / bin / dj

Готові до використання, просто введіть dj your.jarі ви отримаєте your.jar.srcпапку з джерелами. Використовуйте -dопцію для режиму налагодження.


Дякую, але довелося змінити "jad" на "./jad" у рядку 23 та запустити "bash decompile.jar.sh foo.jar -d", оскільки я не хотів забруднювати свою папку bin
Сем

будь-який рекомпілятор? перекомпілює файли jad в jar?
N Jay

2

Файл jar - це лише поштовий файл з розширенням jar. Ви повинні мати можливість розпакувати (winzip) банку так само, як поштовий файл.


1

Ви витягаєте його, а потім використовуєте джид проти реж.


Я не думаю, що ти можеш просто запустити його проти реж. Вам потрібно буде вказати {dir} / ** / *. Class
Vihung

Витягніть банку і використовуйте щось на зразок jad {dir}, я щойно перевірив її і не працює на windows
Jaime Hablutzel

1

Примітка. Це рішення працює лише для користувачів Mac і * nix.

Я також намагався знайти Джад без удачі. Моє швидке рішення - завантажити MacJad, який містить jad. Завантаживши його, ви можете знайти jad у [де-ви-завантажили-macjad] / MacJAD / Зміст / Ресурси / jad.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.