Pull to refresh

Comments 37

Я ещё использую плагин для TotalCmd, чтобы быстро посмотреть class налету: TC Jad
Про плагин JD-Eclipse можно добавить, что ему иногда требуется realignment во время отладки. Так как не всегда строки полученных сырцов совпадают с позицией курсора. Если интересно, можно посмотреть тут. Или погуглить по другим веткам.
К сожалению, пока, на чем то одном врядли можно остановится. Одни куски хорошо декомпилируются в jd-gui, другие в fernflower. Иногда нужно использовать 2, а то и 3 разных декомпилятора, что бы получить вменяемый код.
Кто то вообще в курсе, что происходит с fernflower? Сайт не работает, ни откуда официально скачать нельзя, только по закромам.
Или видимо автор ушел в платную версию с проектом AndroChef?
А все, это разные авторы. AndroChef и DJ Java Decompiler — Atanas Neshkov
Но вопрос про fernflower тот же, где он? :)
На сайт у меня сейчас времени нет, к сожалению :( Он как-то повадился падать, и после очередного падения не поднял. Тем более, что на нем версия 0.6 была, а с тех пор многое добавилось.

Скачать официально см. ниже, MCP например. Атанас использует Fernflower с моего ведома и разрешения.
Извиняюсь за «некрофилию», но, как мне кажется, именно здесь самое подходящее место для следующего вопроса:

Когда вы только выпускали Fernflower «в свет», вы сказали следующее: «Если в какой-то момент я пойму, что больше не могу уделять проекту необходимое количество времени, то сразу открою его под GPL-подобной лицензией независимо ни от каких внешних обстоятельств». Насколько я понимаю, обновлений самого декомпилятора не было уже очень долгое время, сайт не работает (и даже домен уже увели). Можно уточнить, какие на настоящее время ваши планы относительно раскрытия проекта под свободной лицензией? (Причём я уверен, что абсолютное большинство заинтересованных будут рады раскрытию в _любом_ виде, даже без «причёсывания»).
Не хочу пока давать подробности, чтобы не сглазить. Но могу сказать, что сейчас идет обновление на Java 7 / 8 и подготовка открытия кода под одной из свободных лицензий. Надеюсь, все получится как запланировано :)
А на какой стадии сейчас находится этот процесс?
Для галочки можно еще назвать soot, правда выдает в большинстве случаев какую то какашку, но так или иначе, как еще один взгляд на декомпиляцию подойдет.
>> Но вопрос про fernflower тот же, где он? :)

Здесь он. В смысле я — автор Fernflower :)

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

а также хотелось бы возможность вывода результата декомпиляции (одного класса) в STDOUT.

Спасибо.
de.fernflower.main.extern.IFernflowerPreferences
В этом классе описаны константы опций.
По идее — если из того же MCP качать — то к jar'у прилагается еще и readme файл (а также файл с лицензией, ага).

Кому качать лень, он тут отдельно: pastebin.com/bh83nHL5

>>а также хотелось бы возможность вывода результата декомпиляции (одного класса) в STDOUT.

Такого действительно пока нет, возьму в список хотелок.
Можно еще попросить опцию, чтобы номера строк вставлялись в файл аутпута? удобно при дебаге — валится с ошибкой в строке номер такая-то. Декомпилировал — и сразу ага, вот строка.

Спасибо!
Спасибо.
Я ведь правильно понимаю, что с конца 2010-го в проекте не было никаких изменений?
(дата классов в jar'е — 2010-12-28)
С опцией -ren переименованию подвергаются так же и конструкторы классов.
Исправьте, пожалуйста, в следующих версиях
Кстати, оказалось, что в посте как-раз последняя версия fernflower :)
Как пользоваться модулем переименований?
JD-GUI уж очень падуч и современные конструкции плохо распознаёт, но несложные алгоритмы им вполне можно раскалывать.
Я яву декомпилировал для изучения кода под Android. Качество работы утилит настолько неприемлемо, что оказалось проще изучить smali.
Поддерживаю. Smali читать достаточно легко, модифицировать — приемлимо. Вот еще бы ide под него ;)
Относительно недавно появился android-decompiler (jeb). Кто то вкурсе что там за ява декомпилятор? По картинкам и тому как распознает очень похож на FernFlower, но возможно там что то свое.

Стоит почему то очень дорого ($1000 за лицензию), триалки или чего то подобного нету. Видимо расчитано на профессиональных реверсеров. Хотя суть все та же: dex2jar + FernFlower/jd-gui + smali.
В jeb свой декомпилятор. И не java, а сразу dalvik байткода. Нет смысла обратно конвертировать обратно в java байткод, когда после конвертации многие конструкции не будут выглядеть как раньше (можно представить себе promt англ-рус-англ). Уж лучше брать парсить dex (благо libdex есть) и строить java из него, т.е. суть у него другая.
А, все оказывается написано на офф сайт :) Но он почему то лежал во время написания комента, сейчас уже подняли.
JD-GUI определенно лучший. Бесплатный, поддерживает аннотации, дженерики, енамы и т.п., багтрекер на официальном сайте.

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

С Fernflower непонятная ситуация — официальный сайт лежит, вы здесь какой-то JAR выложили, но где гарантия что это не вирус? Надо декомпильнуть и разгрести с помощью JD-GUI чтоб убедится? (-:
Плюс по слухам он не может декомпилировать например такой код — pastebin.com/f0aE6Jh0 — тогда как JD-GUI это делает легко.
> JAva Decompiler обладает возможностью дизассемблирования .class-файлов.
Это как? чем оно отличается от декомпиляции?
Отличается тем, что при декомпиляции мы получаем привычный нам код, а при дизассемблировании — в виде набора команд JVM
JD-Eclipse вещь капризная, по моему опыту требует VCRT, которая входит в состав какой-то версии .NET, и не работает в 64-разрядном Eclipse.
Есть ещё Jasper — не декомпилятор, а дизассемблер, который разбирает .class в формат джавовского ассемблера Jasmin. Код, конечно, получается чуть менее удобочитаемым, но зато работает эта штука, вроде, в 100% случаев и для небольших изменений софта очень даже годится.
Ну это уже отдельный разговор :)
К дизассемблерам совместимым с Jasmin могу отнести также D-Java и ClassFileAnalyzer
Для тех, кто в будущем найдет этот пост: для меня fernflower в своем исходном виде оказался неюзабелен совершенно (слишком много классов не разбирает вообще, выпадая с NPE), зато вот с этим патчем отработал просто на «ура».
Автору плюс в карму (не только на хабре, но и вообще) и пожелания вернуть своему детищу хотя бы просто страничку, где его можно скачать.

Сюда же добавлю багрепорт, вдруг автор прочитает :) У меня самая частая ошибка в получаемых исходниках: fernflower ставит модификатор final у переменных, используемых в безымянных классах даже тогда, когда вне этих классов переменная меняется. JAD в этих случаях перед сразу определением безымянного класса создает отдельную final-переменную, равную исходной в данный момент.

Лучше собрать самому из исходников или взять fernflower.jar из поставки IntelliJ IDEA.
Но у последнего варианта есть небольшой минус — в манифесте jar не указан Main-Class. Придётся написать батник и указать класс вручную. Впрочем, батник придётся написать в любом случае.

Sign up to leave a comment.

Articles