Skip to content

Decompilare Java e .NET

Premete F3 su un file compilato e vedrete codice sorgente invece di byte. Lo fanno due plugin — uno per Java (.class, .jar, .apk, .dex) e uno per .NET (.dll, .exe, .winmd, .netmodule) — e si comportano allo stesso modo, perciò questa pagina copre entrambi. Ciascuno si può disattivare o rimuovere per conto suo in Configurazione ▸ Plugin….

Un archivio compare come albero delle sue classi; una singola classe come un file. Decompila nei sorgenti nel menu Comandi scrive il risultato e lo mette in un pannello, così potete cercarci dentro, confrontare e copiare come in qualsiasi altra cartella di sorgenti.

Il motore lo installate voi

Nessun decompilatore è incluso e nulla viene scaricato per voi. È voluto, per due ragioni: JD-Core, il decompilatore Java più noto, è GPLv3 e non poteva essere distribuito dentro un’app Apache-2.0 — e i motori migliorano, quindi sostituirne uno non dovrebbe richiedere una nuova versione di Peach Commander.

Cartella dei motori… nel visualizzatore apre la cartella a cui appartengono. Il README lì dentro nomina ogni motore e la sua licenza.

Java CFR, Vineflower, Procyon, jadx (per .dex e .apk Android) e javap per il bytecode puro
.NET ILSpy e monodis per l’IL

Verifica i motori esegue il comando di versione di ciascun motore e distingue tre cose: installato e funzionante, non installato, e installato ma incapace di partire — uno strumento Java senza JDK è presente e comunque non si avvia, e solo eseguendolo davvero lo si scopre.

Un motore è descritto da dati e non da codice, quindi potete aggiungerne uno voi stessi:

[cfr]
kinds  = class, jar
tool   = java
args   = -jar {engine} {input}
engine = ~/Library/Application Support/PeachCommander/decompilers/cfr.jar
output = stdout

Quando più motori possono gestire un file, si usa il primo disponibile a meno che non ne scegliate uno. Con due installati, Confronta mostra entrambi i risultati affiancati — utile quando un motore rinuncia su un metodo che l’altro riesce a gestire.

Cercare dentro codice compilato

Cerca in tutte le classi scorre il testo decompilato invece dei byte, così potete trovare una stringa letterale o il nome di un metodo dentro un JAR.

Decompilare durante una ricerca nei contenuti su molti file è un’impostazione separata, disattiva per impostazione predefinita: produrre il testo può voler dire eseguire il motore una volta per classe, il che su una macchina lenta non è una cosa ragionevole da spendere per una ricerca. La finestra di ricerca principale lo chiede a parte; anche qui viene rifiutato.

Cache e limiti

I risultati vengono messi in cache, perché decompilare due volte la stessa classe è solo attesa. Nelle preferenze ci sono per quanti giorni conservare i risultati e un limite di dimensione per la cache; Svuota la cache adesso la svuota e riferisce quanto ha liberato.

Due timeout proteggono da un motore che non finisce: uno per una singola classe o tipo, uno per un intero archivio. Entrambi accettano 0, che significa «usa il valore predefinito del motore».