Декомпиляция 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.