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

283

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

Каменное сердце
источник
127
Помните еще две вещи: 1) Простое упоминание декомпилятора приведет к тому, что «святее вас» выйдет и сделает ценностные суждения о ваших мотивах, даже не зная, каково ваше запланированное использование, поэтому будьте осторожны с тем, с кем вы разговариваете. 2) Причудливый JavaDecompiler предоставит вам превосходное представление кода, хорошо продуманное и легкое для чтения - пропускает только комментарии. Это поразительно хорошо, восстанавливая JAR-файл, который давно потерял источник, с именами переменных. Конечно, мы не запутываем наши собственные файлы JAR.
Андрей
Смотрите также замечания в посте Выберите и протестируйте Java-декомпилятор .
dma_k
8
Я останавливался в этой теме много раз, когда мне нужно было изучить, как кто-то что-то сделал для плагина Bukkit ... Этот комментарий всегда оставляет меня с улыбкой. Хотелось бы, чтобы я высказывал это каждый раз, когда захожу.
Джейн Панда
SecureTeam Java Decompiler может сделать это.
SecureTeam Software
Простой онлайн-декомпилятор, если вы не хотите загружать какое-либо программное обеспечение. javadecompilers.com
Ник Грэм

Ответы:

313

2009: JavaDecompiler может хорошо работать с jar: начиная с 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 idea для команды, работающей с недавним IntelliJ IDEA.

VonC
источник
5
Кстати, Java-декомпилятор работает на Windows, Mac и Linux.
Яноква
4
@AlexS nice :) Следующий шаг: управление версиями ( stackoverflow.com/questions/59561/… ) и затем непрерывная интеграция ( 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/ etc ...) - это в основном просто модные .zipфайлы с несколькими добавленными манифестами и метаданными.

Во-вторых, для решения этой проблемы я лично использую несколько инструментов, которые решают эту проблему на всех уровнях:

  • Jad + Jadclipse при работе в IDE для декомпиляции.classфайлов
  • WinRAR , мой любимый инструмент сжатия, изначально поддерживает Java-архивы (опять же, см. Первый абзац).
  • Помимо сравнения , мой любимый инструмент сравнения, при правильной настройке, может делать сравнения на лету между любыми архивными файлами, включаяjars. Стоит попробовать.

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

Ювал Адам
источник
лолз, я продолжаю расстегивать молнию на расширениях chrome и firefox, и я забыл, что .jar - это тоже просто молнии :)
Картер Коул
36

Если у вас есть и оболочка bash, и 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, потому что pushd не работает в стандартной оболочке Ubuntu ...
mossplix
1
Я использую javapв этой базовой структуре цикла, и она работает для меня.
Крис Принс
25

У меня был разумный успех с инструментом под названием (разочаровывающе) " JD: Java Decompiler ".

Я нашел это лучше, чем большинство декомпиляторов при работе с классами, скомпилированными для Java 5 и выше . К сожалению, у него все еще могут быть некоторые сбои, когда JAD обычно преуспевает.

Адам Пейнтер
источник
Я не мог загрузить версию JD-GUI для Windows или Linux. Эта проблема только кажется мне?
mmdemirbas
@JanusTroelsen Я удалил его. Спасибо за уведомление. Давайте держать ответы в чистоте :)
pramodc84
@ Zero3: обновлено
Гаутам Гопалакришнан,
11

Что-то вроде:

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

может быть?

cybertoast
источник
1
Некоторое время я использовал jad, и мне нужен был быстрый способ извлечь и декомпилировать целую банку. Спасибо, это очень помогло.
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опцию для режима отладки.

merzod
источник
Спасибо, но пришлось изменить «jad» на «./jad» в строке 23 и запустить «bash decompile.jar.sh foo.jar -d», так как я не хотел загрязнять свою папку bin
Sam
какой-нибудь перекомпилятор? перекомпилирует файлы JAD в JAR?
N Jay
2

Файл jar - это просто zip-файл с расширением jar. Вы должны быть в состоянии распаковать (winzip) банку, как почтовый файл.

Cadoo
источник
1

Вы извлекаете его, а затем используете JAD против DIR.

Янченко
источник
Я не думаю, что вы можете просто запустить его против режиссера. Вам нужно будет указать {dir} / ** / *. Class
Vihung
Извлеките флягу и используйте что-то вроде jad {dir}, я только что проверил это и не работает на окнах
Хайме Хаблутцель
1

Примечание. Это решение работает только для пользователей Mac и * nix.

Я также попытался найти Jad без удачи. Моим быстрым решением было загрузить MacJad , содержащий jad. Как только вы загрузили его, вы можете найти jad в [где-вы-скачали-macjad] / MacJAD / Contents / Resources / jad.

Джоэл С
источник