Декомпиляция Java и .NET
Нажмите F3 на скомпилированном файле и увидите исходный код вместо байтов. Этим занимаются два плагина — один для Java (.class, .jar, .apk, .dex) и один для .NET (.dll, .exe, .winmd, .netmodule), — и ведут они себя одинаково, поэтому эта страница описывает оба. Каждый можно отключить или удалить по отдельности в Конфигурация ▸ Плагины….
Архив показывается деревом своих классов, отдельный класс — одним файлом. Декомпилировать в исходники в меню «Команды» записывает результат и кладёт его в панель, так что в нём можно искать, сравнивать и копировать, как в любой другой папке с исходниками.
Движок вы устанавливаете сами¶
Ни один декомпилятор не входит в комплект, и ничего не загружается за вас. Это сделано намеренно по двум причинам: JD-Core, самый известный декомпилятор Java, распространяется под GPLv3 и не мог бы поставляться внутри приложения под Apache-2.0 — а движки становятся лучше, и их замена не должна требовать новой версии Peach Commander.
Папка движков… в просмотрщике открывает папку, куда они помещаются. Тамошний README называет каждый движок и его лицензию.
| Java | CFR, Vineflower, Procyon, jadx (для андроидных .dex и .apk) и javap для чистого байт-кода |
| .NET | ILSpy и monodis для IL |
Проверить движки запускает у каждого движка команду версии и различает три вещи: установлен и работает, не установлен, и установлен, но не может запуститься — инструмент Java без JDK присутствует и всё равно не стартует, и выясняется это лишь при настоящем запуске.
Движок описывается данными, а не кодом, поэтому вы можете добавить свой:
[cfr]
kinds = class, jar
tool = java
args = -jar {engine} {input}
engine = ~/Library/Application Support/PeachCommander/decompilers/cfr.jar
output = stdout
Когда файл по силам нескольким движкам, используется первый доступный, если вы не выберете конкретный. При двух установленных Сравнить показывает оба результата рядом — полезно, когда один движок сдаётся на методе, с которым справляется другой.
Поиск в скомпилированном коде¶
Искать во всех классах просматривает декомпилированный текст, а не байты, так что в JAR можно найти строковый литерал или имя метода.
Декомпиляция во время поиска по содержимому по множеству файлов — отдельный переключатель, по умолчанию выключенный: получение текста может означать запуск движка по разу на каждый класс, что на медленной машине не та трата, которую стоит нести ради поиска. Главный диалог поиска спрашивает отдельно; здесь это тоже отклоняется.
Кэш и ограничения¶
Результаты кэшируются, потому что декомпилировать один и тот же класс дважды — чистое ожидание. В настройках есть, сколько дней хранить результаты, и ограничение размера кэша; Очистить кэш сейчас опустошает его и сообщает, сколько освободилось.
Два тайм-аута защищают от движка, который не заканчивает: один на отдельный класс или тип, другой на целый архив. Оба принимают 0, что означает «использовать значение движка по умолчанию».