Декомпиляция Java приложений

Недавно я задался вопросом: Какой декомпилятор 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

JD-Core (автор — Emmanuel Dupuy) — очень мощная и функциональная библиотека для декомпиляции и анализа байткода Java, разработанная в рамках «Java Decompiler project». Имеет следующие особенности:

Полностью написана на языке C++, что делает декомпиляцию необычайно быстрой
Не требует для работы Java Runtime Environment и поэтому не требует специальной установки
Корректно декомпилирует .class-файлы, сгенерированные большинством компиляторов

Пожалуй, к недостаткам JD-Core можно отнести лишь то, что она распространяется как часть самостоятельного графического приложения JD-GUI, также разработанного на C++ и прилинкованного к ней статически, или плагина JD-Eclipse для среды разработки Eclipse, что делает практически невозможным её использование в стороннем некоммерческом проекте, особенно разработанном на языке Java. Использование библиотеки в коммерческих программных продуктах запрещено автором.

Fernflower

Fernflower — один из лучших декомпиляторов языка программирования Java на сегодняшний день. Обладает следующими возможностями:

1. Поддерживает разнообразные языковые конструкции:
Параметрические типы
Аннотации
Перечислимые типы
Утверждения
2. Корректно декомпилирует байткод, сгенерированный вследствие некоторых известных багов компиляторов

Последняя offline версия Fernflower используется, например, в MCP (mcp.ocean-labs.de/index.php/MCP_Releases), оттуда же ее можно скачать. Модуль переименований в ней должен быть.

К сожалению, пока на чем-то одном врядли можно остановится. Одни куски хорошо декомпилируются в jd-gui, другие в fernflower. Иногда нужно использовать 2, а то и 3 разных декомпилятора, чтобы получить вменяемый код.

JD-GUI уж очень падуч и современные конструкции плохо распознаёт, но несложные алгоритмы им вполне можно раскалывать. Если нужен обязательно бесплатный и поддерживаемый декомпилер — JD-GUI определенно лучший. Бесплатный, поддерживает аннотации, дженерики, енамы и т.п., багтрекер на официальном сайте.

JAD умер тогда, когда появилась Java5, ибо ни дженериков ни аннотаций он не поддерживает.

Относительно недавно появился android-decompiler jeb. По картинкам и тому, как распознает, очень похож на FernFlower, но товарищи говорят, что в jeb свой декомпилятор, и не java, а сразу dalvik байткода.

Стоит почему-то очень дорого ($1000 за лицензию), триалки или чего-то подобного нету. Видимо, расчитано на профессиональных реверсеров. Хотя суть все та же: dex2jar + FernFlower/jd-gui + smali.

Есть ещё Jasper — не декомпилятор, а дизассемблер, который разбирает .class в формат джавовского ассемблера Jasmin. Код, конечно, получается чуть менее удобочитаемым, но зато работает эта штука, вроде, в 100% случаев и для небольших изменений софта очень даже годится.

К дизассемблерам совместимым с Jasmin могу отнести также D-Java и ClassFileAnalyzer.

Источник материала
Настоящий материал самостоятельно опубликован в нашем сообществе пользователем proper на основании действующей редакции Пользовательского Соглашения. Если вы считаете, что такая публикация нарушает ваши авторские и/или смежные права, вам необходимо сообщить об этом администрации сайта на EMAIL abuse@newru.org с указанием адреса (URL) страницы, содержащей спорный материал. Нарушение будет в кратчайшие сроки устранено, виновные наказаны.

You may also like...


Комментарии