Skip to content

Декомпіляція 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, що означає «використати типове значення рушія».