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

StackOverflow https://stackoverflow.com/questions/647116

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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) Emmanuel Dupuy.


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\

Смотрите также Как декомпилировать файлы intellij idea в Java для команды, работающей с недавней IntelliJ IDEA.

Другие советы

Если у вас есть и оболочка 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 , содержащий ваши декомпилированные файлы.

Прежде всего, стоит помнить, что все архивные файлы Java (.jar/.war/и т.д. ...) являются все это в основном просто фантазии.zip Файлы, с несколькими добавленными манифестами и метаданными.

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

  • Джад + Джадклипс при работе в IDE для декомпиляции .class Файлы
  • WinRAR ( ВинРАР ), мой любимый инструмент сжатия изначально поддерживает архивы Java (опять же, см. Первый абзац).
  • Вне всякого сравнения, мой любимый инструмент diff, при правильной настройке может выполнять сравнения "на лету" между любыми архивными файлами, включая jars.Что ж, стоит попробовать.

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

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

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

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

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

может быть?

Вставьте следующее в 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 опция для режима отладки.

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

Вы извлекаете его и затем используете jad против dir.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top