Декомпиляция Java приложений
Недавно я задался вопросом: Какой декомпилятор лучше?
Начал мучить Google, экспериментировать. В итоге нашел отличное решение. Как декомпильнуть любую программу и получить рабочие «исходники»? Об этом в сабже.
Краткий обзор популярных декомпиляторов
Mocha
Mocha (автор — Hanpeter van Vliet)— это, вероятно, один из первых выпущенных декомпиляторов Java. Предоставляет консольный пользовательский интерфейс. Его релиз состоялся в 1996-ом году, ещё до того, как появился Java Development Kit версии 1.1
JAva Decompiler
JAva Decompiler, JAD (автор — Pavel Kouznetsov) — по всей видимости, самый
популярный декомпилятор Java. Как и Mocha, этот декомпилятор предоставляет консольный интерфейс, давно не обновляется и не поддерживается, но большое число графических инструментов для работы с ним, в том числе плагин JadClipse для среды разработки Eclipse, делают его и по сей день используемым в качестве подручного средства для декомпиляции небольших классов.
Помимо декомпиляции, JAva Decompiler обладает возможностью дизассемблирования .class-файлов.
DJ Java Decompiler
DJ Java Decompiler (автор — Atanas Neshkov) — долгое время вопреки названию являлся лишь графической оболочкой для предыдущего декомпилятора, позволявшей легко и удобно выбрать аргументы командной строки для вызова JAD. В текущей версии добавлена поддержка аннотаций, но декомпилятор стал условно-бесплатным (необходима покупка после 10 пробных использований).
JD-Core
- Полностью написана на языке C++, что делает декомпиляцию необычайно быстрой
- Не требует для работы Java Runtime Environment и поэтому не требует специальной установки
- Корректно декомпилирует .class-файлы, сгенерированные большинством компиляторов
Fernflower
- Параметрические типы
- Аннотации
- Перечислимые типы
- Утверждения
Мой выбор
- JD-GUI — для просмотра, не более
- Fernflower — полное восстановление
Fernflower будет развиваться в сторону деобфускатора
…
Специальных функций деобфускации Fernflower сейчас не содержит, они будут подключаться в дальнейшем отдельными модулями
Т.к. онлайн версия по неизвестным причинам не работает, а про оффлайн трудно что-либо сказать(кроме того, что качество декомпиляции отменное), не о каких модулях на данный момент речи быть не может.
Не хватает еще модуля переименования
Это да. Поищем что-то такое в интернетах.
На выручку придет Proguard, но необыкновенный
ProGuardDeobfuscator — небольшая модификация программы ProGuard, превращающая ее в квази-деобфускатор. В процессе обработки короткие обфусцированные имена пакетов, классов, полей и методов заменяются на более осмысленные и уникальные в пределах Jar файла.
Скачать исходники и сам деобфускатор: projectd8.org/Programs/Java/PGD
Инструменты все есть, но лично я, для облегчения воссоздания сорцов использую так же любимую Netbeans IDE — очень сильно помогает своими подсказками, особенно когда классов много.
Спасибо за внимание!
Ссылки
UPD:
Извиняюсь, в offline версии Fernflower присутствует модуль переименований и уйма других штук — Readme
Декомпиляция Java
Такое вообще возможно?
Я с жавой почти не знаком, но есть академический интерес заглянуть внутрь одной проги.
Пробовал JD и что то еще — на выходе куча файлов а.сlass, a$a.class, a$a$a.class и т.д.
Часть пустые, в других белиберда.
Это я что-то не так делаю?
Компилировать обратно не надо.
yirk ★★★
23.09.16 19:02:52 MSK
Если скомпилированные файлы не обфусцированы — не просто возможно, но и очень легко, исходники восстанавливаются практически вплоть до имён переменных (а если есть отладочная информация, то и с ними).
Legioner ★★★★★
( 23.09.16 19:05:46 MSK )
Последнее исправление: Legioner 23.09.16 19:06:17 MSK (всего исправлений: 1)
Ответ на: комментарий от Legioner 23.09.16 19:05:46 MSK
А как узнать, обфусцированы или нет?
yirk ★★★
( 23.09.16 19:07:19 MSK ) автор топика
А ты думал, что тебе из jar исходники нормально восстановятся? Лучше всего декомпилировать при помощи плагина в intellij idea. Но всё равно нормального исходника ты не получишь, + очень мало программ можно декомпилировать не нарушая лицензию.
peregrine ★★★★★
( 23.09.16 19:08:28 MSK )
Ответ на: комментарий от yirk 23.09.16 19:07:19 MSK

Декомпилировать и посмотреть на результат
Midael ★★★★★
( 23.09.16 19:12:43 MSK )

Это ProGuard скорей всего, оно читабельно. Но если проект большой и классов много, то ты просто с ума сойдешь во всех этих a-классах.
Вот что нашлось, не факт что может и оно вообще работает.
anonymous_sama ★★★★★
( 23.09.16 19:19:34 MSK )
Последнее исправление: anonymous_sama 23.09.16 19:24:52 MSK (всего исправлений: 1)
ищите слитые версии в гугле или демку пробуйте https://www.pnfsoftware.com/jeb2/
anonymous
( 23.09.16 21:15:57 MSK )

Возможно. Из того что более-менее реально работает — cfr/jd (из гита).
а.сlass — почищены имена классов. Если внутри белиберда — скорее всего декомпилятор не умееет новые конструкции, или обфускация.
vasily_pupkin ★★★★★
( 23.09.16 21:28:49 MSK )
очень хорошо восстанавливаются class файлы скомпилированные 1.4.2 и меньше. 1.5, 1.6 и 1.7 хуже. сложные 1.8 с лямдами очень плохо. лучше jd к сожалению ничего нет.
vtVitus ★★★★★
( 23.09.16 21:35:38 MSK )

iZEN ★★★★★
( 23.09.16 23:04:31 MSK )

Поздравляю, то что ты декомпилишь пропустили через обфускатор, логику работы понять до сих пор возможно, но разбирать все придется руками. Если с жабой (и косяками её декомплеров) не знаком, то вряд ли что-то поймешь.
ya-betmen ★★★★★
( 23.09.16 23:20:17 MSK )
Ответ на: комментарий от peregrine 23.09.16 19:08:28 MSK
Пункт три. В общем-то можно, в зависимости от намерений.
a1batross ★★★★★
( 23.09.16 23:32:01 MSK )
Последнее исправление: a1batross 23.09.16 23:33:44 MSK (всего исправлений: 1)
JD херня, не? fernflower встроен теперь в идею, можно и отдельно собрать и заюзать.
migesok ★
( 25.09.16 01:17:54 MSK )
Ответ на: комментарий от a1batross 23.09.16 23:32:01 MSK
Все намного проще. Если об этом никто не узнает, то можно декомпилировать что угодно, как угодно и для чего угодно.
anonymous
( 25.09.16 09:59:04 MSK )

Посоветую Процион, самый продвинутый из доступных, на мой взгляд.
ruzisufaka ★
( 25.09.16 13:21:26 MSK )
Ответ на: комментарий от peregrine 23.09.16 19:08:28 MSK

Лучше всего декомпилировать при помощи плагина в intellij idea.
Кто это сказал? Fernflower не особо фичастый декомпилятор, есть ещё CFR и JADX.
EXL ★★★★★
( 25.09.16 14:13:41 MSK )
Ответ на: комментарий от migesok 25.09.16 01:17:54 MSK

Берём идейку, fernflower и рандомное, простое Java-приложение.
java -jar fernflower.jar -dgs=true ../MIDlets-JARs/stack_attack_2_pro_color_915.jar ../MIDlets-JARs/StackAttack-Decompiled/
Открываем класс a.java:
. public static int a(String param0, d param1) < // $FF: Couldn't be decompiled >public static String a(int param0, String param1) < // $FF: Couldn't be decompiled >.
Ладно. Берём в правую руку старый-добрый JD, декомпилируем тот же самый мидлет, открываем тот же самый класс:
. public static int a(String paramString, d paramd) < System.gc(); int m = 0; if (paramd.d(paramString) == true) < return 0; >HttpConnection localHttpConnection = null; InputStream localInputStream = null; StringBuffer localStringBuffer = new StringBuffer(""); String str2 = c(paramString); try < str3 = System.getProperty("com.siemens.IMEI").trim(); str4 = "http://139.23.38.140/hs/user.asp?imei=" + str3 + "&nick=" + str2 + "&appid=001AEE0A&mnc=" + System.getProperty("com.siemens.MNC") + "&mcc=" + System.getProperty("com.siemens.MCC"); int i1 = 256; localInputStream = (localHttpConnection = (HttpConnection)Connector.open(str4)).openInputStream(); int i2; while (((i2 = localInputStream.read()) != -1) && (i1 >0)) < localStringBuffer.append((char)i2); i1--; >if (i1 == 0) < int i3 = -3; return i3; >> catch (Exception localException5) < m = -3; >finally < try < if (localInputStream != null) < localInputStream.close(); >> catch (Exception localException8) <> try < if (localHttpConnection != null) < localHttpConnection.close(); >> catch (Exception localException9) <> System.gc(); > if (m == -3) < return -3; >String str1 = localStringBuffer.toString(); String str3 = "registration successful"; String str4 = "alternative nick:"; if (str1.startsWith(str4)) < n = b(str1.substring(str4.length())); return -2; >if (str1.compareTo(str3) == 0) < paramd.b(paramString); paramd.a(); return 0; >return -1; > public static String a(int paramInt, String paramString) < System.gc(); paramString = paramString.trim(); HttpConnection localHttpConnection = null; InputStream localInputStream = null; StringBuffer localStringBuffer = new StringBuffer(""); String str2 = c(paramString); for (String str3 = Integer.toHexString(paramInt ^ 0xFEC17A11); str3.length() < 8; str3 = "0" + str3) <>int m = 0; try < String str4 = System.getProperty("com.siemens.IMEI").trim(); localInputStream = (localHttpConnection = (HttpConnection)Connector.open(str5 = "http://139.23.38.140/hs/hs.asp?appid=001AEE0A&imei=" + str4 + "&nick=" + str2 + "&hs=" + str3)).openInputStream(); int i1; while ((i1 = localInputStream.read()) != -1) < localStringBuffer.append((char)i1); m++; >> catch (Exception localException3) < String str5 = "Broken"; return str5; >finally < try < if (localInputStream != null) < localInputStream.close(); >> catch (Exception localException6) <> try < if (localHttpConnection != null) < localHttpConnection.close(); >> catch (Exception localException7) <> > if (m > 260) < return "Broken"; >String str1 = localStringBuffer.toString(); System.gc(); return str1; > .
Та-дам! Всё декомпилировалось как нужно.
Закрываем идейку и их говноподелку fernflower и выбрасываем её на помойку.
EXL ★★★★★
( 25.09.16 14:28:23 MSK )
Ответ на: комментарий от EXL 25.09.16 14:28:23 MSK
Воу, братан, кинь джарку или подскажи, где достать? Меня тема дико интересует, хочу понять, что там такого хитрого, что fernflower не понимает.
Я как-то пытался обмануть fernflower разными хитро подстроенными класс-файлами, но пока он меня громил в сухую. Ржака была, когда я составил метод с ациклическим control-flow графом не сводимым напрямую к if-ам, а он выплюнул пачку labeled-break-ов из блоков. Я даже не знал, что в Java так можно.
migesok ★
( 25.09.16 18:28:45 MSK )
Ответ на: комментарий от migesok 25.09.16 18:28:45 MSK

Не знаю, чего там fernflower не понимает, но говорит он при декомпиляции следующее:
INFO: Decompiling class a WARN: Heavily obfuscated exception ranges found! ERROR: Method a (Ljava/lang/String;Ld;)I couldn't be decompiled. java.lang.RuntimeException: parsing failure! at org.jetbrains.java.decompiler.modules.decompiler.DomHelper.parseGraph(DomHelper.java:217) at org.jetbrains.java.decompiler.main.rels.MethodProcessorRunnable.codeToJava(MethodProcessorRunnable.java:122) at org.jetbrains.java.decompiler.main.rels.ClassWrapper.init(ClassWrapper.java:86) at org.jetbrains.java.decompiler.main.ClassesProcessor.initWrappers(ClassesProcessor.java:303) at org.jetbrains.java.decompiler.main.ClassesProcessor.writeClass(ClassesProcessor.java:250) at org.jetbrains.java.decompiler.main.Fernflower.getClassContent(Fernflower.java:87) at org.jetbrains.java.decompiler.struct.ContextUnit.save(ContextUnit.java:147) at org.jetbrains.java.decompiler.struct.StructContext.saveContext(StructContext.java:72) at org.jetbrains.java.decompiler.main.Fernflower.decompileContext(Fernflower.java:54) at org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.decompileContext(ConsoleDecompiler.java:135) at org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(ConsoleDecompiler.java:96) WARN: Heavily obfuscated exception ranges found! ERROR: Statement cannot be decomposed although reducible! ERROR: Method a (ILjava/lang/String;)Ljava/lang/String; couldn't be decompiled. java.lang.RuntimeException: parsing failure! at org.jetbrains.java.decompiler.modules.decompiler.DomHelper.parseGraph(DomHelper.java:217) at org.jetbrains.java.decompiler.main.rels.MethodProcessorRunnable.codeToJava(MethodProcessorRunnable.java:122) at org.jetbrains.java.decompiler.main.rels.ClassWrapper.init(ClassWrapper.java:86) at org.jetbrains.java.decompiler.main.ClassesProcessor.initWrappers(ClassesProcessor.java:303) at org.jetbrains.java.decompiler.main.ClassesProcessor.writeClass(ClassesProcessor.java:250) at org.jetbrains.java.decompiler.main.Fernflower.getClassContent(Fernflower.java:87) at org.jetbrains.java.decompiler.struct.ContextUnit.save(ContextUnit.java:147) at org.jetbrains.java.decompiler.struct.StructContext.saveContext(StructContext.java:72) at org.jetbrains.java.decompiler.main.Fernflower.decompileContext(Fernflower.java:54) at org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.decompileContext(ConsoleDecompiler.java:135) at org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler.main(ConsoleDecompiler.java:96) INFO: . done
Вот только откуда там Heavily obfuscated exception ranges found — я не знаю.
Как декомпилировать class в java
Декомпиляция (от англ. «decompile» — разбор на составляющие) — это процесс восстановления исходного кода из скомпилированного кода.
В Java для декомпиляции .class файлов можно использовать различные инструменты, например:
- JD-GUI — это бесплатный графический интерфейс для декомпиляции .class файлов. Он доступен для Windows , macOS и Linux . Просто откройте .class файл в JD-GUI и вы получите доступ к исходному коду.
- Procyon — это бесплатный декомпилятор, написанный на Java . Он может декомпилировать .class файлы и файлы JAR . Вы можете использовать его из командной строки или как библиотеку в своем проекте.
- Fernflower — это другой бесплатный декомпилятор, написанный на Java . Он может декомпилировать .class файлы и файлы JAR , а также декомпилировать классы, которые были зашифрованы с помощью обфускатора.
Пример декомпиляции .class файла с помощью JD-GUI :
- Скачайте и установите JD-GUI с официального сайта
- Запустите JD-GUI и откройте .class файл, щелкнув на кнопке «Open File» в верхнем левом углу.
- Выберите .class файл, который вы хотите декомпилировать.
- JD-GUI покажет вам исходный код класса в окне редактора.
Важно отметить, что декомпиляция кода может быть незаконной в некоторых случаях, особенно если это нарушает авторские права. Поэтому, если вы не являетесь владельцем исходного кода, обязательно получите разрешение на декомпиляцию.
Декомпиляция .jar файла
Доброго времени суток.
После декомпиляции исполняемого jar-файла в каталоге не хватает файлов исходного кода. Пользовался fernflower, распаковка архива и последующая декомпиляция тоже ничего не дала. Кто-нибудь может помочь?
Сам файл прикреплен.
Вложения
| wega0.2s.zip (178.2 Кб, 13 просмотров) |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Декомпиляция .class файла
После декомпиляции .class файла и повторной компиляции приложение в котором используется это класс.
Запуск .Jar файла
добрый день программисты создал проект который заносит, считывает, удаляет данные из SQL. Когда.
Запуск jar-файла
Скажите плииз, почему напрочь не выполняется класс из jar-файла. Вот, собственно содержание.
Запуск jar файла
Здравствуйте. Кто-нибудь может подсказать, что делать, если при попытке запуска jar файла (как.
Почетный модератор
![]()
![]()
28044 / 15777 / 982
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
кто тебе сказал что там будут исходники?
Регистрация: 15.12.2014
Сообщений: 7
А что после декомпиляции еще может быть? Обычные java-файлы.
В архивах файлы до и после декомпиляции.
Вложения
| wega0.2s.zip (195.6 Кб, 3 просмотров) |
| wega0.2s_d.zip (20.7 Кб, 6 просмотров) |
![]()
4090 / 3824 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
shamless, Всё таки получилось декомпилировать? Что использовали?
Регистрация: 15.12.2014
Сообщений: 7
Пользовался fernflower. Информацию брал отсюда
Как запустить декомпилятор Fernflower?
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Создание jar файла
Есть класс, использующий внешние библиотеки. Он компилируется и запускается, но у меня не.

Выполнение jar-файла
При выполнении jar-файла все данные выводит в файл в одну строку, а при выполнении в Intelij Idea.

Создание jar файла
Как создать jar файл в intelij IDEA 14.0.3? Гуглить пробовал,поиском по форуму также пользовался.
Чтение файла из jar
Подскажите пожалуйста как правильно читать файл из jar(что-то вроде дефолтных настроек) сейчас.
